diff --git a/AGENTS.md b/AGENTS.md index 9ddf24378..6c9fbd797 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -775,6 +775,24 @@ should catch a mistake at PR time rather than letting it fail silently. catches the near-miss of copying `template/post.md` to `draft/.md` instead of `draft//index.md`, and leftover template placeholder text. + **`//JAVA 21+`, and NOT the 17 it declared for months.** `TITLE_EMOJI` uses + `\p{IsExtended_Pictographic}`, and Java's Unicode emoji properties -- that one + and the `\p{IsEmoji}` its comment rejects -- only arrived in JDK 21. On 17 the + pattern does not fail at the line that uses it: it throws + `PatternSyntaxException` from the static initialiser, so the whole check dies + before a single rule runs. jbang honours the `//JAVA` line, so declaring 17 + provisioned exactly the JDK that cannot compile the pattern. + + **It stayed hidden because this script only runs on a PULL REQUEST**, and + pushes to `main` go through `build-deploy.yml`, which runs + `validate/BuiltSite.java` and not this. Frank pushes most fixes straight to + `main`, so the first PR in a long while (#59) was the first thing to execute + it in CI -- passing locally the whole time on JDK 26. Reproduced and fixed + deliberately rather than by guesswork: `jbang --java 17` crashes, + `--java 21` passes. Checked the other 19 `//JAVA 17+` scripts for the same + property; none uses it, and `transfer/Posts.java`, which shares the character + class by design, already declared 21+. + This is why **`.github/PULL_REQUEST_TEMPLATE.md` is not a checklist.** It was one, unchanged since the scaffold commit, and every item had rotted: it asked for `tags` (no such taxonomy), for images under `static/images/` with absolute @@ -1458,6 +1476,123 @@ should catch a mistake at PR time rather than letting it fail silently. **Keep the substitution list in step with `images.py`** — a new renaming pass there silently reverts on the next re-scrape otherwise, and nothing reports it. + **`rewrite_in_bundle` matches WHOLE FILENAMES, and a plain `str.replace` + corrupted two posts before it did.** Its docstring used to argue the + replacement was safe because "the name is distinctive". It is not: one bundle + holds both `dummies.png` and `image-764x1024-dummies.png`, so converting the + first rewrote the SUFFIX of the second and pointed its hero at + `image-764x1024-dummies.jpg`, a file nothing ever wrote. + `add-mnemonic-bookmark.png` went the same way. **This was latent long before it + fired** — any earlier run could have hit it — and nothing reported it, because + Hugo publishes a bundle resource that no longer matches a reference without a + word. `validate/BuiltSite.java` is what caught it, and it caught it *eight + times over*: a hero is the card thumbnail on every listing page the post + appears on. The guard is a lookbehind that refuses a match preceded by another + filename character, which still matches all four reference shapes. **Audit + every local image reference after any bulk image pass** — a reference to a file + that is not there is invisible in a build log. + +- **EVERY IMAGE A POST REFERENCES IS PULLED LOCAL, whatever host serves it, and + that is a change of policy rather than a tidy-up.** `HtmlToMarkdown.localizeImages` + used to localise only foojay-hosted images, on the reasoning that a third-party + URL "keeps working after cutover". The audit says otherwise: **393 posts + reference 1710 images on 115 hosts, and 129 of them across 46 posts are dead + now** -- a broken glyph mid-article on the live site today. A host nobody here + controls is exactly the one that stops serving without telling us; hotlinking + also spends a stranger's bandwidth on every page view, leaks each reader's IP + to whoever owns the host, and puts 455 MB of pictures outside anything this + repo can measure or shrink. + + Two halves, and they agree on the filename by construction: + the scraper (so a re-scrape produces local files and nothing needs freezing) + and **`scripts/cleanup/external_images.py`**, the one-off sweep over what is + already in `content/`. + + **AN EXTERNAL IMAGE IS STORED AS `-<8 hex of its URL>.`, and the + hash is not decoration.** Third-party basenames collide constantly: **58 + bundles reference an external URL whose basename is ALREADY the name of a file + sitting in that bundle** (`lambda.gif`, `layers.png`, `banner-1.png`). Without + the hash, `Files.exists` short-circuits and the reference silently displays a + picture from a different source -- the one failure this store cannot have, + because nothing downstream would report it. With it, "the file exists" provably + means "this URL was already downloaded". A **foojay-hosted** image keeps its + bare basename exactly as before, so not one byte of what is already in + `content/` moves (verified: `twitter-362x510.png`, not a hashed name). + + Four more behaviours are load-bearing: + - **The lookup is by STEM, ignoring the extension** (`findByStem`), which does + two jobs: it finds a file `images.py` later re-encoded (`.png` -> `.jpg`) + instead of re-downloading it, and it makes a re-run free for the **221 + external URLs that carry no extension at all** -- Medium, Hashnode and Google + user-content serve images from extension-less paths, so the format is only + known from the response's `Content-Type`. Same rule as + `transfer/Authors.java`'s avatar matching, which is why 203 converted avatars + already survive a re-scrape. + - **What came back has to BE an image.** A dead third-party URL rarely 404s + cleanly -- it serves a login wall, a "post not found" page or a placeholder, + all of them HTML with a 200. Writing that as `foo.png` turns a visibly broken + image into a file that is broken for ever and *looks* localised. + - **WordPress's emoji images are restored to the CHARACTER**, not localised. + WP rewrites an emoji an author typed into `🚀`, and the alt is the + character itself -- so the original is recoverable exactly. 23 of these across + eight bundles become text instead of 23 downloaded SVGs, which is also what + this file already says a body should hold (`stripEmoji` takes emoji out of + titles only). + - **A GitHub Actions `badge.svg` stays hotlinked** (5 in `content/`): it reports + whether a build passes *now*, so a frozen copy would assert a stale CI result + for ever. That is the whole exclusion list. The 15 `mermaid.ink` diagrams ARE + localised -- 9 of them are already dead, which is the argument for it rather + than against, though the real fix there is a ```mermaid fence, which this site + renders itself. + + **The sweep shrinks BEFORE the file enters the repo, and that ordering is the + point.** The originals average 330 KB and reach 15.5 MB; 455 MB of them would + put the built site past GitHub Pages' 1 GB artifact limit, whose warning arrives + on a run that is otherwise GREEN. Downloading into `content/` and shrinking + afterwards would also leave the full-size blob in git history for ever -- and + nothing here rewrites history. So the download lands in a temp directory, is + re-encoded there with `cleanup/images.py`'s own measured rules (imported, not + re-derived), and only the result is moved in. It also finishes each bundle + before starting the next, which is `images.py`'s first hard-won lesson, and it + leaves a reference alone and REPORTS it when a fetch fails -- a 403 is a bot + wall, not proof of deletion, so those stay hotlinked rather than being rewritten + to a file that is not there. + + **DONE, all 393 posts: external image references went from 1710 to 212**, and + the 212 are the unrecoverable remainder rather than a backlog -- 44 dead + (404/400), 9 behind a bot wall (403, kept because a 403 is about the client), + 4 mermaid.ink 503s, 3 connection failures, and the 5 live CI badges. Every one + is named with its post in the script's own report. 6257 local image references + resolve; the only 3 that do not are prose EXAMPLES that never had a file + (`diagram.png` in the submit guide, `ai-generated.jpg` in a code sample). + + **THE IMPORT COST ALL THE HEADROOM, AND THAT IS THE PART TO REMEMBER.** 216 MB + of images on top of a 773 MB build is **0.99 GB** -- against a 1 GB limit whose + warning arrives on a run that is otherwise green. Three things bought it back, + in the order they were worth doing: + + 1. **48 images were being stored TWICE** (13.2 MB). The URL hash correctly + refused to reuse a same-named file, but where a bundle already held foojay's + copy of the same picture the sweep fetched the author's copy as well. They + are de-duplicated on *identical name plus identical pixel dimensions inside + one bundle* -- a strong enough signal, where the name alone was not. + 2. **`--png-min` dropped from 300 KB to 100 KB, site-wide** (Frank's call, with + before/after crops at reading size). 983 of 1263 candidate PNGs converted; + content media 798 -> 685 MB. The other 280 kept their PNG for real + transparency or because JPEG did not win by 10%. **That floor is what makes + the policy self-selecting**: a flame graph -- 58 colours, small labels, i.e. + JPEG's worst case -- was measured and DECLINED, because flat line art + genuinely compresses better as PNG. + 3. Two posts had an animated REMOTE hero. Localising made them visible to + `checkHeroImageStill`, which failed them immediately; `images.py` wrote still + posters. That check was always right and simply could not see a hotlink. + + Result: **864 MB, 136 MB of headroom.** 40 of the imported GIFs legitimately + refuse to shrink -- WebP cannot beat them by 10%, exactly as `convert_gif`'s own + comment predicts for flat-colour UI recordings where GIF's palette+LZW is + efficient. That is 28.8 MB that stays. + - **Idempotency everywhere**: any script touching `content/` must be safe to re-run without duplicating or destroying hand edits (the `frozen: true` flag pattern). This matters because these scripts get re-run repeatedly diff --git a/content/ads/foojay-sustainability-ebook/index.md b/content/ads/foojay-sustainability-ebook/index.md index 6b451d76a..9dbfba89d 100644 --- a/content/ads/foojay-sustainability-ebook/index.md +++ b/content/ads/foojay-sustainability-ebook/index.md @@ -3,7 +3,7 @@ title: "Free eBook: Sustainability for Java Developers" description: "Towards an understanding of sustainable software development, written by and for the friends of OpenJDK" link: "https://leanpub.com/sustainabilityforjavadevelopers" cta: "Get it on Leanpub" -image: "sustainability-ebook.png" +image: "sustainability-ebook.jpg" background: "#29184e" # A second button, because this banner has somewhere on foojay to send a reader diff --git a/content/ads/foojay-sustainability-ebook/sustainability-ebook.jpg b/content/ads/foojay-sustainability-ebook/sustainability-ebook.jpg new file mode 100644 index 000000000..70b925ee5 Binary files /dev/null and b/content/ads/foojay-sustainability-ebook/sustainability-ebook.jpg differ diff --git a/content/ads/foojay-sustainability-ebook/sustainability-ebook.png b/content/ads/foojay-sustainability-ebook/sustainability-ebook.png deleted file mode 100644 index a750ec33d..000000000 Binary files a/content/ads/foojay-sustainability-ebook/sustainability-ebook.png and /dev/null differ diff --git a/content/authors/aicha-laafia/_index.md b/content/authors/aicha-laafia/_index.md index f847de71b..f7e09c49f 100644 --- a/content/authors/aicha-laafia/_index.md +++ b/content/authors/aicha-laafia/_index.md @@ -1,7 +1,7 @@ --- title: "Aicha Laafia" avatar: "aicha-laafia.png" -avatarFull: "aicha-laafia-full.png" +avatarFull: "aicha-laafia-full.jpg" bio: "Java Developer ☕ | Green Tech Advocate 🌍 | WomenTechmakers Ambassador | Oracle Ace Associate | JetBrains Community Contributor | International Speaker & Writer" bluesky: "https://bsky.app/profile/aichalaafia.bsky.social" mastodon: "" diff --git a/content/authors/aicha-laafia/aicha-laafia-full.jpg b/content/authors/aicha-laafia/aicha-laafia-full.jpg new file mode 100644 index 000000000..a8ad3eb65 Binary files /dev/null and b/content/authors/aicha-laafia/aicha-laafia-full.jpg differ diff --git a/content/authors/aicha-laafia/aicha-laafia-full.png b/content/authors/aicha-laafia/aicha-laafia-full.png deleted file mode 100644 index d2f963e12..000000000 Binary files a/content/authors/aicha-laafia/aicha-laafia-full.png and /dev/null differ diff --git a/content/authors/artur-skowronski/artur-skowronski-full.jpg b/content/authors/artur-skowronski/artur-skowronski-full.jpg index bce283f87..e3a2577eb 100644 Binary files a/content/authors/artur-skowronski/artur-skowronski-full.jpg and b/content/authors/artur-skowronski/artur-skowronski-full.jpg differ diff --git a/content/authors/artur-skowronski/artur-skowronski.jpg b/content/authors/artur-skowronski/artur-skowronski.jpg index 1edd27c3d..048d32e79 100644 Binary files a/content/authors/artur-skowronski/artur-skowronski.jpg and b/content/authors/artur-skowronski/artur-skowronski.jpg differ diff --git a/content/authors/geertjan-wielenga/_index.md b/content/authors/geertjan-wielenga/_index.md index 3d0f31614..f49b01143 100644 --- a/content/authors/geertjan-wielenga/_index.md +++ b/content/authors/geertjan-wielenga/_index.md @@ -1,7 +1,7 @@ --- title: "Geertjan Wielenga" avatar: "geertjan-wielenga.png" -avatarFull: "geertjan-wielenga-full.png" +avatarFull: "geertjan-wielenga-full.jpg" bio: "Geertjan is an open source and Java enthusiast, Java Champion, Apache Member, and leader of the Amsterdam Java User Group." bluesky: "" mastodon: "" diff --git a/content/authors/geertjan-wielenga/geertjan-wielenga-full.jpg b/content/authors/geertjan-wielenga/geertjan-wielenga-full.jpg new file mode 100644 index 000000000..642fdff0f Binary files /dev/null and b/content/authors/geertjan-wielenga/geertjan-wielenga-full.jpg differ diff --git a/content/authors/geertjan-wielenga/geertjan-wielenga-full.png b/content/authors/geertjan-wielenga/geertjan-wielenga-full.png deleted file mode 100644 index 6de906bfd..000000000 Binary files a/content/authors/geertjan-wielenga/geertjan-wielenga-full.png and /dev/null differ diff --git a/content/authors/gilbert-kwan/_index.md b/content/authors/gilbert-kwan/_index.md index 6bc22b522..499402242 100644 --- a/content/authors/gilbert-kwan/_index.md +++ b/content/authors/gilbert-kwan/_index.md @@ -1,7 +1,7 @@ --- title: "Gilbert Kwan" avatar: "gilbert-kwan.png" -avatarFull: "gilbert-kwan-full.png" +avatarFull: "gilbert-kwan-full.jpg" bio: "Advisory Software Developer at IBM" bluesky: "" mastodon: "" diff --git a/content/authors/gilbert-kwan/gilbert-kwan-full.jpg b/content/authors/gilbert-kwan/gilbert-kwan-full.jpg new file mode 100644 index 000000000..d7f5fb927 Binary files /dev/null and b/content/authors/gilbert-kwan/gilbert-kwan-full.jpg differ diff --git a/content/authors/gilbert-kwan/gilbert-kwan-full.png b/content/authors/gilbert-kwan/gilbert-kwan-full.png deleted file mode 100644 index df184d41f..000000000 Binary files a/content/authors/gilbert-kwan/gilbert-kwan-full.png and /dev/null differ diff --git a/content/authors/hardiksinghbehl/_index.md b/content/authors/hardiksinghbehl/_index.md index 8bbdf27dd..4701a86cb 100644 --- a/content/authors/hardiksinghbehl/_index.md +++ b/content/authors/hardiksinghbehl/_index.md @@ -1,7 +1,7 @@ --- title: "Hardik Singh Behl" avatar: "hardiksinghbehl.png" -avatarFull: "hardiksinghbehl-full.png" +avatarFull: "hardiksinghbehl-full.jpg" bio: "Backend developer | Technical writer" bluesky: "" mastodon: "" diff --git a/content/authors/hardiksinghbehl/hardiksinghbehl-full.jpg b/content/authors/hardiksinghbehl/hardiksinghbehl-full.jpg new file mode 100644 index 000000000..909b172a5 Binary files /dev/null and b/content/authors/hardiksinghbehl/hardiksinghbehl-full.jpg differ diff --git a/content/authors/hardiksinghbehl/hardiksinghbehl-full.png b/content/authors/hardiksinghbehl/hardiksinghbehl-full.png deleted file mode 100644 index 3b1a6df4b..000000000 Binary files a/content/authors/hardiksinghbehl/hardiksinghbehl-full.png and /dev/null differ diff --git a/content/authors/hugh-murray/hugh-murray.jpg b/content/authors/hugh-murray/hugh-murray.jpg index 2fa4ecf42..ab7afe8d7 100644 Binary files a/content/authors/hugh-murray/hugh-murray.jpg and b/content/authors/hugh-murray/hugh-murray.jpg differ diff --git a/content/authors/marit-van-dijk/_index.md b/content/authors/marit-van-dijk/_index.md index c99ae7c54..a1d9d7d1c 100644 --- a/content/authors/marit-van-dijk/_index.md +++ b/content/authors/marit-van-dijk/_index.md @@ -1,7 +1,7 @@ --- title: "Marit van Dijk" avatar: "marit-van-dijk.png" -avatarFull: "marit-van-dijk-full.png" +avatarFull: "marit-van-dijk-full.jpg" bio: "Marit van Dijk is a Java Champion and Developer Advocate at JetBrains with over 20 years of software development experience. She's passionate about building great software with great people, and making developers' lives easier. Marit regularly presents at international conferences and shares her expertise through webinars, podcasts, blog posts, videos, and tutorials. She's also a contributor to the book \"97 Things Every Java Programmer Should Know\" (O’Reilly Media)." bluesky: "https://bsky.app/profile/maritvandijk.bsky.social" mastodon: "https://mastodon.social/@maritvandijk" diff --git a/content/authors/marit-van-dijk/marit-van-dijk-full.jpg b/content/authors/marit-van-dijk/marit-van-dijk-full.jpg new file mode 100644 index 000000000..c100d4f8d Binary files /dev/null and b/content/authors/marit-van-dijk/marit-van-dijk-full.jpg differ diff --git a/content/authors/marit-van-dijk/marit-van-dijk-full.png b/content/authors/marit-van-dijk/marit-van-dijk-full.png deleted file mode 100644 index d23514392..000000000 Binary files a/content/authors/marit-van-dijk/marit-van-dijk-full.png and /dev/null differ diff --git a/content/authors/mohibul-chowdhury/_index.md b/content/authors/mohibul-chowdhury/_index.md index 07865adb8..5e3315173 100644 --- a/content/authors/mohibul-chowdhury/_index.md +++ b/content/authors/mohibul-chowdhury/_index.md @@ -1,7 +1,7 @@ --- title: "Mohibul Hassan Chowdhury" avatar: "mohibul-chowdhury.png" -avatarFull: "mohibul-chowdhury-full.png" +avatarFull: "mohibul-chowdhury-full.jpg" bio: "Software Engineer. Aiming to become Software Craftsman. Java | Spring boot | Javascript | VueJS | NuxtJS | MySQL An AI enthusiast. Avid self learner." bluesky: "" mastodon: "" diff --git a/content/authors/mohibul-chowdhury/mohibul-chowdhury-full.jpg b/content/authors/mohibul-chowdhury/mohibul-chowdhury-full.jpg new file mode 100644 index 000000000..5c85e1444 Binary files /dev/null and b/content/authors/mohibul-chowdhury/mohibul-chowdhury-full.jpg differ diff --git a/content/authors/mohibul-chowdhury/mohibul-chowdhury-full.png b/content/authors/mohibul-chowdhury/mohibul-chowdhury-full.png deleted file mode 100644 index b1ddc96a8..000000000 Binary files a/content/authors/mohibul-chowdhury/mohibul-chowdhury-full.png and /dev/null differ diff --git a/content/authors/nataliia/_index.md b/content/authors/nataliia/_index.md index 9cc47e2d2..0e374a5e8 100644 --- a/content/authors/nataliia/_index.md +++ b/content/authors/nataliia/_index.md @@ -1,7 +1,7 @@ --- title: "Nataliia Dziubenko" avatar: "nataliia.png" -avatarFull: "nataliia-full.png" +avatarFull: "nataliia-full.jpg" bio: "Senior Software Engineer at Azul" bluesky: "" mastodon: "" diff --git a/content/authors/nataliia/nataliia-full.jpg b/content/authors/nataliia/nataliia-full.jpg new file mode 100644 index 000000000..3a28a66ca Binary files /dev/null and b/content/authors/nataliia/nataliia-full.jpg differ diff --git a/content/authors/nataliia/nataliia-full.png b/content/authors/nataliia/nataliia-full.png deleted file mode 100644 index 650704d16..000000000 Binary files a/content/authors/nataliia/nataliia-full.png and /dev/null differ diff --git a/content/authors/scott-sellers/_index.md b/content/authors/scott-sellers/_index.md index 196c10a95..0b78bfb09 100644 --- a/content/authors/scott-sellers/_index.md +++ b/content/authors/scott-sellers/_index.md @@ -1,7 +1,7 @@ --- title: "Scott Sellers" avatar: "scott-sellers.png" -avatarFull: "scott-sellers-full.png" +avatarFull: "scott-sellers-full.jpg" bio: "President & CEO at Azul Systems, with more than 30 years of leading high-technology companies. Before Azul, Scott co-founded 3dfx Interactive, helping pioneer 3D graphics for PCs and game consoles. After 3dfx’s IPO, the company was later acquired by NVIDIA." bluesky: "" mastodon: "" diff --git a/content/authors/scott-sellers/scott-sellers-full.jpg b/content/authors/scott-sellers/scott-sellers-full.jpg new file mode 100644 index 000000000..af83204d3 Binary files /dev/null and b/content/authors/scott-sellers/scott-sellers-full.jpg differ diff --git a/content/authors/scott-sellers/scott-sellers-full.png b/content/authors/scott-sellers/scott-sellers-full.png deleted file mode 100644 index bf04d9ca3..000000000 Binary files a/content/authors/scott-sellers/scott-sellers-full.png and /dev/null differ diff --git a/content/authors/wei-lin/_index.md b/content/authors/wei-lin/_index.md index 9df7eeb7c..ca5409864 100644 --- a/content/authors/wei-lin/_index.md +++ b/content/authors/wei-lin/_index.md @@ -1,7 +1,7 @@ --- title: "Wei Lin" avatar: "wei-lin.png" -avatarFull: "wei-lin-full.png" +avatarFull: "wei-lin-full.jpg" bio: "Wei Lin is an ed-tech entrepreneur. He has been teaching Java to students of various ages and backgrounds, and decided that interactive autograded labs are the best way to learn programming." bluesky: "" mastodon: "" diff --git a/content/authors/wei-lin/wei-lin-full.jpg b/content/authors/wei-lin/wei-lin-full.jpg new file mode 100644 index 000000000..b3ff53ba0 Binary files /dev/null and b/content/authors/wei-lin/wei-lin-full.jpg differ diff --git a/content/authors/wei-lin/wei-lin-full.png b/content/authors/wei-lin/wei-lin-full.png deleted file mode 100644 index eaa1eef05..000000000 Binary files a/content/authors/wei-lin/wei-lin-full.png and /dev/null differ diff --git a/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-20-at-17.19.43-1024x647.jpg b/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-20-at-17.19.43-1024x647.jpg new file mode 100644 index 000000000..c7735723c Binary files /dev/null and b/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-20-at-17.19.43-1024x647.jpg differ diff --git a/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-20-at-17.19.43-1024x647.png b/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-20-at-17.19.43-1024x647.png deleted file mode 100644 index 84bfc1a34..000000000 Binary files a/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-20-at-17.19.43-1024x647.png and /dev/null differ diff --git a/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-20-at-17.23.09-1024x639.jpg b/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-20-at-17.23.09-1024x639.jpg new file mode 100644 index 000000000..240f10b0e Binary files /dev/null and b/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-20-at-17.23.09-1024x639.jpg differ diff --git a/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-20-at-17.23.09-1024x639.png b/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-20-at-17.23.09-1024x639.png deleted file mode 100644 index 1025c51c2..000000000 Binary files a/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-20-at-17.23.09-1024x639.png and /dev/null differ diff --git a/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-21-at-09.18.59-1024x633.jpg b/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-21-at-09.18.59-1024x633.jpg new file mode 100644 index 000000000..bc515cb4c Binary files /dev/null and b/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-21-at-09.18.59-1024x633.jpg differ diff --git a/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-21-at-09.18.59-1024x633.png b/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-21-at-09.18.59-1024x633.png deleted file mode 100644 index 4128c0e42..000000000 Binary files a/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/Screenshot-2020-08-21-at-09.18.59-1024x633.png and /dev/null differ diff --git a/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/index.md b/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/index.md index 545cb5bcb..ac45d0008 100644 --- a/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/index.md +++ b/content/posts/2020/04/25/foojay-a-place-for-friends-of-openjdk/index.md @@ -24,7 +24,7 @@ Welcome to foojay, a place for **f** riends **o** f **O** pen**J** DK, sponsored #### Java Technologist Dashboards Together with Java enthusiasts around the world, the foojay team works to identify critical aspects of each new OpenJDK release and update -- with related information such as OpenJDK distributions, download locations, and JVM command line arguments -- and brings to the fore precisely the content and services that have value and relevance to those that use Java on a daily basis throughout the industry. -![](Screenshot-2020-08-20-at-17.19.43-1024x647.png) OpenJDK Update Release Details +![](Screenshot-2020-08-20-at-17.19.43-1024x647.jpg) OpenJDK Update Release Details [Go here to see all the fixes and CVEs of the recent OpenJDK update releases](https://javaalmanac.io/jdk/8/), while indicating their relevance to you by voting on them. Use the Highlights tab to see what the community as a whole thinks about them. More details on the motivations for the OpenJDK update release details dashboard [are described here on foojay](https://foojay.io/today/dashboard-for-openjdk-update-release-details/). @@ -33,7 +33,7 @@ Together with Java enthusiasts around the world, the foojay team works to identi A key contributor to foojay is [Marc Hoffmann](https://twitter.com/marcandsweep). On his [javaalmanac.io](http://javaalmanac.io), he presents extensive data on each Java release, with details on distributions, new features, and API differences between releases. That information he's also made available here on foojay, where it is known as the Java Version Almanac, consisting of a set of dashboards with detailed information on each version of Java: -![](Screenshot-2020-08-21-at-09.18.59-1024x633.png) +![](Screenshot-2020-08-21-at-09.18.59-1024x633.jpg) Take special note at the lower end of each page of the almanac, where you'll find details on the differences between the APIs of the currently selected Java version compared to all previous Java versions: ![](Screenshot-2020-08-21-at-09.19.51-1024x525.png) @@ -45,7 +45,7 @@ Take special note at the lower end of each page of the almanac, where you'll fin Another key contributor to foojay is [Chris Newland](https://twitter.com/chriswhocodes), who's gathered extensive data sets on JVM command line arguments, which he hosts on his own [chriswhocodes.com](http://chriswhocodes.com). At the same time, he's also been making his data available here as part of the integrated Java dashboard environment that is foojay: -![](Screenshot-2020-08-20-at-17.23.09-1024x639.png) OpenJDK Command Line Arguments +![](Screenshot-2020-08-20-at-17.23.09-1024x639.jpg) OpenJDK Command Line Arguments [Go here to explore the wealth of JVM command line arguments](https://chriswhocodes.com/hotspot_options_openjdk11.html), with thanks to Chris. diff --git a/content/posts/2020/05/01/dashboard-for-openjdk-update-release-details/Screenshot-2020-08-20-at-17.19.43-1-1024x647.jpg b/content/posts/2020/05/01/dashboard-for-openjdk-update-release-details/Screenshot-2020-08-20-at-17.19.43-1-1024x647.jpg new file mode 100644 index 000000000..c7735723c Binary files /dev/null and b/content/posts/2020/05/01/dashboard-for-openjdk-update-release-details/Screenshot-2020-08-20-at-17.19.43-1-1024x647.jpg differ diff --git a/content/posts/2020/05/01/dashboard-for-openjdk-update-release-details/Screenshot-2020-08-20-at-17.19.43-1-1024x647.png b/content/posts/2020/05/01/dashboard-for-openjdk-update-release-details/Screenshot-2020-08-20-at-17.19.43-1-1024x647.png deleted file mode 100644 index 84bfc1a34..000000000 Binary files a/content/posts/2020/05/01/dashboard-for-openjdk-update-release-details/Screenshot-2020-08-20-at-17.19.43-1-1024x647.png and /dev/null differ diff --git a/content/posts/2020/05/01/dashboard-for-openjdk-update-release-details/index.md b/content/posts/2020/05/01/dashboard-for-openjdk-update-release-details/index.md index 6ef1489ec..c44a128a7 100644 --- a/content/posts/2020/05/01/dashboard-for-openjdk-update-release-details/index.md +++ b/content/posts/2020/05/01/dashboard-for-openjdk-update-release-details/index.md @@ -5,7 +5,7 @@ lastmod: "2021-08-23T12:15:26+00:00" description: "Foojay is a one stop solution for everything related to Java. The Dashboard offers analysis, highlights, and categorized lists of updates by Java users." authors: - "geertjan-wielenga" -image: "Screenshot-2020-08-20-at-17.19.43-1-1024x647.png" +image: "Screenshot-2020-08-20-at-17.19.43-1-1024x647.jpg" categories: - "Release Notes" related_posts: @@ -41,7 +41,7 @@ A great example of this difference in perspective can be found in [JDK-8146115]( Going forward, a clearer perspective of what changes a Java update contains is now provided at [foojay.io](https://foojay.io/). Foojay's user-focused Java and OpenJDK update descriptions offer a dashboard with updated analysis, selected highlights, and categorized lists of updates arranged for consumption by Java users. Working together with Java enthusiasts around the world, the foojay team works to identify critical aspects of each new OpenJDK update when it is released and bring to the fore precisely the issues that have value and relevance to those that use Java throughout the industry. -![](Screenshot-2020-08-20-at-17.19.43-1-1024x647.png) +![](Screenshot-2020-08-20-at-17.19.43-1-1024x647.jpg) For example, in the April 2020 update, foojay chose to highlight two P4 issues that might otherwise not be given the prominence they deserve and be lost in the noise: diff --git a/content/posts/2020/07/31/from-azure-active-directory-via-openid-connect-to-open-liberty-and-java/dzone-com-afac1be9.png b/content/posts/2020/07/31/from-azure-active-directory-via-openid-connect-to-open-liberty-and-java/dzone-com-afac1be9.png new file mode 100644 index 000000000..884a94b3e Binary files /dev/null and b/content/posts/2020/07/31/from-azure-active-directory-via-openid-connect-to-open-liberty-and-java/dzone-com-afac1be9.png differ diff --git a/content/posts/2020/07/31/from-azure-active-directory-via-openid-connect-to-open-liberty-and-java/index.md b/content/posts/2020/07/31/from-azure-active-directory-via-openid-connect-to-open-liberty-and-java/index.md index 68eba19f2..1f57b326e 100644 --- a/content/posts/2020/07/31/from-azure-active-directory-via-openid-connect-to-open-liberty-and-java/index.md +++ b/content/posts/2020/07/31/from-azure-active-directory-via-openid-connect-to-open-liberty-and-java/index.md @@ -5,7 +5,7 @@ lastmod: "2021-08-23T12:30:34+00:00" description: "Let's look at an example of how to configure the Liberty social login feature as OpenID Connect client to secure Java apps with Azure Active Directory." authors: - "m-reza-rahman" -image: "https://dzone.com/storage/temp/13800230-1596136325278.png" +image: "dzone-com-afac1be9.png" categories: - "Azure" related_posts: @@ -100,7 +100,7 @@ The relevant configuration in `web.xml`: ``` This is just standard Java EE security. The authentication and authorization workflow is shown in the following diagram. -![](https://dzone.com/storage/temp/13800230-1596136325278.png) +![](dzone-com-afac1be9.png) *Picture 1: OpenID Connect sign-in and token acquisition flow, from* [*Microsoft identity platform and OpenID Connect protocol*](https://docs.microsoft.com/azure/active-directory/develop/v2-protocols-oidc#protocol-diagram-access-token-acquisition) diff --git a/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/compiled-classes-5076aa43.png b/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/compiled-classes-5076aa43.png new file mode 100644 index 000000000..b5bf94872 Binary files /dev/null and b/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/compiled-classes-5076aa43.png differ diff --git a/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/download-zulu-builds-of-openjdk-a79c0093.png b/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/download-zulu-builds-of-openjdk-a79c0093.png new file mode 100644 index 000000000..58f110b15 Binary files /dev/null and b/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/download-zulu-builds-of-openjdk-a79c0093.png differ diff --git a/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/helloworld.java_-31cfb833.png b/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/helloworld.java_-31cfb833.png new file mode 100644 index 000000000..90f0e2579 Binary files /dev/null and b/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/helloworld.java_-31cfb833.png differ diff --git a/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/index.md b/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/index.md index 52a4d6ef4..8a4879b9f 100644 --- a/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/index.md +++ b/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -{{< img src="https://carlfx.files.wordpress.com/2020/08/duke_azul_jfx_shirt.png?w=174" class="alignleft is-resized" alt="Duke's shirt with Azul and JavaFX." width="174" height="313" >}} +{{< img src="duke_azul_jfx_shirt.png" class="alignleft is-resized" alt="Duke's shirt with Azul and JavaFX." width="174" height="313" >}} Most Java developers probably know by now that [Oracle](https://www.oracle.com/) has open sourced the Java JDK and hosted its source code on [Github](https://github.com/openjdk) (aka [Project Skara](https://openjdk.java.net/projects/skara/)). @@ -42,7 +42,7 @@ Before we start the stopwatch (60 seconds), let's install the ZuluFX distributio [Azul](https://www.azul.com/downloads/zulu-community) creates a free and user-friendly distribution of the JDK bundled with JavaFX. Azul provides a simple user interface shown in figure 1 that allows you to pick and choose an appropriate version of the JDK and JavaFX in one compressed file to be downloaded. To get paid commercial Java support check out Azul's [support](https://www.azul.com/products/zulu-enterprise/) subscriptions. -{{< img src="https://carlfx.files.wordpress.com/2020/08/download-zulu-builds-of-openjdk.png?w=1024" class="is-resized" alt="Azul System's Download of OpenJDK" width="668" height="327" caption="Figure 1. https://www.azul.com/downloads/zulu-community" >}} +{{< img src="download-zulu-builds-of-openjdk-a79c0093.png" class="is-resized" alt="Azul System's Download of OpenJDK" width="668" height="327" caption="Figure 1. https://www.azul.com/downloads/zulu-community" >}} Download **ZuluFX** (JDK \& JavaFX bundle) from: [https://www.azul.com/downloads/zulu-community](https://www.azul.com/downloads/zulu-community/?package=jdk-fx) @@ -136,7 +136,7 @@ mkdir src/com.mycompany.helloworld ``` ***Step 3:*** Create the directory structure **com/mycompany/helloworld** that follows a package namespaces for ***`HelloWorld.java`*** -![](https://carlfx.files.wordpress.com/2020/08/project_directories.png?w=285) Figure 2. Project Directory structure for HelloWorld.java file. +![](project_directories-89c468ff.png) Figure 2. Project Directory structure for HelloWorld.java file. Under the directory **com.mycompany.helloworld** you will create the following directory structure **com/mycompany/helloworld**. This directory will later contain the **Helloworld.java** file created in Step 5. @@ -174,7 +174,7 @@ The **exports** keyword exposes the **com.mycompany.helloworld** module to the r The file will be created in the directory **src/com.mycompany.helloworld/com/mycompany/helloworld** as shown in figure 4 below. -{{< img src="https://carlfx.files.wordpress.com/2020/08/helloworld.java_.png?w=279" class="is-resized" width="428" height="267" caption="Figure 4. HelloWorld.java application file" >}} +{{< img src="helloworld.java_-31cfb833.png" class="is-resized" width="428" height="267" caption="Figure 4. HelloWorld.java application file" >}} Use **[vim](https://www.vim.org/)** for those who despise those other wimpy editors 😉 @@ -237,7 +237,7 @@ javac -d mods/com.mycompany.helloworld src/com.mycompany.helloworld/module-info. After compiling your code the class files the mods directory should look like the following: -{{< img src="https://carlfx.files.wordpress.com/2020/08/compiled-classes.png?w=310" class="is-resized" width="374" height="366" caption="Figure 5. Compiled classes in the mods directory." >}} +{{< img src="compiled-classes-5076aa43.png" class="is-resized" width="374" height="366" caption="Figure 5. Compiled classes in the mods directory." >}} ***Step 7:***Execute the JavaFX HelloWorld application! @@ -249,7 +249,7 @@ java --module-path mods -m com.mycompany.helloworld/com.mycompany.helloworld.Hel The following is the output of the previous command: -{{< img src="https://carlfx.files.wordpress.com/2016/04/screen-shot-2016-04-26-at-1-42-13-am.png?w=625" class="is-resized" alt="Output of a JavaFX Hello World Application" width="333" height="302" caption="Figure 6. The output of a JavaFX Hello World application." >}} +{{< img src="screen-shot-2016-04-26-at-1-42-13-am-aca06d98.png" class="is-resized" alt="Output of a JavaFX Hello World Application" width="333" height="302" caption="Figure 6. The output of a JavaFX Hello World application." >}} ## Conclusion diff --git a/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/project_directories-89c468ff.png b/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/project_directories-89c468ff.png new file mode 100644 index 000000000..4e5c4dabe Binary files /dev/null and b/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/project_directories-89c468ff.png differ diff --git a/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/screen-shot-2016-04-26-at-1-42-13-am-aca06d98.png b/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/screen-shot-2016-04-26-at-1-42-13-am-aca06d98.png new file mode 100644 index 000000000..e47a67196 Binary files /dev/null and b/content/posts/2020/08/23/a-javafx-app-on-zulufx-in-60-seconds/screen-shot-2016-04-26-at-1-42-13-am-aca06d98.png differ diff --git a/content/posts/2020/08/25/interview-java-version-almanac/Screenshot-2020-08-25-at-08.35.09-1024x559.jpg b/content/posts/2020/08/25/interview-java-version-almanac/Screenshot-2020-08-25-at-08.35.09-1024x559.jpg new file mode 100644 index 000000000..419fbd21d Binary files /dev/null and b/content/posts/2020/08/25/interview-java-version-almanac/Screenshot-2020-08-25-at-08.35.09-1024x559.jpg differ diff --git a/content/posts/2020/08/25/interview-java-version-almanac/Screenshot-2020-08-25-at-08.35.09-1024x559.png b/content/posts/2020/08/25/interview-java-version-almanac/Screenshot-2020-08-25-at-08.35.09-1024x559.png deleted file mode 100644 index 878774de6..000000000 Binary files a/content/posts/2020/08/25/interview-java-version-almanac/Screenshot-2020-08-25-at-08.35.09-1024x559.png and /dev/null differ diff --git a/content/posts/2020/08/25/interview-java-version-almanac/index.md b/content/posts/2020/08/25/interview-java-version-almanac/index.md index 1c028874b..85febcc9b 100644 --- a/content/posts/2020/08/25/interview-java-version-almanac/index.md +++ b/content/posts/2020/08/25/interview-java-version-almanac/index.md @@ -5,7 +5,7 @@ lastmod: "2020-09-01T14:07:55+00:00" description: "The Java Version Almanac provides details per release on OpenJDK distributions, new features, and differences between APIs across releases." authors: - "geertjan-wielenga" -image: "Screenshot-2020-08-25-at-08.35.09-1024x559.png" +image: "Screenshot-2020-08-25-at-08.35.09-1024x559.jpg" categories: - "Interviews" related_posts: @@ -13,7 +13,7 @@ frozen: true --- From this week, we're happy to announce that we're hosting Marc Hoffmann's [Java Version Almanac](http://javaalmanac.io) [right here on foojay](https://javaalmanac.io/jdk/8/), providing details per release on OpenJDK distributions, new features, and differences between APIs across releases. -![](Screenshot-2020-08-25-at-08.35.09-1024x559.png) +![](Screenshot-2020-08-25-at-08.35.09-1024x559.jpg) {{< legacy-notice >}} diff --git a/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/index.md b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/index.md index 026d86f96..f497be788 100644 --- a/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/index.md +++ b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/index.md @@ -6,7 +6,7 @@ description: "Let's explore how custom, application-specific JFR events are used canonical: "https://www.morling.dev/blog/rest-api-monitoring-with-custom-jdk-flight-recorder-events" authors: - "gunnarmorling" -image: "https://www.morling.dev/images/jfr_todo_app.png" +image: "jfr_todo_app-9c0ce0ec.png" categories: - "JDK Flight Recorder" - "Performance" @@ -202,15 +202,15 @@ This builds the project using Maven and spins up the following services using Do * *prometheus* and *grafana*: For monitoring live events later on Then go to , where you should see the Todo web application: -![jfr todo app](https://www.morling.dev/images/jfr_todo_app.png) +![jfr todo app](jfr_todo_app-9c0ce0ec.png) Now fire up Mission Control. The example service run via Docker Compose is configured so you can connect to it on localhost. In the JVM Browser, create a new connection with host "localhost" and port "1898". Hit "Test connection", which should yield "OK", then click "Finish". -![jfr new connection](https://www.morling.dev/images/jfr_new_connection.png) +![jfr new connection](jfr_new_connection-36ad3dc7.png) Create a new recording by expanding the localhost:1898 node in the JVM Explorer, right-clicking on "Flight Recorder" and choosing "Start Flight Recording…​". Confirm the default settings, which will create a recording with a duration of one minute. Go back to the Todo web application and perform a few tasks like creating some new todos, editing and deleting them, or filtering the todo list. Either wait for the recording to complete or stop it by right-clicking on the recording name and selecting "Stop". Once the recording is done, it will be opened automatically. Now you could dive into all the logged events for the OS, the JVM etc, but as we're interested in our custom JAX-RS events, Choose "Event Browser" in the outline view and expand the "JAX-RS" category. You will see the events for all your REST API invocations, including information such as duration of the request, the HTTP method, the resource path and much more: -![jfr jax rs events](https://www.morling.dev/images/jfr_jax_rs_events.png) +![jfr jax rs events](jfr_jax_rs_events-bf49fb73.png) In a real-world use case, you could now use this information for instance to identify long-running requests and correlate these events with other data points in the Flight Recording, such as method profiling and memory allocation data, or sub-optimal SQL statements in your database. @@ -295,21 +295,21 @@ This method will be invoked by the JFR runtime during the `shouldCommit()` call. We also could use such setting to control the inclusion or exclusion of specific event attributes. For that, the setting definition method would always have to return `true`, but depending on the actual setting it might set particular attributes of the event class to `null`. For instance this might come in handy if we wanted to log the entire request/response body of our REST API. Doing this all the time might be prohibitive in terms of recording size, but it might be enabled for a particlar short-term recording for analyzing some bug. Now let's see how the path filter can be applied when creating a new recording in Mission Control. The option is a bit hidden, but here's how you can enable it. First, create a new Flight Recording, then choose "Template Manager" in the dialogue: -![jfr filtering 1](https://www.morling.dev/images/jfr_filtering_1.png) +![jfr filtering 1](jfr_filtering_1-eb444c74.png) Duplicate the "Continuous" template and edit it: -![jfr filtering 2](https://www.morling.dev/images/jfr_filtering_2.png) +![jfr filtering 2](jfr_filtering_2-d5142e75.png) Click "Advanced": -![jfr filtering 3](https://www.morling.dev/images/jfr_filtering_3.png) +![jfr filtering 3](jfr_filtering_3-16712514.png) Expand "JAX-RS" → "JAX-RS Invocation" and put `.*(new|edit).*` into the Path Filter control: -![jfr filtering 4](https://www.morling.dev/images/jfr_filtering_4.png) +![jfr filtering 4](jfr_filtering_4-43fb0b6b.png) Now close the last two dialogues. In the "Start Flight Recording" dialogue make sure to select your new template under "Event Settings"; although you've edited it before, it won't be selected automatically. I lost an hour or so wondering why my settings were not applied…​ . Lastly, click "Finish" to begin the recording: -![jfr filtering 5](https://www.morling.dev/images/jfr_filtering_5.png) +![jfr filtering 5](jfr_filtering_5-0bdb887d.png) Perform some tasks in the Todo web app and stop the recording. You should see only the REST API calls for the new and edit operations, whereas no events should be shown for the list and delete operations of the API. @@ -400,12 +400,12 @@ MicroProfile Metrics exposes any application-provided metrics in the Prometheus * total invocation count * duration of 75th, 95th, 99th etc. percentiles -![jfr metrics endpoint](https://www.morling.dev/images/jfr_metrics_endpoint.png) +![jfr metrics endpoint](jfr_metrics_endpoint-b81ff18d.png) Once the endpoint is provided, it's not difficult to set up a scraping process for ingesting the metrics into the [Prometheus](https://prometheus.io/) time-series database. You can find the required [Prometheus configuration](https://github.com/gunnarmorling/jfr-custom-events/blob/master/prometheus.yml) in the accompanying source code repository. While Prometheus provides some visualization capabilities itself, it is often used together with [Grafana](https://grafana.com/), which allows to build nicely looking dashboards via a rather intuitive UI. Here's an example dashboard showing the duration and invocation numbers for the different methods in the Todo REST API: -![jfr grafana](https://www.morling.dev/images/jfr_grafana.png) +![jfr grafana](jfr_grafana-f134b719.png) Again you can find the complete configuration for Grafana including the [definition of that dashboard](https://github.com/gunnarmorling/jfr-custom-events/blob/master/grafana-todo-dashboard.json) in the example repo. It will automatically be loaded when using the Docker Compose set-up shown above. Based on that you could easily expand the dashboard for other metrics and set up alerts, too. diff --git a/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_filtering_1-eb444c74.png b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_filtering_1-eb444c74.png new file mode 100644 index 000000000..a3f58aec1 Binary files /dev/null and b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_filtering_1-eb444c74.png differ diff --git a/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_filtering_2-d5142e75.png b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_filtering_2-d5142e75.png new file mode 100644 index 000000000..c05e9ce4d Binary files /dev/null and b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_filtering_2-d5142e75.png differ diff --git a/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_filtering_3-16712514.png b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_filtering_3-16712514.png new file mode 100644 index 000000000..cffdc486b Binary files /dev/null and b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_filtering_3-16712514.png differ diff --git a/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_filtering_4-43fb0b6b.png b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_filtering_4-43fb0b6b.png new file mode 100644 index 000000000..df0e6ce89 Binary files /dev/null and b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_filtering_4-43fb0b6b.png differ diff --git a/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_filtering_5-0bdb887d.png b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_filtering_5-0bdb887d.png new file mode 100644 index 000000000..9384a3baa Binary files /dev/null and b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_filtering_5-0bdb887d.png differ diff --git a/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_grafana-f134b719.png b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_grafana-f134b719.png new file mode 100644 index 000000000..221c8753a Binary files /dev/null and b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_grafana-f134b719.png differ diff --git a/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_jax_rs_events-bf49fb73.png b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_jax_rs_events-bf49fb73.png new file mode 100644 index 000000000..a3e51d262 Binary files /dev/null and b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_jax_rs_events-bf49fb73.png differ diff --git a/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_metrics_endpoint-b81ff18d.png b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_metrics_endpoint-b81ff18d.png new file mode 100644 index 000000000..e71b70618 Binary files /dev/null and b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_metrics_endpoint-b81ff18d.png differ diff --git a/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_new_connection-36ad3dc7.png b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_new_connection-36ad3dc7.png new file mode 100644 index 000000000..efd3f047d Binary files /dev/null and b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_new_connection-36ad3dc7.png differ diff --git a/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_todo_app-9c0ce0ec.png b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_todo_app-9c0ce0ec.png new file mode 100644 index 000000000..e2bd22995 Binary files /dev/null and b/content/posts/2020/08/26/monitoring-rest-apis-with-custom-flight-recorder-events/jfr_todo_app-9c0ce0ec.png differ diff --git a/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.24.23-1024x320.jpg b/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.24.23-1024x320.jpg new file mode 100644 index 000000000..5d55b4e17 Binary files /dev/null and b/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.24.23-1024x320.jpg differ diff --git a/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.24.23-1024x320.png b/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.24.23-1024x320.png deleted file mode 100644 index d0bb57fc5..000000000 Binary files a/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.24.23-1024x320.png and /dev/null differ diff --git a/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.25.43-1024x300.jpg b/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.25.43-1024x300.jpg new file mode 100644 index 000000000..0d2307999 Binary files /dev/null and b/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.25.43-1024x300.jpg differ diff --git a/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.25.43-1024x300.png b/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.25.43-1024x300.png deleted file mode 100644 index 8d33c1daf..000000000 Binary files a/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.25.43-1024x300.png and /dev/null differ diff --git a/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.26.48-1024x306.jpg b/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.26.48-1024x306.jpg new file mode 100644 index 000000000..2e1921021 Binary files /dev/null and b/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.26.48-1024x306.jpg differ diff --git a/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.26.48-1024x306.png b/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.26.48-1024x306.png deleted file mode 100644 index 0e21b0365..000000000 Binary files a/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/Screenshot-2020-08-26-at-22.26.48-1024x306.png and /dev/null differ diff --git a/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/index.md b/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/index.md index ac3d60237..978849c46 100644 --- a/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/index.md +++ b/content/posts/2020/08/27/performance-stream-concat-vs-new-arraylist/index.md @@ -142,7 +142,7 @@ To reduce the likelihood of stumbling over a coincidence or a measuring error, I * [The detailed measurement result](https://github.com/khmarbaise/performance-concat/blob/52480c0648a97e89d0e5007db01212baf7c80536/docs/result-ii.text) The `getElements()` results always in 49 elements whereas the number of `FancyStuff` elements varies (see `count`). The following result shows that the version with `stream_concat` is always faster. -![](Screenshot-2020-08-26-at-22.24.23-1024x320.png) +![](Screenshot-2020-08-26-at-22.24.23-1024x320.jpg) Interestingly, this is not only the case for larger number of elements. It is also for a small number of elements the case. @@ -154,7 +154,7 @@ So, finally, I ran all solutions (1+2+3+4) with different numbers (count, elemen * [The Code](https://github.com/khmarbaise/performance-concat/blob/e5dd257660a93670b203016fddb9a3ac2975f399/src/main/java/com/soebes/performance/streams/BenchmarkStreamConcat.java) I just picked up some examples of the measured times here: -![](Screenshot-2020-08-26-at-22.25.43-1024x300.png) +![](Screenshot-2020-08-26-at-22.25.43-1024x300.jpg) #### Another run @@ -163,7 +163,7 @@ So I ran also a solution with all possible options im JMH which took very long ( * [The detailed measurement result](https://raw.githubusercontent.com/khmarbaise/performance-concat/master/docs/result-v.text) So I will pick up some examples of the measured times here: -![](Screenshot-2020-08-26-at-22.26.48-1024x306.png) +![](Screenshot-2020-08-26-at-22.26.48-1024x306.jpg) So finally the question comes — what do the numbers actually mean? diff --git a/content/posts/2020/08/31/interview-java-command-line-switches/Screenshot-2020-08-29-at-23.09.05-1024x514.jpg b/content/posts/2020/08/31/interview-java-command-line-switches/Screenshot-2020-08-29-at-23.09.05-1024x514.jpg new file mode 100644 index 000000000..5fa5c877d Binary files /dev/null and b/content/posts/2020/08/31/interview-java-command-line-switches/Screenshot-2020-08-29-at-23.09.05-1024x514.jpg differ diff --git a/content/posts/2020/08/31/interview-java-command-line-switches/Screenshot-2020-08-29-at-23.09.05-1024x514.png b/content/posts/2020/08/31/interview-java-command-line-switches/Screenshot-2020-08-29-at-23.09.05-1024x514.png deleted file mode 100644 index fd2e5bd76..000000000 Binary files a/content/posts/2020/08/31/interview-java-command-line-switches/Screenshot-2020-08-29-at-23.09.05-1024x514.png and /dev/null differ diff --git a/content/posts/2020/08/31/interview-java-command-line-switches/index.md b/content/posts/2020/08/31/interview-java-command-line-switches/index.md index 1c1b6f8e3..fd396b63a 100644 --- a/content/posts/2020/08/31/interview-java-command-line-switches/index.md +++ b/content/posts/2020/08/31/interview-java-command-line-switches/index.md @@ -5,7 +5,7 @@ lastmod: "2020-09-03T09:44:46+00:00" description: "We're happy to announce that we’re hosting Chris Newland’s VMOptionsExplorer on foojay, providing all details per release on Java command line switches." authors: - "geertjan-wielenga" -image: "Screenshot-2020-08-29-at-23.09.05-1024x514.png" +image: "Screenshot-2020-08-29-at-23.09.05-1024x514.jpg" categories: - "Interviews" related_posts: @@ -13,7 +13,7 @@ frozen: true --- We're happy to announce that we're hosting Chris Newland's [VMOptionsExplorer](http://javaalmanac.io) [right here on foojay](https://javaalmanac.io/jdk/8/), providing all details per release on Java command line switches. -![](Screenshot-2020-08-29-at-23.09.05-1024x514.png) +![](Screenshot-2020-08-29-at-23.09.05-1024x514.jpg) {{< legacy-notice >}} diff --git a/content/posts/2020/09/03/introducing-jmfrx-a-bridge-from-jmx-to-java-flight-recorder/index.md b/content/posts/2020/09/03/introducing-jmfrx-a-bridge-from-jmx-to-java-flight-recorder/index.md index c00f92740..80212f736 100644 --- a/content/posts/2020/09/03/introducing-jmfrx-a-bridge-from-jmx-to-java-flight-recorder/index.md +++ b/content/posts/2020/09/03/introducing-jmfrx-a-bridge-from-jmx-to-java-flight-recorder/index.md @@ -6,7 +6,7 @@ description: "Announcement of a new open-source utility: JmFrX, a tool for captu canonical: "https://www.morling.dev/blog/introducing-jmfrx-a-bridge-from-jmx-to-jdk-flight-recorder" authors: - "gunnarmorling" -image: "https://www.morling.dev/images/jmfrx_mission_control_configuration.png" +image: "jmfrx_mission_control_configuration-53a5a33a.png" categories: - "JDK Flight Recorder" - "Performance" @@ -91,19 +91,19 @@ Now start your application and create a JFR configuration file which enables the * Expand the *JMX* and *JMX Dump* nodes * Make sure the *JMX Dump* event type is *Enabled* ; choose a period for dumping the chosen JMX MBeans (by default 60 s) and specify the MBeans whose data should be captured; that's done by means of a regular expression, which matches one or more JMX object names, for instance `.*OperatingSystem.*`: -![Configuring JmFrX in JMC](https://www.morling.dev/images/jmfrx_mission_control_configuration.png) +![Configuring JmFrX in JMC](jmfrx_mission_control_configuration-53a5a33a.png) * Close the two last dialogues by clicking *OK* and *OK* * Important: Make sure that the template you edited is selected under *Event settings* * Click *Finish* to begin the recording Once the recording is complete, open the recording file in JDK Mission Control and go to the *Event Browser* . You should see periodic events corresponding to the selected MBeans under the *JMX* node: -![JmFrX Events in JDK Mission Control](https://www.morling.dev/images/jmfrx_events.png) +![JmFrX Events in JDK Mission Control](jmfrx_events-500897e3.png) When not using JDK Mission Control to initiate recordings, but the [*jcmd*](https://docs.oracle.com/en/java/javase/13/docs/specs/man/jcmd.html) utility on the command line, also follow the same steps as above for creating a configuration as described above. But then, instead of starting the recording, export the configuration file from the template manager and specify its name to *jcmd* via the *settings=/path/to/settings.jfc* parameter. Now using JmFrX to observe JMX data from for the `java.lang` MBeans like `Runtime` and `OperatingSystem` in JFR isn't too exciting yet, as there's dedicated JFR event types which contain most of that information. But things get more interesting when capturing data from custom MBean types, as e.g. here for the stream threads metrics from a [Kafka Streams](https://kafka.apache.org/26/documentation/streams/) application: -![JmFrX Events for Kafka Streams in JDK Mission Control](https://www.morling.dev/images/jmfrx_kafka_streams.png) +![JmFrX Events for Kafka Streams in JDK Mission Control](jmfrx_kafka_streams-85104d00.png) ### Customizing Event Formats diff --git a/content/posts/2020/09/03/introducing-jmfrx-a-bridge-from-jmx-to-java-flight-recorder/jmfrx_events-500897e3.png b/content/posts/2020/09/03/introducing-jmfrx-a-bridge-from-jmx-to-java-flight-recorder/jmfrx_events-500897e3.png new file mode 100644 index 000000000..cf7ff0dbe Binary files /dev/null and b/content/posts/2020/09/03/introducing-jmfrx-a-bridge-from-jmx-to-java-flight-recorder/jmfrx_events-500897e3.png differ diff --git a/content/posts/2020/09/03/introducing-jmfrx-a-bridge-from-jmx-to-java-flight-recorder/jmfrx_kafka_streams-85104d00.png b/content/posts/2020/09/03/introducing-jmfrx-a-bridge-from-jmx-to-java-flight-recorder/jmfrx_kafka_streams-85104d00.png new file mode 100644 index 000000000..9fb88a678 Binary files /dev/null and b/content/posts/2020/09/03/introducing-jmfrx-a-bridge-from-jmx-to-java-flight-recorder/jmfrx_kafka_streams-85104d00.png differ diff --git a/content/posts/2020/09/03/introducing-jmfrx-a-bridge-from-jmx-to-java-flight-recorder/jmfrx_mission_control_configuration-53a5a33a.png b/content/posts/2020/09/03/introducing-jmfrx-a-bridge-from-jmx-to-java-flight-recorder/jmfrx_mission_control_configuration-53a5a33a.png new file mode 100644 index 000000000..c8016e495 Binary files /dev/null and b/content/posts/2020/09/03/introducing-jmfrx-a-bridge-from-jmx-to-java-flight-recorder/jmfrx_mission_control_configuration-53a5a33a.png differ diff --git a/content/posts/2020/09/04/java-11-javafx-11-on-raspberry-pi-with-armv6-processor/index.md b/content/posts/2020/09/04/java-11-javafx-11-on-raspberry-pi-with-armv6-processor/index.md index e92e2f542..c6bfb7113 100644 --- a/content/posts/2020/09/04/java-11-javafx-11-on-raspberry-pi-with-armv6-processor/index.md +++ b/content/posts/2020/09/04/java-11-javafx-11-on-raspberry-pi-with-armv6-processor/index.md @@ -250,7 +250,7 @@ $ sudo java --module-path /home/pi/armv6hf-sdk/lib ``` And there we have it! JavaFX running on an ARMv6 Raspberry Pi B+ 1.2!!! -![](javafx-on-armv6-raspberrypi-1024x422.png) +![](javafx-on-armv6-raspberrypi-1024x422.jpg) ## Conclusion diff --git a/content/posts/2020/09/04/java-11-javafx-11-on-raspberry-pi-with-armv6-processor/javafx-on-armv6-raspberrypi-1024x422.jpg b/content/posts/2020/09/04/java-11-javafx-11-on-raspberry-pi-with-armv6-processor/javafx-on-armv6-raspberrypi-1024x422.jpg new file mode 100644 index 000000000..517c3e953 Binary files /dev/null and b/content/posts/2020/09/04/java-11-javafx-11-on-raspberry-pi-with-armv6-processor/javafx-on-armv6-raspberrypi-1024x422.jpg differ diff --git a/content/posts/2020/09/04/java-11-javafx-11-on-raspberry-pi-with-armv6-processor/javafx-on-armv6-raspberrypi-1024x422.png b/content/posts/2020/09/04/java-11-javafx-11-on-raspberry-pi-with-armv6-processor/javafx-on-armv6-raspberrypi-1024x422.png deleted file mode 100644 index f5a6347a2..000000000 Binary files a/content/posts/2020/09/04/java-11-javafx-11-on-raspberry-pi-with-armv6-processor/javafx-on-armv6-raspberrypi-1024x422.png and /dev/null differ diff --git a/content/posts/2020/09/11/redesigned-foojay-home/Screenshot-2020-09-11-at-20.12.58-620x1024.jpg b/content/posts/2020/09/11/redesigned-foojay-home/Screenshot-2020-09-11-at-20.12.58-620x1024.jpg new file mode 100644 index 000000000..251e72063 Binary files /dev/null and b/content/posts/2020/09/11/redesigned-foojay-home/Screenshot-2020-09-11-at-20.12.58-620x1024.jpg differ diff --git a/content/posts/2020/09/11/redesigned-foojay-home/Screenshot-2020-09-11-at-20.12.58-620x1024.png b/content/posts/2020/09/11/redesigned-foojay-home/Screenshot-2020-09-11-at-20.12.58-620x1024.png deleted file mode 100644 index cd2b42466..000000000 Binary files a/content/posts/2020/09/11/redesigned-foojay-home/Screenshot-2020-09-11-at-20.12.58-620x1024.png and /dev/null differ diff --git a/content/posts/2020/09/11/redesigned-foojay-home/index.md b/content/posts/2020/09/11/redesigned-foojay-home/index.md index e8858789c..87bd1c4a9 100644 --- a/content/posts/2020/09/11/redesigned-foojay-home/index.md +++ b/content/posts/2020/09/11/redesigned-foojay-home/index.md @@ -5,7 +5,7 @@ lastmod: "2021-08-23T12:51:58+00:00" description: "foojay.io has had a bit of a facelift over the past week. Now you can see directly on the homepage all the key pieces that make up foojay." authors: - "geertjan-wielenga" -image: "Screenshot-2020-09-11-at-20.12.58-620x1024.png" +image: "Screenshot-2020-09-11-at-20.12.58-620x1024.jpg" categories: - "Foojay" related_posts: @@ -19,4 +19,4 @@ The site you're on, foojay.io, has had a bit of a facelift over the past week. Now you can see directly on the homepage all the key pieces that make up foojay, a place for Friends Of OpenJDK... especially its focus on the integrated services provided by [Marc Hoffmann's Java Version Almanac](https://javaalmanac.io/jdk/8/) and[Chris Newland's JVM Options Explorer](https://chriswhocodes.com/hotspot_options_openjdk11.html), supported by the [OpenJDK Update Release Details](https://javaalmanac.io/jdk/8/), together with [Foojay Today](https://foojay.io/today/) and the start of [Foojay Pedia](https://foojay.io/pedia/). There's a lot more to be done, though this is a big step forward! -![](Screenshot-2020-09-11-at-20.12.58-620x1024.png) +![](Screenshot-2020-09-11-at-20.12.58-620x1024.jpg) diff --git a/content/posts/2020/09/17/whats-new-in-java-15/index.md b/content/posts/2020/09/17/whats-new-in-java-15/index.md index 0962fd118..4c8f5b375 100644 --- a/content/posts/2020/09/17/whats-new-in-java-15/index.md +++ b/content/posts/2020/09/17/whats-new-in-java-15/index.md @@ -5,7 +5,7 @@ lastmod: "2020-09-21T21:05:21+00:00" description: "Here on foojay, the fixes that went into the release are listed, giving you a unique and readable changelog in helpful categories." authors: - "geertjan-wielenga" -image: "new-java-15-foojay-1024x617.png" +image: "new-java-15-foojay-1024x617.jpg" categories: - "Release Notes" related_posts: @@ -19,7 +19,7 @@ frozen: true Now that Java 15 has been released, let's take a look at what's new! [Here on foojay](https://javaalmanac.io/jdk/15/), the fixes that went into the release are listed, giving you a unique and readable changelog in helpful categories, with the invitation for you to vote on those that are most relevant to you: -[![](new-java-15-foojay-1024x617.png)](https://javaalmanac.io/jdk/15/) +[![](new-java-15-foojay-1024x617.jpg)](https://javaalmanac.io/jdk/15/) ### New Features diff --git a/content/posts/2020/09/17/whats-new-in-java-15/new-java-15-foojay-1024x617.jpg b/content/posts/2020/09/17/whats-new-in-java-15/new-java-15-foojay-1024x617.jpg new file mode 100644 index 000000000..b578e9fde Binary files /dev/null and b/content/posts/2020/09/17/whats-new-in-java-15/new-java-15-foojay-1024x617.jpg differ diff --git a/content/posts/2020/09/17/whats-new-in-java-15/new-java-15-foojay-1024x617.png b/content/posts/2020/09/17/whats-new-in-java-15/new-java-15-foojay-1024x617.png deleted file mode 100644 index e68428685..000000000 Binary files a/content/posts/2020/09/17/whats-new-in-java-15/new-java-15-foojay-1024x617.png and /dev/null differ diff --git a/content/posts/2020/09/18/startup-spring-quarkus-raspberry-pi/index.md b/content/posts/2020/09/18/startup-spring-quarkus-raspberry-pi/index.md index 43e9a09a7..7ec3c2fed 100644 --- a/content/posts/2020/09/18/startup-spring-quarkus-raspberry-pi/index.md +++ b/content/posts/2020/09/18/startup-spring-quarkus-raspberry-pi/index.md @@ -42,7 +42,7 @@ The same application was developed in both Spring and Quarkus: Both projects are available on GitHub in "[JavaOnRaspberryPi \> Chapter_10_Spring \> java-spring-rest-db](https://github.com/FDelporte/JavaOnRaspberryPi/tree/master/Chapter_10_Spring/java-spring-rest-db)" and "[JavaQuarkusRestDb](https://github.com/FDelporte/JavaQuarkusRestDb)". If you like to get more information of the code itself, you can check the blog post links at the bottom of this page. {{< gallery cols="3" >}} -spring-db-swagger-1024x814.png +spring-db-swagger-1024x814.jpg spring-db-swagger-measurement-post-1024x484.png spring-db-swagger-sensor-post-error-1024x173.png spring-db-swagger-sensor-post-1024x320.png diff --git a/content/posts/2020/09/18/startup-spring-quarkus-raspberry-pi/spring-db-swagger-1024x814.jpg b/content/posts/2020/09/18/startup-spring-quarkus-raspberry-pi/spring-db-swagger-1024x814.jpg new file mode 100644 index 000000000..2faa6d0fb Binary files /dev/null and b/content/posts/2020/09/18/startup-spring-quarkus-raspberry-pi/spring-db-swagger-1024x814.jpg differ diff --git a/content/posts/2020/09/18/startup-spring-quarkus-raspberry-pi/spring-db-swagger-1024x814.png b/content/posts/2020/09/18/startup-spring-quarkus-raspberry-pi/spring-db-swagger-1024x814.png deleted file mode 100644 index bb278df73..000000000 Binary files a/content/posts/2020/09/18/startup-spring-quarkus-raspberry-pi/spring-db-swagger-1024x814.png and /dev/null differ diff --git a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/Screenshot-2020-09-21-at-09.32.17-1024x557.jpg b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/Screenshot-2020-09-21-at-09.32.17-1024x557.jpg new file mode 100644 index 000000000..debc45250 Binary files /dev/null and b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/Screenshot-2020-09-21-at-09.32.17-1024x557.jpg differ diff --git a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/Screenshot-2020-09-21-at-09.32.17-1024x557.png b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/Screenshot-2020-09-21-at-09.32.17-1024x557.png deleted file mode 100644 index b426fdd98..000000000 Binary files a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/Screenshot-2020-09-21-at-09.32.17-1024x557.png and /dev/null differ diff --git a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/index.md b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/index.md index 180ce5faf..104b04fe6 100644 --- a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/index.md +++ b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/index.md @@ -115,10 +115,10 @@ $ java -Dcom.sun.management.jmxremote \ I waited two minutes before taking each screenshot below. {{< gallery cols="2" >}} -java-11-spring-1024x610.png | | Spring with Java 11 -java-11-quarkus-1024x612.png | | Quarkus with Java 11 -java-15-spring-1024x610.png | | Spring with Java 15 -java-15-quarkus-1024x609.png | | Quarkus with Java 15 +java-11-spring-1024x610.jpg | | Spring with Java 11 +java-11-quarkus-1024x612.jpg | | Quarkus with Java 11 +java-15-spring-1024x610.jpg | | Spring with Java 15 +java-15-quarkus-1024x609.jpg | | Quarkus with Java 15 {{< /gallery >}} #### Profiling Conclusions @@ -137,6 +137,6 @@ Quarkus seems to need less memory on Java 15 and both Spring and Quarkus have a Do you need to switch from OpenJDK 11 to 15? No, not really, based on these results. But each new version has bug and security fixes, new features, and generic improvements: -![](Screenshot-2020-09-21-at-09.32.17-1024x557.png) +![](Screenshot-2020-09-21-at-09.32.17-1024x557.jpg) [Click here](https://javaalmanac.io/jdk/15/) to see all the details and vote on your favorite new features and fixes! diff --git a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-11-quarkus-1024x612.jpg b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-11-quarkus-1024x612.jpg new file mode 100644 index 000000000..f33e01d10 Binary files /dev/null and b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-11-quarkus-1024x612.jpg differ diff --git a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-11-quarkus-1024x612.png b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-11-quarkus-1024x612.png deleted file mode 100644 index 91078bd38..000000000 Binary files a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-11-quarkus-1024x612.png and /dev/null differ diff --git a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-11-spring-1024x610.jpg b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-11-spring-1024x610.jpg new file mode 100644 index 000000000..a37163326 Binary files /dev/null and b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-11-spring-1024x610.jpg differ diff --git a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-11-spring-1024x610.png b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-11-spring-1024x610.png deleted file mode 100644 index dab3eae73..000000000 Binary files a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-11-spring-1024x610.png and /dev/null differ diff --git a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-15-quarkus-1024x609.jpg b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-15-quarkus-1024x609.jpg new file mode 100644 index 000000000..e34928268 Binary files /dev/null and b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-15-quarkus-1024x609.jpg differ diff --git a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-15-quarkus-1024x609.png b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-15-quarkus-1024x609.png deleted file mode 100644 index 27c2328e8..000000000 Binary files a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-15-quarkus-1024x609.png and /dev/null differ diff --git a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-15-spring-1024x610.jpg b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-15-spring-1024x610.jpg new file mode 100644 index 000000000..3cc05209a Binary files /dev/null and b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-15-spring-1024x610.jpg differ diff --git a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-15-spring-1024x610.png b/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-15-spring-1024x610.png deleted file mode 100644 index cb4275a4b..000000000 Binary files a/content/posts/2020/09/21/azul-zulu-openjdk-15-on-raspberry-pi/java-15-spring-1024x610.png and /dev/null differ diff --git a/content/posts/2020/09/23/spectacular-java-projects-on-the-raspberry-pi/index.md b/content/posts/2020/09/23/spectacular-java-projects-on-the-raspberry-pi/index.md index 4dd9c2d57..bac8dcbd8 100644 --- a/content/posts/2020/09/23/spectacular-java-projects-on-the-raspberry-pi/index.md +++ b/content/posts/2020/09/23/spectacular-java-projects-on-the-raspberry-pi/index.md @@ -69,7 +69,7 @@ Another project of Daniel, called "[OpenSourceLogger](https://github.com/DanielM {{< gallery cols="3" >}} Radio.jpg opensourcelogger-1024x711.png -opensourcelogger-wiring-1024x753.png +opensourcelogger-wiring-1024x753.jpg {{< /gallery >}} #### [Frank Delporte](https://twitter.com/frankdelporte) - Drumbooth controller diff --git a/content/posts/2020/09/23/spectacular-java-projects-on-the-raspberry-pi/opensourcelogger-wiring-1024x753.jpg b/content/posts/2020/09/23/spectacular-java-projects-on-the-raspberry-pi/opensourcelogger-wiring-1024x753.jpg new file mode 100644 index 000000000..cf2f14269 Binary files /dev/null and b/content/posts/2020/09/23/spectacular-java-projects-on-the-raspberry-pi/opensourcelogger-wiring-1024x753.jpg differ diff --git a/content/posts/2020/09/23/spectacular-java-projects-on-the-raspberry-pi/opensourcelogger-wiring-1024x753.png b/content/posts/2020/09/23/spectacular-java-projects-on-the-raspberry-pi/opensourcelogger-wiring-1024x753.png deleted file mode 100644 index 2b4d69236..000000000 Binary files a/content/posts/2020/09/23/spectacular-java-projects-on-the-raspberry-pi/opensourcelogger-wiring-1024x753.png and /dev/null differ diff --git a/content/posts/2020/10/06/electronics-micronaut-velocity-with-raspberry-pi/IMG-20200928-WA0001-85334a8a.jpg b/content/posts/2020/10/06/electronics-micronaut-velocity-with-raspberry-pi/IMG-20200928-WA0001-85334a8a.jpg new file mode 100644 index 000000000..b40c1278c Binary files /dev/null and b/content/posts/2020/10/06/electronics-micronaut-velocity-with-raspberry-pi/IMG-20200928-WA0001-85334a8a.jpg differ diff --git a/content/posts/2020/10/06/electronics-micronaut-velocity-with-raspberry-pi/index.md b/content/posts/2020/10/06/electronics-micronaut-velocity-with-raspberry-pi/index.md index a0408e654..6812deeba 100644 --- a/content/posts/2020/10/06/electronics-micronaut-velocity-with-raspberry-pi/index.md +++ b/content/posts/2020/10/06/electronics-micronaut-velocity-with-raspberry-pi/index.md @@ -51,7 +51,7 @@ HAT stands for "Hardware Attached on Top" which is a new hardware specification You can check Igor's blog post with additional info on the Sense HAT [here](http://www.igfasouza.com/blog/sense-hat/). -{{< img src="http://www.igfasouza.com/blog/wp-content/uploads/2020/09/IMG-20200928-WA0001.jpg" class="alignleft is-resized" width="150" height="200" >}} +{{< img src="IMG-20200928-WA0001-85334a8a.jpg" class="alignleft is-resized" width="150" height="200" >}} ## Idea diff --git a/content/posts/2020/10/20/fixing-vulnerabilities-in-maven-projects/index.md b/content/posts/2020/10/20/fixing-vulnerabilities-in-maven-projects/index.md index ec375361f..7291d5744 100644 --- a/content/posts/2020/10/20/fixing-vulnerabilities-in-maven-projects/index.md +++ b/content/posts/2020/10/20/fixing-vulnerabilities-in-maven-projects/index.md @@ -6,7 +6,7 @@ description: "In this article, I will explain how you can fix vulnerabilities in canonical: "https://snyk.io/blog/fixing-vulnerabilities-in-maven-projects/" authors: - "bmvermeer" -image: "https://lh4.googleusercontent.com/mZSSwqr_bQsZ-HNTvPOThi2xscIaO49aDfH4QNj3GHXhgGHrq-gw7dw6EZLOvqu-n0ILqBtb9bVq_1gOwGZo0qRYuWY82HZ3_kXUXpN1tXQlnOlHzQtGUscExnxsofwyLBu4ESep" +image: "mZSSwqr_bQsZ-HNTvPOThi2xscIaO49aDfH4QNj3-dda37fa9.png" categories: - "Maven" - "Security" @@ -29,7 +29,7 @@ In this article, I will explain how you can fix vulnerabilities in third-party l If you are using Maven for building your project and managing your dependencies for your project, there are several ways to scan your projects, using tools such as [Snyk](https://snyk.io). This is regardless of the actual programming language you use—this can be Java, Kotlin, Scala, Groovy, or any other language that is designed for the Java Virtual Machine (JVM). Scanning your Maven project for vulnerabilities can be done, by using Snyk, for example. In the example below, I use the [Snyk CLI](https://support.snyk.io/hc/en-us/articles/360003817357-Snyk-for-Java-Gradle-Maven-#UUID-3d91eb09-1fcf-e973-89ff-bf24ab0ddfe2_section-idm13169231445744), which will show you if and how you can fix vulnerabilities, by updating the top-level dependencies. However, if there is no improved version of the top-level dependencies, Snyk shows you if there is a newer version of the underlying dependency that fixes the vulnerabilities. -![](https://lh4.googleusercontent.com/mZSSwqr_bQsZ-HNTvPOThi2xscIaO49aDfH4QNj3GHXhgGHrq-gw7dw6EZLOvqu-n0ILqBtb9bVq_1gOwGZo0qRYuWY82HZ3_kXUXpN1tXQlnOlHzQtGUscExnxsofwyLBu4ESep) +![](mZSSwqr_bQsZ-HNTvPOThi2xscIaO49aDfH4QNj3-dda37fa9.png) ## Fixing top-level vulnerabilities diff --git a/content/posts/2020/10/20/fixing-vulnerabilities-in-maven-projects/mZSSwqr_bQsZ-HNTvPOThi2xscIaO49aDfH4QNj3-dda37fa9.png b/content/posts/2020/10/20/fixing-vulnerabilities-in-maven-projects/mZSSwqr_bQsZ-HNTvPOThi2xscIaO49aDfH4QNj3-dda37fa9.png new file mode 100644 index 000000000..21d52f98c Binary files /dev/null and b/content/posts/2020/10/20/fixing-vulnerabilities-in-maven-projects/mZSSwqr_bQsZ-HNTvPOThi2xscIaO49aDfH4QNj3-dda37fa9.png differ diff --git a/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/compiling-java-1024x357.jpg b/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/compiling-java-1024x357.jpg new file mode 100644 index 000000000..2f9075cc3 Binary files /dev/null and b/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/compiling-java-1024x357.jpg differ diff --git a/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/compiling-java-1024x357.png b/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/compiling-java-1024x357.png deleted file mode 100644 index 4abdd047e..000000000 Binary files a/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/compiling-java-1024x357.png and /dev/null differ diff --git a/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/index.md b/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/index.md index 080965058..7d054ee0e 100644 --- a/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/index.md +++ b/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/index.md @@ -5,7 +5,7 @@ lastmod: "2020-10-21T06:35:28+00:00" description: "The OpenJDK sources are now fully available and developed on GitHub, thanks to Project Skara. We can build it from sources on any device." authors: - "frankdelporte" -image: "compiling-java-1024x357.png" +image: "compiling-java-1024x357.jpg" categories: - "Raspberry Pi" related_posts: @@ -79,7 +79,7 @@ With all the required tools being available and configured, we can start the com $ make images ``` -![](compiling-java-1024x357.png) +![](compiling-java-1024x357.jpg) In my case (Raspberry Pi 4 with 8 GB memory and 64-bit Raspbian OS) this took just under 60 minutes. For reference, on a Ubuntu 20.04 PC with Intel Core i7 with 16GB memory it takes about 15 minutes. @@ -93,4 +93,4 @@ OpenJDK 64-Bit Server VM (build 16-internal+0-adhoc.pi.jdk, mixed mode, sharing) ``` Yep, there it is: **the cutting edge, not yet released, straight from the sources, freshly baked and served "**Java JDK 16-internal**" on a Raspberry Pi**! 🙂 -![](java-16-internal-on-raspberrypi-1024x646.png) +![](java-16-internal-on-raspberrypi-1024x646.jpg) diff --git a/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/java-16-internal-on-raspberrypi-1024x646.jpg b/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/java-16-internal-on-raspberrypi-1024x646.jpg new file mode 100644 index 000000000..2f0e1dc8b Binary files /dev/null and b/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/java-16-internal-on-raspberrypi-1024x646.jpg differ diff --git a/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/java-16-internal-on-raspberrypi-1024x646.png b/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/java-16-internal-on-raspberrypi-1024x646.png deleted file mode 100644 index 0d43d6de7..000000000 Binary files a/content/posts/2020/10/21/building-openjdk-from-github-sources-on-64-bit-raspberry-pi/java-16-internal-on-raspberrypi-1024x646.png and /dev/null differ diff --git a/content/posts/2020/11/02/foojay-all-about-java-and-the-openjdk-i-programmer/image-2-628x1024.jpg b/content/posts/2020/11/02/foojay-all-about-java-and-the-openjdk-i-programmer/image-2-628x1024.jpg new file mode 100644 index 000000000..8ee5d6d8e Binary files /dev/null and b/content/posts/2020/11/02/foojay-all-about-java-and-the-openjdk-i-programmer/image-2-628x1024.jpg differ diff --git a/content/posts/2020/11/02/foojay-all-about-java-and-the-openjdk-i-programmer/image-2-628x1024.png b/content/posts/2020/11/02/foojay-all-about-java-and-the-openjdk-i-programmer/image-2-628x1024.png deleted file mode 100644 index df7bef400..000000000 Binary files a/content/posts/2020/11/02/foojay-all-about-java-and-the-openjdk-i-programmer/image-2-628x1024.png and /dev/null differ diff --git a/content/posts/2020/11/02/foojay-all-about-java-and-the-openjdk-i-programmer/index.md b/content/posts/2020/11/02/foojay-all-about-java-and-the-openjdk-i-programmer/index.md index 8d5014e76..8e4084584 100644 --- a/content/posts/2020/11/02/foojay-all-about-java-and-the-openjdk-i-programmer/index.md +++ b/content/posts/2020/11/02/foojay-all-about-java-and-the-openjdk-i-programmer/index.md @@ -5,7 +5,7 @@ lastmod: "2021-03-26T14:13:44+00:00" description: "Tracking the OpenJDK is not an easy feat. It evolves rapidly under a release cycle of a new version every 6 months. Foojay helps out!" authors: - "geertjan-wielenga" -image: "image-2-628x1024.png" +image: "image-2-628x1024.jpg" categories: - "Press" related_posts: @@ -13,4 +13,4 @@ frozen: false --- Today, published [by Nikos Vaggalis on I Programmer](https://www.i-programmer.info/news/80-java/14116-foojay-all-about-java-and-the-openjdk.html): -![](image-2-628x1024.png) +![](image-2-628x1024.jpg) diff --git a/content/posts/2020/11/02/using-java-flight-recorder-and-mission-control-part-1/index.md b/content/posts/2020/11/02/using-java-flight-recorder-and-mission-control-part-1/index.md index 796d3aac9..1846c00fb 100644 --- a/content/posts/2020/11/02/using-java-flight-recorder-and-mission-control-part-1/index.md +++ b/content/posts/2020/11/02/using-java-flight-recorder-and-mission-control-part-1/index.md @@ -6,7 +6,7 @@ description: "Java Flight Recorder is the profiler you can use in production, co canonical: "https://blog.arkey.fr/2020/06/28/using-jdk-flight-recorder-and-jdk-mission-control/" authors: - "brice-dutheil" -image: "https://blog.arkey.fr/assets/jfr/java-flight-recorder-big-picture2.svg" +image: "java-flight-recorder-big-picture2-dc6f4fb7.svg" categories: - "JDK Flight Recorder" - "Tools" @@ -31,7 +31,7 @@ At some point, BEA/Appeal engineers needed insight in their JVM, in production, Mission Control, on the other hand, is a software that will analyze these events and build consolidated views for us to analyze. JFR with Mission Control together are similar to architectures as [*Event Sourcing*](https://martinfowler.com/eaaDev/EventSourcing.html) systems. -![java flight recorder big picture2](https://blog.arkey.fr/assets/jfr/java-flight-recorder-big-picture2.svg) JFR Big Picture +![java flight recorder big picture2](java-flight-recorder-big-picture2-dc6f4fb7.svg) JFR Big Picture I won't dive in, but most profilers do have a bias when profiling and don't report accurate results. The issue lies in how profilers handle JVM safepoints, most don't account properly the time spent in safepoints. Some great profilers, like the great [async-profiler](https://github.com/jvm-profiling-tools/async-profiler), are not subject to these biases, JFR is also not subject to it. diff --git a/content/posts/2020/11/02/using-java-flight-recorder-and-mission-control-part-1/java-flight-recorder-big-picture2-dc6f4fb7.svg b/content/posts/2020/11/02/using-java-flight-recorder-and-mission-control-part-1/java-flight-recorder-big-picture2-dc6f4fb7.svg new file mode 100644 index 000000000..8554d5dc4 --- /dev/null +++ b/content/posts/2020/11/02/using-java-flight-recorder-and-mission-control-part-1/java-flight-recorder-big-picture2-dc6f4fb7.svg @@ -0,0 +1,3 @@ + + +
JVM
JVM
thread 1
thread 1
gc thread
gc thread
thread n
thread n
JFR
JFR
GC
GC
IO
IO
Compiler
Compiler
<= These are runtime sub system events
dashed means disabled
<= These are runtime sub system events...

global
in-memory
buffer
global...
Disk
Disk
repository
/tmp/.../
repository...
dump event
in chunks
dump event...
2020_06_26_16_04_02.jfr2020_06_26_16_04_47.jfr2020_06_26_16_04_12.jfr
circular buffer
circular...
jcmd pid JFR.start
jcmd pid JFR.start
recording in progress
recording in progress
.../recording.jfr
.../recording.jfr
jcmd pid JFR.dump filename=recording.jfr
jcmd pid JFR.dump filename=recording.jfr
assemble
assemble
settings
settings
use
use
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/content/posts/2020/11/10/getting-started-with-payara-server/Introduction-1150x647-1.jpg b/content/posts/2020/11/10/getting-started-with-payara-server/Introduction-1150x647-1.jpg new file mode 100644 index 000000000..0edeff188 Binary files /dev/null and b/content/posts/2020/11/10/getting-started-with-payara-server/Introduction-1150x647-1.jpg differ diff --git a/content/posts/2020/11/10/getting-started-with-payara-server/Introduction-1150x647-1.png b/content/posts/2020/11/10/getting-started-with-payara-server/Introduction-1150x647-1.png deleted file mode 100644 index 81cdb2d41..000000000 Binary files a/content/posts/2020/11/10/getting-started-with-payara-server/Introduction-1150x647-1.png and /dev/null differ diff --git a/content/posts/2020/11/10/getting-started-with-payara-server/index.md b/content/posts/2020/11/10/getting-started-with-payara-server/index.md index 454dd0ee3..6310ed8fe 100644 --- a/content/posts/2020/11/10/getting-started-with-payara-server/index.md +++ b/content/posts/2020/11/10/getting-started-with-payara-server/index.md @@ -6,7 +6,7 @@ description: "The following four short videos will take you step-by-step through canonical: "https://www.payara.fish/learn/getting-started-with-payara/" authors: - "jadon-ortlepp" -image: "Introduction-1150x647-1.png" +image: "Introduction-1150x647-1.jpg" categories: - "Microservices" - "Tutorials" diff --git a/content/posts/2020/11/13/for-the-record/compiler-generated-code-delivery-1024x732.jpg b/content/posts/2020/11/13/for-the-record/compiler-generated-code-delivery-1024x732.jpg new file mode 100644 index 000000000..d6217faa7 Binary files /dev/null and b/content/posts/2020/11/13/for-the-record/compiler-generated-code-delivery-1024x732.jpg differ diff --git a/content/posts/2020/11/13/for-the-record/compiler-generated-code-delivery-1024x732.png b/content/posts/2020/11/13/for-the-record/compiler-generated-code-delivery-1024x732.png deleted file mode 100644 index 0b88e1598..000000000 Binary files a/content/posts/2020/11/13/for-the-record/compiler-generated-code-delivery-1024x732.png and /dev/null differ diff --git a/content/posts/2020/11/13/for-the-record/donut-code-refactored-1024x522.jpg b/content/posts/2020/11/13/for-the-record/donut-code-refactored-1024x522.jpg new file mode 100644 index 000000000..8fdb1fc63 Binary files /dev/null and b/content/posts/2020/11/13/for-the-record/donut-code-refactored-1024x522.jpg differ diff --git a/content/posts/2020/11/13/for-the-record/donut-code-refactored-1024x522.png b/content/posts/2020/11/13/for-the-record/donut-code-refactored-1024x522.png deleted file mode 100644 index 5c036e291..000000000 Binary files a/content/posts/2020/11/13/for-the-record/donut-code-refactored-1024x522.png and /dev/null differ diff --git a/content/posts/2020/11/13/for-the-record/index.md b/content/posts/2020/11/13/for-the-record/index.md index f11a249e8..79c6f07e1 100644 --- a/content/posts/2020/11/13/for-the-record/index.md +++ b/content/posts/2020/11/13/for-the-record/index.md @@ -38,7 +38,7 @@ Refactoring this code resulted in 58 changes (2 additions, 56 deletions). {{< img src="donut-code-refactoring-700x51.png" class="size-medium aligncenter" width="700" height="51" >}} -![](donut-code-refactored-1024x522.png) +![](donut-code-refactored-1024x522.jpg) The following were generated by the compiler, referencing the image above @@ -57,7 +57,7 @@ The following were generated by the compiler, referencing the image above `var delivery = new Delivery(order, donutList);` ![](delivery-class.png) Delivery class -![](compiler-generated-code-delivery-1024x732.png) Compiler-generated code for Delivery class (Right) +![](compiler-generated-code-delivery-1024x732.jpg) Compiler-generated code for Delivery class (Right) > One thing to note here is that there is no "no-argument" constructor here because all fields of a record are final and must be initialized as part of the default constructor logic. 3. Custom constructor — The argument list can be overridden from that of the canonical constructor. Custom constructors must delegate to the canonical constructor. See the example below. @@ -84,7 +84,7 @@ Other than these limitations, records behave exactly like classes. You can use t * I am using IntelliJ 2020.1 which supports JDK 14 including the preview features which makes learning about this feature so much easier. Download [link](https://www.jetbrains.com/idea/download/). Here is how my setup looks in IntelliJ. -![](intelli-setup-left-1024x582.png) ![](intellij-setup-right.png) +![](intelli-setup-left-1024x582.jpg) ![](intellij-setup-right.png) Examples mentioned above are all available in this GitHub [project](https://github.com/BNYMellon/CodeKatas/tree/master/donut-kata). diff --git a/content/posts/2020/11/13/for-the-record/intelli-setup-left-1024x582.jpg b/content/posts/2020/11/13/for-the-record/intelli-setup-left-1024x582.jpg new file mode 100644 index 000000000..896e4bb18 Binary files /dev/null and b/content/posts/2020/11/13/for-the-record/intelli-setup-left-1024x582.jpg differ diff --git a/content/posts/2020/11/13/for-the-record/intelli-setup-left-1024x582.png b/content/posts/2020/11/13/for-the-record/intelli-setup-left-1024x582.png deleted file mode 100644 index 8e7ef2ee0..000000000 Binary files a/content/posts/2020/11/13/for-the-record/intelli-setup-left-1024x582.png and /dev/null differ diff --git a/content/posts/2020/11/16/run-oracle-weblogic-server-on-azure-kubernetes-service/index.md b/content/posts/2020/11/16/run-oracle-weblogic-server-on-azure-kubernetes-service/index.md index d9114e4b1..459ac3bfc 100644 --- a/content/posts/2020/11/16/run-oracle-weblogic-server-on-azure-kubernetes-service/index.md +++ b/content/posts/2020/11/16/run-oracle-weblogic-server-on-azure-kubernetes-service/index.md @@ -5,7 +5,7 @@ lastmod: "2021-07-05T20:06:45+00:00" description: "We are delighted to announce the initial release of solutions to run Oracle WebLogic Server on the Azure Kubernetes Service." authors: - "m-reza-rahman" -image: "weblogic-architecture-aks.png" +image: "weblogic-architecture-aks.jpg" categories: - "Kubernetes" - "Release Notes" @@ -27,7 +27,7 @@ The WLS on AKS solutions allow a high degree of configuration and customization. ![wls-on-aks-short.gif](https://techcommunity.microsoft.com/t5/image/serverpage/image-id/231206i54179B2C8A13F19B/image-size/large?v=1.0&px=999 "wls-on-aks-short.gif") The solutions enable a wide range of production-ready deployment architectures with relative ease, and you have complete flexibility to customize your deployments. After deploying your applications, you can take advantage of a range of Azure resources for additional functionality. -![weblogic-architecture-aks.png](https://techcommunity.microsoft.com/t5/image/serverpage/image-id/231200i8605B915905C4CBF/image-size/large?v=1.0&px=999 "weblogic-architecture-aks.png") +![weblogic-architecture-aks.jpg](https://techcommunity.microsoft.com/t5/image/serverpage/image-id/231200i8605B915905C4CBF/image-size/large?v=1.0&px=999 "weblogic-architecture-aks.jpg") The solutions currently assume deploying the domain outside the Docker image and using the standard Docker images from Oracle; we will enable custom images with your domain inside a Docker image in the next few months. Further ease-of-use and Azure service integrations will be possible next year via Marketplace offerings mirroring the WLS on Azure Virtual Machines solutions. diff --git a/content/posts/2020/11/16/run-oracle-weblogic-server-on-azure-kubernetes-service/weblogic-architecture-aks.jpg b/content/posts/2020/11/16/run-oracle-weblogic-server-on-azure-kubernetes-service/weblogic-architecture-aks.jpg new file mode 100644 index 000000000..b1bd98d0a Binary files /dev/null and b/content/posts/2020/11/16/run-oracle-weblogic-server-on-azure-kubernetes-service/weblogic-architecture-aks.jpg differ diff --git a/content/posts/2020/11/16/run-oracle-weblogic-server-on-azure-kubernetes-service/weblogic-architecture-aks.png b/content/posts/2020/11/16/run-oracle-weblogic-server-on-azure-kubernetes-service/weblogic-architecture-aks.png deleted file mode 100644 index b27a5561a..000000000 Binary files a/content/posts/2020/11/16/run-oracle-weblogic-server-on-azure-kubernetes-service/weblogic-architecture-aks.png and /dev/null differ diff --git a/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/Screenshot-from-2020-11-16-08-33-50-1024x434.jpg b/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/Screenshot-from-2020-11-16-08-33-50-1024x434.jpg new file mode 100644 index 000000000..45f1aa57e Binary files /dev/null and b/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/Screenshot-from-2020-11-16-08-33-50-1024x434.jpg differ diff --git a/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/Screenshot-from-2020-11-16-08-33-50-1024x434.png b/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/Screenshot-from-2020-11-16-08-33-50-1024x434.png deleted file mode 100644 index 49081861d..000000000 Binary files a/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/Screenshot-from-2020-11-16-08-33-50-1024x434.png and /dev/null differ diff --git a/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/index.md b/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/index.md index a989f8163..3477778cc 100644 --- a/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/index.md +++ b/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/index.md @@ -5,7 +5,7 @@ lastmod: "2021-08-23T13:01:07+00:00" description: "Here on foojay.io you can already find two posts by Carl Dea to get you started with JavaFX. In this post, I want to show you yet another approach that uses the tools provided by Gluon, who are the maintainers, and the driving force behind OpenJFX. The Gluon start website and the plugin allow you to get started with a new JavaFX project in a few clicks. Thanks to the amazing work done by the Gluon team this also gives you a quick-start for the creation of a mobile application which can be built for both Android and iOS." authors: - "frankdelporte" -image: "Screenshot-from-2020-11-16-08-33-50-1024x434.png" +image: "Screenshot-from-2020-11-16-08-33-50-1024x434.jpg" categories: - "Gluon" - "IntelliJ IDEA" @@ -92,7 +92,7 @@ In that case you'll need to follow these steps: 3. In the "Project structure" dialog in IntelliJ IDEA add the location including the "lib" in the "Modules \> Dependencies" screen, e.g. `/opt/javafx-sdk-16/lib`. By doing this, your IDE will be able to provide you the correct syntax highlighting. 4. To run your application, we also need to add the startup arguments to point to the javafx-modules. Open the Configurations dialog and provide the "VM options", including all the modules required for your project, e.g. `--module-path /opt/javafx-sdk-16/lib --add-modules javafx.controls,javafx.fxml`. -![](Screenshot-from-2020-11-16-08-33-50-1024x434.png) Adding openjfx as a dependency ![](Screenshot-from-2020-11-16-08-41-09-1024x194.png) Defining the VM options to run your application +![](Screenshot-from-2020-11-16-08-33-50-1024x434.jpg) Adding openjfx as a dependency ![](Screenshot-from-2020-11-16-08-41-09-1024x194.png) Defining the VM options to run your application ### Create a New Project with start.gluon.io @@ -130,7 +130,7 @@ In the next windows, you can select different options, Maven or Gradle, names of {{< gallery cols="3" >}} intellij-new-project-1.png -intellij-new-project-run-1024x666.png +intellij-new-project-run-1024x666.jpg intellij-new-project-views.png {{< /gallery >}} diff --git a/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/intellij-new-project-run-1024x666.jpg b/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/intellij-new-project-run-1024x666.jpg new file mode 100644 index 000000000..9c4721dd5 Binary files /dev/null and b/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/intellij-new-project-run-1024x666.jpg differ diff --git a/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/intellij-new-project-run-1024x666.png b/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/intellij-new-project-run-1024x666.png deleted file mode 100644 index ab19a1972..000000000 Binary files a/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/intellij-new-project-run-1024x666.png and /dev/null differ diff --git a/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/intellij-new-project-run.jpg b/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/intellij-new-project-run.jpg new file mode 100644 index 000000000..66b749fa0 Binary files /dev/null and b/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/intellij-new-project-run.jpg differ diff --git a/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/intellij-new-project-run.png b/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/intellij-new-project-run.png deleted file mode 100644 index 682ec07cd..000000000 Binary files a/content/posts/2020/11/17/starting-a-javafx-project-with-gluon-tools/intellij-new-project-run.png and /dev/null differ diff --git a/content/posts/2020/11/18/7-ways-to-contribute-to-openjdk/agreatmany.jpg b/content/posts/2020/11/18/7-ways-to-contribute-to-openjdk/agreatmany.jpg new file mode 100644 index 000000000..368f84ab2 Binary files /dev/null and b/content/posts/2020/11/18/7-ways-to-contribute-to-openjdk/agreatmany.jpg differ diff --git a/content/posts/2020/11/18/7-ways-to-contribute-to-openjdk/agreatmany.png b/content/posts/2020/11/18/7-ways-to-contribute-to-openjdk/agreatmany.png deleted file mode 100644 index 85d644fcd..000000000 Binary files a/content/posts/2020/11/18/7-ways-to-contribute-to-openjdk/agreatmany.png and /dev/null differ diff --git a/content/posts/2020/11/18/7-ways-to-contribute-to-openjdk/index.md b/content/posts/2020/11/18/7-ways-to-contribute-to-openjdk/index.md index db9524d25..0f4b14cb6 100644 --- a/content/posts/2020/11/18/7-ways-to-contribute-to-openjdk/index.md +++ b/content/posts/2020/11/18/7-ways-to-contribute-to-openjdk/index.md @@ -5,7 +5,7 @@ lastmod: "2025-01-24T10:42:32+00:00" description: "If OpenJDK is the background source for your livelihood, you might want to contribute to future development of the OpenJDK. Find out how!" authors: - "kevinfarnham" -image: "agreatmany.png" +image: "agreatmany.jpg" categories: - "Java" - "Java Core" diff --git a/content/posts/2020/11/20/covid-19-time-series-analysis-with-software-ekg/index.md b/content/posts/2020/11/20/covid-19-time-series-analysis-with-software-ekg/index.md index 11a22fb9c..57b2c33fd 100644 --- a/content/posts/2020/11/20/covid-19-time-series-analysis-with-software-ekg/index.md +++ b/content/posts/2020/11/20/covid-19-time-series-analysis-with-software-ekg/index.md @@ -5,7 +5,7 @@ lastmod: "2020-11-20T10:55:47+00:00" description: "Our goal is to provide you with raw data on COVID-19, with a tool that lets you analyze, visualize, and interpret the impact of the pandemic." authors: - "johannes-weigend" -image: "software-ekg-covid-01-1024x555.png" +image: "software-ekg-covid-01-1024x555.jpg" categories: - "JavaFX" - "Release Notes" @@ -16,7 +16,7 @@ frozen: false Software-EKG is a powerful tool for time series analysis developed by [QAware Software Engineering](http://www.qaware.de/)*.* Using a highly efficient search index and optimized algorithms, the tool enables you to both visualize and analyze time series containing billions of values. Our special COVID-19 Edition provides you with the latest data on COVID-19 from all countries worldwide. Not only can you get a detailed overview of the Coronavirus pandemic in a single country, it is also possible to compare different countries with each other using a plethora of metrics like positive test rate, population density or even hospital beds available. -![](software-ekg-covid-01-1024x555.png) +![](software-ekg-covid-01-1024x555.jpg) The software was developed with Java 11 and JavaFX. The window management is based on Stagediver.fx, the framework that emulates basic parts of the NetBeans Platform for JavaFX. diff --git a/content/posts/2020/11/20/covid-19-time-series-analysis-with-software-ekg/software-ekg-covid-01-1024x555.jpg b/content/posts/2020/11/20/covid-19-time-series-analysis-with-software-ekg/software-ekg-covid-01-1024x555.jpg new file mode 100644 index 000000000..95a0d4715 Binary files /dev/null and b/content/posts/2020/11/20/covid-19-time-series-analysis-with-software-ekg/software-ekg-covid-01-1024x555.jpg differ diff --git a/content/posts/2020/11/20/covid-19-time-series-analysis-with-software-ekg/software-ekg-covid-01-1024x555.png b/content/posts/2020/11/20/covid-19-time-series-analysis-with-software-ekg/software-ekg-covid-01-1024x555.png deleted file mode 100644 index bcf2ebe03..000000000 Binary files a/content/posts/2020/11/20/covid-19-time-series-analysis-with-software-ekg/software-ekg-covid-01-1024x555.png and /dev/null differ diff --git a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/app-about.jpg b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/app-about.jpg new file mode 100644 index 000000000..bd149bf2f Binary files /dev/null and b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/app-about.jpg differ diff --git a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/app-about.png b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/app-about.png deleted file mode 100644 index 04df8d1f3..000000000 Binary files a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/app-about.png and /dev/null differ diff --git a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/apple-app-store.jpg b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/apple-app-store.jpg new file mode 100644 index 000000000..3f5d5c985 Binary files /dev/null and b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/apple-app-store.jpg differ diff --git a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/apple-app-store.png b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/apple-app-store.png deleted file mode 100644 index a9a8f6c9a..000000000 Binary files a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/apple-app-store.png and /dev/null differ diff --git a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/github-project-1-1024x672.jpg b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/github-project-1-1024x672.jpg new file mode 100644 index 000000000..0183f95a3 Binary files /dev/null and b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/github-project-1-1024x672.jpg differ diff --git a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/github-project-1-1024x672.png b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/github-project-1-1024x672.png deleted file mode 100644 index f91099db4..000000000 Binary files a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/github-project-1-1024x672.png and /dev/null differ diff --git a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/github-project-1.jpg b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/github-project-1.jpg new file mode 100644 index 000000000..1dcb9c72a Binary files /dev/null and b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/github-project-1.jpg differ diff --git a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/github-project-1.png b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/github-project-1.png deleted file mode 100644 index fc7092078..000000000 Binary files a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/github-project-1.png and /dev/null differ diff --git a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/google-play-1024x849.jpg b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/google-play-1024x849.jpg new file mode 100644 index 000000000..3f1582164 Binary files /dev/null and b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/google-play-1024x849.jpg differ diff --git a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/google-play-1024x849.png b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/google-play-1024x849.png deleted file mode 100644 index aed7a4729..000000000 Binary files a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/google-play-1024x849.png and /dev/null differ diff --git a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/index.md b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/index.md index 554d888e0..2b364a0db 100644 --- a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/index.md +++ b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/index.md @@ -41,11 +41,11 @@ resistorcalculator-maven.png Based on a "Gluon Mobile Multiview" project, it was only a matter of hours to create a working application with two calculation views and one "About" view. Many thanks to [José Pereda](https://twitter.com/JPeredaDnr) of Gluon who was so kind to improve my ugly proof-of-concept to a much better-looking layout with some clever tweaks and CSS improvements. {{< gallery cols="6" >}} -app-about.png +app-about.jpg app-colors.png app-led.png app-menu.png -github-project-1-1024x672.png +github-project-1-1024x672.jpg intellij-app.png {{< /gallery >}} @@ -196,8 +196,8 @@ And the resulting file "target/client/x86_64-darwin/Resistor Calculator" is copi When I started working on this post and project, I just wanted to reach successful native builds for all platforms. But then Gluon stepped in and pushed this a lot further and guess what? This application is now on both "[Google Play](https://play.google.com/store/apps/details?id=be.webtechie.resistorcalculatorapp)" and the "[Apple App Store](https://apps.apple.com/us/app/gluon-resistor-calculator/id1540638756)" thanks to the work of [Erwin Morrhey](https://twitter.com/erwin1). {{< gallery cols="3" caption="The app in the stores and a QR code to install on your phone" >}} -apple-app-store.png -google-play-1024x849.png +apple-app-store.jpg +google-play-1024x849.jpg onlink_to_resistorcalc_small.png {{< /gallery >}} @@ -212,7 +212,7 @@ Action file: [maven-ios.yml](https://github.com/FDelporte/ResistorCalculatorApp/ Additional settings are required which you can hide from your script by defining them in the secrets-section of your GitHub project, just like we already did with the Gluon license key. {{< gallery cols="2" >}} -ios-setting-new-secret-1024x410.png +ios-setting-new-secret-1024x410.jpg ios-succeeded.png {{< /gallery >}} diff --git a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/ios-setting-new-secret-1024x410.jpg b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/ios-setting-new-secret-1024x410.jpg new file mode 100644 index 000000000..a39a9776c Binary files /dev/null and b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/ios-setting-new-secret-1024x410.jpg differ diff --git a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/ios-setting-new-secret-1024x410.png b/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/ios-setting-new-secret-1024x410.png deleted file mode 100644 index 855b63d99..000000000 Binary files a/content/posts/2020/11/25/native-applications-for-multiple-devices-from-a-single-javafx-project-with-gluon-mobile-and-github-actions/ios-setting-new-secret-1024x410.png and /dev/null differ diff --git a/content/posts/2020/11/26/apple-silicon-with-zulu-openjdk-and-intellij-idea/image-1024x761.jpg b/content/posts/2020/11/26/apple-silicon-with-zulu-openjdk-and-intellij-idea/image-1024x761.jpg new file mode 100644 index 000000000..f9d602320 Binary files /dev/null and b/content/posts/2020/11/26/apple-silicon-with-zulu-openjdk-and-intellij-idea/image-1024x761.jpg differ diff --git a/content/posts/2020/11/26/apple-silicon-with-zulu-openjdk-and-intellij-idea/image-1024x761.png b/content/posts/2020/11/26/apple-silicon-with-zulu-openjdk-and-intellij-idea/image-1024x761.png deleted file mode 100644 index a1536d8e1..000000000 Binary files a/content/posts/2020/11/26/apple-silicon-with-zulu-openjdk-and-intellij-idea/image-1024x761.png and /dev/null differ diff --git a/content/posts/2020/11/26/apple-silicon-with-zulu-openjdk-and-intellij-idea/index.md b/content/posts/2020/11/26/apple-silicon-with-zulu-openjdk-and-intellij-idea/index.md index e0a1981cd..0b1defc9a 100644 --- a/content/posts/2020/11/26/apple-silicon-with-zulu-openjdk-and-intellij-idea/index.md +++ b/content/posts/2020/11/26/apple-silicon-with-zulu-openjdk-and-intellij-idea/index.md @@ -16,7 +16,7 @@ frozen: false Azul has been leading the OpenJDK community effort ([JEP 391](http://openjdk.java.net/jeps/391)) initiated in August 2020 to add support for Apple Silicon, Arm-based Macs, in future versions of OpenJDK. In addition to targeting future Java versions, Azul has made OpenJDK builds of currently popular Java versions, including Zulu builds of OpenJDK 8, 11, and 13, as well as 16-ea, widely available for use on Apple Silicon, Arm-based Macs. -[![](image-1024x761.png)](https://www.azul.com/downloads/zulu-community/?os=macos&architecture=arm-64-bit&package=jdk) +[![](image-1024x761.jpg)](https://www.azul.com/downloads/zulu-community/?os=macos&architecture=arm-64-bit&package=jdk) In June 2020, Apple announced a two-year plan to transition the CPUs in its Macintosh line of computers from Intel's x86-64 processors to Apple-designed chips that use the ARM64 architecture. At its "One More Thing" event on November 10 2020, Apple followed through on its promise and debuted new MacBook Air, MacBook Pro and Mac Mini Arm-based models powered by Apple Silicon. diff --git a/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-2.jpg b/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-2.jpg new file mode 100644 index 000000000..284cd42ff Binary files /dev/null and b/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-2.jpg differ diff --git a/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-2.png b/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-2.png deleted file mode 100644 index 9019e99ca..000000000 Binary files a/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-2.png and /dev/null differ diff --git a/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-3.jpg b/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-3.jpg new file mode 100644 index 000000000..d2b1a3a04 Binary files /dev/null and b/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-3.jpg differ diff --git a/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-3.png b/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-3.png deleted file mode 100644 index 1113e8e8b..000000000 Binary files a/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-3.png and /dev/null differ diff --git a/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-5.jpg b/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-5.jpg new file mode 100644 index 000000000..26fd6170c Binary files /dev/null and b/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-5.jpg differ diff --git a/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-5.png b/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-5.png deleted file mode 100644 index ab27a4247..000000000 Binary files a/content/posts/2020/11/27/the-second-wave-breaks-in-europe/ekg-2-5.png and /dev/null differ diff --git a/content/posts/2020/11/27/the-second-wave-breaks-in-europe/index.md b/content/posts/2020/11/27/the-second-wave-breaks-in-europe/index.md index a4e1dbd06..d1bce8f0a 100644 --- a/content/posts/2020/11/27/the-second-wave-breaks-in-europe/index.md +++ b/content/posts/2020/11/27/the-second-wave-breaks-in-europe/index.md @@ -28,10 +28,10 @@ In Europe, the number of people who tested positive is now declining. For this p The input string in the editable dropdown has the form "country1 \| country2 \| countryN". The pipe operator is a logical OR which than selects all data from country1 and countryN. As a result, the ECG then shows all the countries selected. With the mouse, you can now zoom into the interesting parts. Here is the data from 07/07/2020 until today (11/25/2020). -[![](ekg-2-2.png)](ekg-2-2.png) #New Positive tests per day: Netherlands, Switzerland, France, Austria, Italy, Germany, Spain +[![](ekg-2-2.jpg)](ekg-2-2.jpg) #New Positive tests per day: Netherlands, Switzerland, France, Austria, Italy, Germany, Spain The number of positive tests correlates directly with the total number of tests. Dividing the number of positive tests by the total number gives the infection rate. In the Our World in Data Covid-19 data, this metric is called the "positive rate". In the ECG you can see it directly: -[![](ekg-2-3.png)](ekg-2-3.png) "positive_rate" = number of positive tests / total number of tests +[![](ekg-2-3.jpg)](ekg-2-3.jpg) "positive_rate" = number of positive tests / total number of tests The data shows also here a flattening or breaking of the 2nd wave. Since at the present time, the data for the Netherlands (purple line) is available only up to 10/25/20, and the data for Germany (blue line) up to 11/15/20, one cannot make a clear statement here. (In next week's blog we will take another look at the curve and investigate whether the curve flattens or breaks.) @@ -41,7 +41,7 @@ A very useful feature is the date selection. The date period can be set by zoomi ### Some Countries Already Have Constant Or Even Falling Mortality Rates The number of people who have died of or with Covid-19 is also flattening out in all countries except Italy and Germany. -[![](ekg-2-5.png)](ekg-2-5.png) Number of deceased people (2nd wave) +[![](ekg-2-5.jpg)](ekg-2-5.jpg) Number of deceased people (2nd wave) It is interesting to note that Italy has almost three times as high a death rate as Germany. diff --git a/content/posts/2020/12/03/what-are-hidden-classes-in-java-15/ebook_upd-ee1842a7.png b/content/posts/2020/12/03/what-are-hidden-classes-in-java-15/ebook_upd-ee1842a7.png new file mode 100644 index 000000000..71e1274b2 Binary files /dev/null and b/content/posts/2020/12/03/what-are-hidden-classes-in-java-15/ebook_upd-ee1842a7.png differ diff --git a/content/posts/2020/12/03/what-are-hidden-classes-in-java-15/index.md b/content/posts/2020/12/03/what-are-hidden-classes-in-java-15/index.md index 86d4ba6e0..01bc02775 100644 --- a/content/posts/2020/12/03/what-are-hidden-classes-in-java-15/index.md +++ b/content/posts/2020/12/03/what-are-hidden-classes-in-java-15/index.md @@ -6,7 +6,7 @@ description: "Hidden classes allow frameworks to define classes as non-discovera canonical: "https://jfeatures.com/blog/HiddenClass" authors: - "vipin-sharma" -image: "https://jfeatures.com/img/ebook_upd.png" +image: "ebook_upd-ee1842a7.png" categories: - "JEPs" - "Tutorials" @@ -270,7 +270,7 @@ Knowing language features like this helps you get the best java jobs, that's why Download this step by step guide for free! -[![](https://jfeatures.com/img/ebook_upd.png)](https://jfeatures.com/) +[![](ebook_upd-ee1842a7.png)](https://jfeatures.com/) ### Resources diff --git a/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/1-europe-1.jpg b/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/1-europe-1.jpg new file mode 100644 index 000000000..c92769540 Binary files /dev/null and b/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/1-europe-1.jpg differ diff --git a/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/1-europe-1.png b/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/1-europe-1.png deleted file mode 100644 index 2bc32d5fa..000000000 Binary files a/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/1-europe-1.png and /dev/null differ diff --git a/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/2-russia-1.jpg b/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/2-russia-1.jpg new file mode 100644 index 000000000..bffada448 Binary files /dev/null and b/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/2-russia-1.jpg differ diff --git a/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/2-russia-1.png b/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/2-russia-1.png deleted file mode 100644 index 1ec8809d2..000000000 Binary files a/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/2-russia-1.png and /dev/null differ diff --git a/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/3-china-2nd-wave-2.jpg b/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/3-china-2nd-wave-2.jpg new file mode 100644 index 000000000..0b5583daa Binary files /dev/null and b/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/3-china-2nd-wave-2.jpg differ diff --git a/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/3-china-2nd-wave-2.png b/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/3-china-2nd-wave-2.png deleted file mode 100644 index bd8740a03..000000000 Binary files a/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/3-china-2nd-wave-2.png and /dev/null differ diff --git a/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/4-china-both-waves-2.jpg b/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/4-china-both-waves-2.jpg new file mode 100644 index 000000000..3b94fd469 Binary files /dev/null and b/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/4-china-both-waves-2.jpg differ diff --git a/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/4-china-both-waves-2.png b/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/4-china-both-waves-2.png deleted file mode 100644 index e573d1e83..000000000 Binary files a/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/4-china-both-waves-2.png and /dev/null differ diff --git a/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/index.md b/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/index.md index e9fc41598..064b15ee7 100644 --- a/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/index.md +++ b/content/posts/2020/12/04/where-is-the-2nd-wave-in-russia-and-china/index.md @@ -5,7 +5,7 @@ lastmod: "2020-12-04T17:12:51+00:00" description: "Last week, we took a look at the current situation in Europe. We saw that the second wave is already breaking in Europe. This trend continues." authors: - "johannes-weigend" -image: "1-europe-1.png" +image: "1-europe-1.jpg" categories: - "JavaFX" related_posts: @@ -23,7 +23,7 @@ Software-ECG is built on OpenJDK and JavaFX, leveraging the power of a compiled In [last week's blog post](https://foojay.io/today/the-second-wave-breaks-in-europe/), we took a look at the current situation in Europe and we saw that the second wave was already breaking. Over the past week, this trend has continued. The number of people testing positive is decreasing significantly in France (black line), Italy (top green line), and Great Britain (top purple line). -[![The 2nd Wave in Europe](1-europe-1.png)](1-europe-1.png) +[![The 2nd Wave in Europe](1-europe-1.jpg)](1-europe-1.jpg) *The 2nd Wave in Europe* @@ -34,7 +34,7 @@ But there are some countries where the graphs are different. These are Russia, S To analyze these countries exclusively, use the filter query "Russia\|Serbia\|Ukraine" and zoom into the period of time for the second wave only. In these countries, the positive test numbers are growing linearly. Neither can we see the typical increase at the beginning nor any flattening at a later point in time. We might assume that the data is gathered in a different way than other EU countries do. -[![Russia, Serbia and Ukraine show a almost linear growth](2-russia-1.png)](2-russia-1.png) +[![Russia, Serbia and Ukraine show a almost linear growth](2-russia-1.jpg)](2-russia-1.jpg) *Russia, Serbia and Ukraine show an almost linear growth* @@ -45,14 +45,14 @@ If we had the same metrics as in the EU, we could easily demonstrate this by ana ### Where is the 2nd Wave in China? Now, let's take a look at countries outside of Europe and analyze China. This country also has a very interesting chart because the second wave in China looks like this: -[![2nd Wave in China](3-china-2nd-wave-2.png)](3-china-2nd-wave-2.png) +[![2nd Wave in China](3-china-2nd-wave-2.jpg)](3-china-2nd-wave-2.jpg) *2nd Wave in China* The chart shows the number of new cases since September 2020. Make sure to look at the scale. Starting from 20 cases per day, it has now reached 100 cases per day. People could get nervous when they see the number of people tested positive is rising again. Do not get nervous, though! If you take a closer look at the same chart and change the start date to 1/1/2020, you can display both waves in a single chart. Now you will not see any second wave at all. -[![1st and 2nd Wave in China](4-china-both-waves-2.png)](4-china-both-waves-2.png) +[![1st and 2nd Wave in China](4-china-both-waves-2.jpg)](4-china-both-waves-2.jpg) *1st and 2nd Wave in China* diff --git a/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/index.md b/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/index.md index 7b5005bae..9b50e3f51 100644 --- a/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/index.md +++ b/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/index.md @@ -5,7 +5,7 @@ lastmod: "2021-01-21T12:02:33+00:00" description: "Some days ago I finished a CAD application whose purpose is to calculate the energy efficiency of Dwellings (or multiple Dwellings). It can be seen as an application similar to Autocad (which is used in Civil Engineering, Architecture, etc) but with the specific purpose to do energy efficiency assessment. I believe, having a good UX, features users have been dying to have, good, well structured code that lets you continuously evolve and better maintain what you already have and finally topping all that with a nice looking user interface, are the markers to a successful application. I think we’ve been able to score high in all those markers." authors: - "pedro-vieira" -image: "showcase-model-view-1024x555.png" +image: "showcase-model-view-1024x555.jpg" categories: - "JavaFX" - "Use Cases" @@ -16,7 +16,7 @@ frozen: false I'm a [Java (JavaFX) freelance consultant, Software Engineer and Software Designer](http://www.pixelduke.com/) and a few months ago I finished a CAD application for a client. This is a CAD application whose purpose is to calculate the energy efficiency of Dwellings (or multiple Dwellings). It can be seen as an application similar to Autocad (which is used in Civil Engineering, Architecture, etc) but with the specific purpose to do energy efficiency assessment. -![](showcase-model-view-1024x555.png) +![](showcase-model-view-1024x555.jpg) After about one year of development, my client (he himself an energy rater) and I were able to finish the project within a much smaller time frame and a much smaller budget than other similar projects from competing companies. It wouldn't be an exaggeration to say that its cost was about 30 times less and it took at least less than half the time. @@ -32,14 +32,14 @@ The purpose of the tool, called HERO, is to do the energy efficiency assessment ### High Level View -![](showcase-model-view2-1024x555.png) +![](showcase-model-view2-1024x555.jpg) If you follow my [blog](http://www.pixelduke.com), you've probably noticed from the picture that the application is using [JMetro](https://www.pixelduke.com/java-javafx-theme-jmetro/). The picture above is from the Model view. In this view you create the project and enter all its data. The pane to the left is where you can view the visuals, and create the floor plan (visually). The pane to the right is the Datagrid where you see and enter data for all the objects of the project (walls, windows, floors, top lights, etc) in a table like format. All these views are inside a Dockpane like container that allows you to resize, restore and maximize each pane. There are also other views, inside the Model view, not shown in the picture. Like the library where you can create and manage the materials that you can use throughout your project, your custom assemblies for walls, the different types of windows, etc. -![](showcase-results-view-1024x555.png) +![](showcase-results-view-1024x555.jpg) After you run the simulation, you can also see the results of your energy efficiency modelling (picture above). The Results View shows a dashboard, with charts, tables, etc, that lets the user view at a glance how efficient the dwelling or dwellings are and quickly notice what might need to be readjusted. diff --git a/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-model-view-1024x555.jpg b/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-model-view-1024x555.jpg new file mode 100644 index 000000000..59a14fbad Binary files /dev/null and b/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-model-view-1024x555.jpg differ diff --git a/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-model-view-1024x555.png b/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-model-view-1024x555.png deleted file mode 100644 index e61208a91..000000000 Binary files a/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-model-view-1024x555.png and /dev/null differ diff --git a/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-model-view2-1024x555.jpg b/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-model-view2-1024x555.jpg new file mode 100644 index 000000000..b71ab46f0 Binary files /dev/null and b/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-model-view2-1024x555.jpg differ diff --git a/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-model-view2-1024x555.png b/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-model-view2-1024x555.png deleted file mode 100644 index 4e803dc62..000000000 Binary files a/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-model-view2-1024x555.png and /dev/null differ diff --git a/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-results-view-1024x555.jpg b/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-results-view-1024x555.jpg new file mode 100644 index 000000000..fed763896 Binary files /dev/null and b/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-results-view-1024x555.jpg differ diff --git a/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-results-view-1024x555.png b/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-results-view-1024x555.png deleted file mode 100644 index c2aaccb89..000000000 Binary files a/content/posts/2020/12/09/creating-cad-applications-with-java-and-javafx/showcase-results-view-1024x555.png and /dev/null differ diff --git a/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/foojay-don-1-1-469x510.jpg b/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/foojay-don-1-1-469x510.jpg new file mode 100644 index 000000000..4250f34c6 Binary files /dev/null and b/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/foojay-don-1-1-469x510.jpg differ diff --git a/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/foojay-don-1-1-469x510.png b/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/foojay-don-1-1-469x510.png deleted file mode 100644 index 0986b9efb..000000000 Binary files a/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/foojay-don-1-1-469x510.png and /dev/null differ diff --git a/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/foojay-don-5-1024x592.jpg b/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/foojay-don-5-1024x592.jpg new file mode 100644 index 000000000..8963401d9 Binary files /dev/null and b/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/foojay-don-5-1024x592.jpg differ diff --git a/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/foojay-don-5-1024x592.png b/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/foojay-don-5-1024x592.png deleted file mode 100644 index 58b952629..000000000 Binary files a/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/foojay-don-5-1024x592.png and /dev/null differ diff --git a/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/index.md b/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/index.md index 07541558e..5b67bc2aa 100644 --- a/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/index.md +++ b/content/posts/2020/12/10/immutable-collections-in-java-with-sealed-types/index.md @@ -5,7 +5,7 @@ lastmod: "2021-07-12T05:11:09+00:00" description: "JDK 15 was released on September 15, 2020. JEP 360 Sealed Types was included as a preview feature in this release, with its second preview in JDK 16. Sealed Types is part of Project Amber. Sealed classes or interfaces can be used to restrict the interfaces or classes that are allowed to extend them. Also learn about the source code for an experimental implementation of a collections framework can be found in the Deck of Cards Kata repo." authors: - "don-raab" -image: "foojay-don-1-1-469x510.png" +image: "foojay-don-1-1-469x510.jpg" categories: - "Sealed Classes" - "Tutorials" @@ -17,7 +17,7 @@ related_posts: frozen: false --- -{{< img src="foojay-don-1-1-469x510.png" class="size-medium" width="469" height="510" >}} +{{< img src="foojay-don-1-1-469x510.jpg" class="size-medium" width="469" height="510" >}} *Designing Immutable Collection using Sealed Types in JDK 15* @@ -75,7 +75,7 @@ Experimenting with Sealed Types in JDK 15 has been interesting and encouraging. The source code for an experimental implementation of a collections framework can be found in the [Deck of Cards Kata repo](https://github.com/BNYMellon/CodeKatas/tree/master/deck-of-cards-kata). The Deck of Cards Kata can be taken to become familiar with multiple collections frameworks including the latest versions of the[Java Collections + Streams framework](https://medium.com/javarevisited/7-best-java-collections-and-stream-api-courses-for-beginners-in-2020-3ad18d52c38), Apache Commons Collections, Google Guava and Eclipse Collections. The custom collections framework interfaces and implementations can be browsed online [here](https://github.com/BNYMellon/CodeKatas/tree/master/deck-of-cards-kata/src/main/java/bnymellon/codekatas/deckofcards/custom/collections). The following class diagram shows the interfaces in the framework, including the immutable collection interfaces that leverage Sealed Types. -![](foojay-don-5-1024x592.png) A Custom Collections framework in the Deck of Cards Kata +![](foojay-don-5-1024x592.jpg) A Custom Collections framework in the Deck of Cards Kata The experimental collections framework in the kata has been evolving to use [Project Amber](https://openjdk.java.net/projects/amber/) features as they become available as preview features in the JDK. The kata was upgraded to JDK 15 the day it was released. The framework now uses the following features from Project Amber: diff --git a/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/foojay-io-2f099a2a.jpg b/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/foojay-io-2f099a2a.jpg new file mode 100644 index 000000000..11f7e7758 Binary files /dev/null and b/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/foojay-io-2f099a2a.jpg differ diff --git a/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/foojay-io-c8d8b55c.jpg b/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/foojay-io-c8d8b55c.jpg new file mode 100644 index 000000000..8df4aa50c Binary files /dev/null and b/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/foojay-io-c8d8b55c.jpg differ diff --git a/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/foojay-io-de3cf28b.jpg b/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/foojay-io-de3cf28b.jpg new file mode 100644 index 000000000..cc6f06b20 Binary files /dev/null and b/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/foojay-io-de3cf28b.jpg differ diff --git a/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/foojay-io-e200b6dd.jpg b/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/foojay-io-e200b6dd.jpg new file mode 100644 index 000000000..82ddd3034 Binary files /dev/null and b/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/foojay-io-e200b6dd.jpg differ diff --git a/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/index.md b/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/index.md index d24456ca6..7ebcb0f5c 100644 --- a/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/index.md +++ b/content/posts/2020/12/11/separate-covid-19-waves-in-europe-and-south-america/index.md @@ -27,7 +27,7 @@ This week, we are going to compare Europe with South America. ### Europe During the summer months of 2020, the pandemic paused throughout Europe. This applies to all countries, except for Russia. Russia had 100+ Covid-19 related deaths/day during the summer months July and August. -[![Daily deaths in Europe (excluding Russia) related to Covid-19](https://foojay.io/?attachment_id=36582)](https://foojay.io/?attachment_id=36582) +[![Daily deaths in Europe (excluding Russia) related to Covid-19](foojay-io-2f099a2a.jpg)](foojay-io-2f099a2a.jpg) *Daily deaths in Europe (excluding Russia) related to Covid-19* @@ -40,7 +40,7 @@ The strong oscillation of the curves can be observed in a weekly rhythm for all Except for Russia, the number of deaths decreased and almost reached zero during summer. However, in autumn, the second wave started in Europe. In Software-ECG COVID-19 Edition, you can create an aggregated view of all these values. The result will look as shown in the following graph: -[![Total deaths (sum) in Europe related to Covid-19](https://foojay.io/?attachment_id=36583)](https://foojay.io/?attachment_id=36583) +[![Total deaths (sum) in Europe related to Covid-19](foojay-io-de3cf28b.jpg)](foojay-io-de3cf28b.jpg) *Total deaths (sum) in Europe related to Covid-19* @@ -51,7 +51,7 @@ The seasonal component cannot be ignored as it is not surprising for a disease t Now, we would like to ask the following question—can the same behavior also be seen in South America? Let us surprise you with the following graph: -[![Total deaths in South America related to Covid-19](https://foojay.io/?attachment_id=36584)](https://foojay.io/?attachment_id=36584) +[![Total deaths in South America related to Covid-19](foojay-io-e200b6dd.jpg)](foojay-io-e200b6dd.jpg) *Total deaths in South America related to Covid-19* @@ -60,7 +60,7 @@ A wave is most likely to be seen in Brazil (brown line) during the winter months In some countries, there are significant outliers in the curves. Such data anomalies probably are due to adjustments and corrections that were combined into one corrected value later. In sum, it looks less like a wave than a continuous event. For this purpose, you can add up all curves with the Combine Metrics -\> Add up (exact) function of the ECG: -[![Total deaths (sum) in Europe related to Covid-19](https://foojay.io/?attachment_id=36585)](https://foojay.io/?attachment_id=36585) +[![Total deaths (sum) in Europe related to Covid-19](foojay-io-c8d8b55c.jpg)](foojay-io-c8d8b55c.jpg) *Total deaths (sum) in Europe related to Covid-19* diff --git a/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/Screen-Shot-2020-12-07-at-3.57.09-PM-286x510.jpg b/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/Screen-Shot-2020-12-07-at-3.57.09-PM-286x510.jpg new file mode 100644 index 000000000..e4a76251b Binary files /dev/null and b/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/Screen-Shot-2020-12-07-at-3.57.09-PM-286x510.jpg differ diff --git a/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/Screen-Shot-2020-12-07-at-3.57.09-PM-286x510.png b/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/Screen-Shot-2020-12-07-at-3.57.09-PM-286x510.png deleted file mode 100644 index 863a49fcc..000000000 Binary files a/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/Screen-Shot-2020-12-07-at-3.57.09-PM-286x510.png and /dev/null differ diff --git a/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/Screen-Shot-2020-12-08-at-12.48.07-PM-499x510.jpg b/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/Screen-Shot-2020-12-08-at-12.48.07-PM-499x510.jpg new file mode 100644 index 000000000..9051e0a7a Binary files /dev/null and b/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/Screen-Shot-2020-12-08-at-12.48.07-PM-499x510.jpg differ diff --git a/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/Screen-Shot-2020-12-08-at-12.48.07-PM-499x510.png b/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/Screen-Shot-2020-12-08-at-12.48.07-PM-499x510.png deleted file mode 100644 index c5c5db149..000000000 Binary files a/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/Screen-Shot-2020-12-08-at-12.48.07-PM-499x510.png and /dev/null differ diff --git a/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/index.md b/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/index.md index 0acdf85bd..4d032a1ab 100644 --- a/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/index.md +++ b/content/posts/2020/12/14/creating-a-javafx-world-clock-from-scratch-part-1/index.md @@ -5,7 +5,7 @@ lastmod: "2022-04-30T03:38:36+00:00" description: "I would like to show you how I created a \"sci-fi\" looking world clock that happens to be a cross-platform Java desktop application." authors: - "carldea" -image: "Screen-Shot-2020-12-07-at-3.57.09-PM-286x510.png" +image: "Screen-Shot-2020-12-07-at-3.57.09-PM-286x510.jpg" categories: - "IntelliJ IDEA" - "JavaFX" @@ -24,7 +24,7 @@ frozen: false Welcome to *Creating a JavaFX World Clock from Scratch (Part 1)*! In this series of blog entries I would like to show you how I created a "sci-fi" looking world clock that happens to be a cross-platform Java desktop application. -{{< img src="Screen-Shot-2020-12-07-at-3.57.09-PM-286x510.png" class="size-medium" alt="A JavaFX based World Clock" width="286" height="510" >}} +{{< img src="Screen-Shot-2020-12-07-at-3.57.09-PM-286x510.jpg" class="size-medium" alt="A JavaFX based World Clock" width="286" height="510" >}} Here I will explain my thought process, development workflow, and of course JavaFX code details. Since it's still in the early stages, you can tune in by commenting or joining foojay's Slack channel at foojay.slack.com [\[2\]](https://foojay.slack.com/archives/C01GEEGDCHJ "foojay Slack channel #openjfx"), where I and others (Java experts \& Friends Of OpenJDK/OpenJFX) can offer advice. @@ -199,7 +199,7 @@ The hour hand tip is a glowing orange colored ball shape with a radial gradient When experimenting with Scene Builder, you get to play with changing a shapes fill color, stroke color, width, and much more. Below shows how to change the hour hand's tip (circle node) to appear as a spherical glowing ball. -{{< img src="Screen-Shot-2020-12-08-at-12.48.07-PM-499x510.png" class="size-medium" alt="Scene Builder Altering fill color" width="499" height="510" >}} +{{< img src="Screen-Shot-2020-12-08-at-12.48.07-PM-499x510.jpg" class="size-medium" alt="Scene Builder Altering fill color" width="499" height="510" >}} Scene Builder's fill color process diff --git a/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-deaths-oceania.jpg b/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-deaths-oceania.jpg new file mode 100644 index 000000000..cc59f9f1a Binary files /dev/null and b/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-deaths-oceania.jpg differ diff --git a/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-deaths-oceania.png b/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-deaths-oceania.png deleted file mode 100644 index eeec66d6c..000000000 Binary files a/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-deaths-oceania.png and /dev/null differ diff --git a/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-oceania-aggregated.jpg b/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-oceania-aggregated.jpg new file mode 100644 index 000000000..266237ed7 Binary files /dev/null and b/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-oceania-aggregated.jpg differ diff --git a/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-oceania-aggregated.png b/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-oceania-aggregated.png deleted file mode 100644 index ab88c68e2..000000000 Binary files a/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-oceania-aggregated.png and /dev/null differ diff --git a/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-tests-oceania.jpg b/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-tests-oceania.jpg new file mode 100644 index 000000000..4eeaa8fb0 Binary files /dev/null and b/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-tests-oceania.jpg differ diff --git a/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-tests-oceania.png b/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-tests-oceania.png deleted file mode 100644 index a2ab88bcb..000000000 Binary files a/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/CW51-software-ecg-tests-oceania.png and /dev/null differ diff --git a/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/index.md b/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/index.md index fb5feb409..deb8e8f0c 100644 --- a/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/index.md +++ b/content/posts/2020/12/18/summer-with-covid-19-in-australia-new-zealand-and-polynesia/index.md @@ -5,7 +5,7 @@ lastmod: "2020-12-18T08:57:48+00:00" description: "\"Oceania\" as a collective term for Australia, New Zealand, and Polynesia. In this part, we use Software-ECG to analyze Covid-19 there." authors: - "johannes-weigend" -image: "CW51-software-ecg-deaths-oceania.png" +image: "CW51-software-ecg-deaths-oceania.jpg" categories: - "JavaFX" related_posts: @@ -47,7 +47,7 @@ You can use this feature to look at the number of deaths in all countries with t You can stack different countries by choosing a sum chart instead of a standard line chart. -[![](CW51-software-ecg-deaths-oceania.png)](CW51-software-ecg-deaths-oceania.png) +[![](CW51-software-ecg-deaths-oceania.jpg)](CW51-software-ecg-deaths-oceania.jpg) *Daily Covid-19 related deaths in Oceania as stacked graph* The curve shows the daily death counts associated with COVID-19 as a stacked graph. The highest value is still very low at 59. Since the curve is almost entirely made up of a yellow area, you can see that essentially only Australia was really affected. @@ -58,7 +58,7 @@ This curve looks today very good and it shows what you would actually expect dur Looking at the testing situation, it is noticeable that Australia and New Zealand dominate the graph with regard to the daily number of tests performed. Also, the number of tests is relatively constant. This is good because it allows us to estimate the true prevalence of the virus from the graph of the current number of cases, since the number of tests correlates with the number of cases. -[![](CW51-software-ecg-tests-oceania.png)](CW51-software-ecg-tests-oceania.png) +[![](CW51-software-ecg-tests-oceania.jpg)](CW51-software-ecg-tests-oceania.jpg) *Number of executed PCR tests per day over all countries in Oceania* The cumulative view of the case numbers also shows very well that COVID-19 in Oceania has currently subsided to a background activity. @@ -67,7 +67,7 @@ We have too little information about the political decisions and actions that ma In sum, however, you can see that fear of COVID-19 in these countries does not seem to be appropriate: -[![](CW51-software-ecg-oceania-aggregated.png)](CW51-software-ecg-oceania-aggregated.png) +[![](CW51-software-ecg-oceania-aggregated.jpg)](CW51-software-ecg-oceania-aggregated.jpg) *Number of positive PCR test cases in Oceania* As Europeans, you might become envious, but let us not forget we also had a nice summer and were able to let some normality return to our lives. With this in mind, the people in Oceania should also be granted some normality. diff --git a/content/posts/2020/12/23/light-up-your-christmas-tree-with-java-and-raspberry-pi/commodore64.jpg b/content/posts/2020/12/23/light-up-your-christmas-tree-with-java-and-raspberry-pi/commodore64.jpg new file mode 100644 index 000000000..a39716e3e Binary files /dev/null and b/content/posts/2020/12/23/light-up-your-christmas-tree-with-java-and-raspberry-pi/commodore64.jpg differ diff --git a/content/posts/2020/12/23/light-up-your-christmas-tree-with-java-and-raspberry-pi/commodore64.png b/content/posts/2020/12/23/light-up-your-christmas-tree-with-java-and-raspberry-pi/commodore64.png deleted file mode 100644 index eb70785a1..000000000 Binary files a/content/posts/2020/12/23/light-up-your-christmas-tree-with-java-and-raspberry-pi/commodore64.png and /dev/null differ diff --git a/content/posts/2020/12/23/light-up-your-christmas-tree-with-java-and-raspberry-pi/index.md b/content/posts/2020/12/23/light-up-your-christmas-tree-with-java-and-raspberry-pi/index.md index 3a163aaf0..dba4a0fdd 100644 --- a/content/posts/2020/12/23/light-up-your-christmas-tree-with-java-and-raspberry-pi/index.md +++ b/content/posts/2020/12/23/light-up-your-christmas-tree-with-java-and-raspberry-pi/index.md @@ -85,7 +85,7 @@ This product reminded me of my very first computer 35 years ago, the Commodore 6 {{< gallery cols="3" caption="Raspberry Pi 400 versus Commodore 64" >}} pi_400_front.jpg pi_400_back.jpg -commodore64.png +commodore64.jpg {{< /gallery >}} ### **Install additional tools** diff --git a/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-19-at-10.23.06-PM-626x510.jpg b/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-19-at-10.23.06-PM-626x510.jpg new file mode 100644 index 000000000..b71740abb Binary files /dev/null and b/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-19-at-10.23.06-PM-626x510.jpg differ diff --git a/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-19-at-10.23.06-PM-626x510.png b/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-19-at-10.23.06-PM-626x510.png deleted file mode 100644 index cad7d9f8c..000000000 Binary files a/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-19-at-10.23.06-PM-626x510.png and /dev/null differ diff --git a/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-19-at-9.35.09-PM-280x510.jpg b/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-19-at-9.35.09-PM-280x510.jpg new file mode 100644 index 000000000..aaf593494 Binary files /dev/null and b/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-19-at-9.35.09-PM-280x510.jpg differ diff --git a/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-19-at-9.35.09-PM-280x510.png b/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-19-at-9.35.09-PM-280x510.png deleted file mode 100644 index 017de099b..000000000 Binary files a/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-19-at-9.35.09-PM-280x510.png and /dev/null differ diff --git a/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-21-at-12.18.03-AM.jpg b/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-21-at-12.18.03-AM.jpg new file mode 100644 index 000000000..a84de966f Binary files /dev/null and b/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-21-at-12.18.03-AM.jpg differ diff --git a/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-21-at-12.18.03-AM.png b/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-21-at-12.18.03-AM.png deleted file mode 100644 index ca96db53f..000000000 Binary files a/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/Screen-Shot-2020-12-21-at-12.18.03-AM.png and /dev/null differ diff --git a/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/index.md b/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/index.md index 388c68c07..9029dd616 100644 --- a/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/index.md +++ b/content/posts/2020/12/24/creating-a-javafx-world-clock-from-scratch-part-2/index.md @@ -29,7 +29,7 @@ If you have not read Part 1[\[2\]](https://foojay.io/today/creating-a-javafx-wor In Part 2, I will show you how I animate the clock face's hands using basic trigonometry. If you want to skip the tutorial and go straight to the source code head over to GitHub WorldClock [\[4\]](https://github.com/carldea/worldclock "JavaFX WorldClock") -{{< img src="Screen-Shot-2020-12-19-at-9.35.09-PM-280x510.png" class="size-medium" alt="Creating a JavaFX World Clock from Scratch (Part 2)" width="280" height="510" >}} +{{< img src="Screen-Shot-2020-12-19-at-9.35.09-PM-280x510.jpg" class="size-medium" alt="Creating a JavaFX World Clock from Scratch (Part 2)" width="280" height="510" >}} *Creating a JavaFX World Clock from Scratch (Part 2)* @@ -61,7 +61,7 @@ To change the length of the arc position around the clock face you will need to | startAngle | 0.0 | Start angle (in degrees). Zero is at the 3'o clock position moving counter clockwise | | length | 90.0 | Extent angle (in degrees). The angle offset from the start angle going counter clockwise | -{{< img src="Screen-Shot-2020-12-19-at-10.23.06-PM-626x510.png" class="size-medium" alt="Drawing the Hour Hand Arc" width="626" height="510" >}} +{{< img src="Screen-Shot-2020-12-19-at-10.23.06-PM-626x510.jpg" class="size-medium" alt="Drawing the Hour Hand Arc" width="626" height="510" >}} *Drawing the Hour Hand* @@ -136,7 +136,7 @@ int extentAngle = extentAngleHour.apply(1); // 30 degrees ``` The following is an example of step-by-step calculations using the above equations to determine the **startAngle** and **extentAngle** at 1:00, 2:00, and 3:00 o'clock. -![Calculating Start and Length angles for Hour Hand Arc](Screen-Shot-2020-12-21-at-12.18.03-AM.png) +![Calculating Start and Length angles for Hour Hand Arc](Screen-Shot-2020-12-21-at-12.18.03-AM.jpg) *Calculating Start and Length angles for Hour Hand Arc* diff --git a/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/DMJ7VOymBspNHSqlFxyOC-FyOSweRv5mzfln4Z__-7c85eed4.png b/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/DMJ7VOymBspNHSqlFxyOC-FyOSweRv5mzfln4Z__-7c85eed4.png new file mode 100644 index 000000000..4f98ebdbf Binary files /dev/null and b/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/DMJ7VOymBspNHSqlFxyOC-FyOSweRv5mzfln4Z__-7c85eed4.png differ diff --git a/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/Ppz8LxO_-sLRcdqC12-gDuXAhmN-E6WiGFZAfjxI-edc21519.png b/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/Ppz8LxO_-sLRcdqC12-gDuXAhmN-E6WiGFZAfjxI-edc21519.png new file mode 100644 index 000000000..a4041a753 Binary files /dev/null and b/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/Ppz8LxO_-sLRcdqC12-gDuXAhmN-E6WiGFZAfjxI-edc21519.png differ diff --git a/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/index.md b/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/index.md index e8bc794b6..f312e104a 100644 --- a/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/index.md +++ b/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/index.md @@ -39,12 +39,12 @@ Even if you would like to build your application inside a Docker container, you I want to create a Docker Java image for my java-code-workshop application. It is a spring-boot based application build with maven that needs Java version 8. The naive way to create this Docker Java image would be something like this: -![](https://lh6.googleusercontent.com/DMJ7VOymBspNHSqlFxyOC-FyOSweRv5mzfln4Z__XTqI17A5BaCk9cQICri-u55ETYVO9XEjQmp83w2a687IVQjF7vR_L1N0WetHTTzFxpas7k7qqrEbh9dFPAZ_7rIzsogKWgsj) +![](DMJ7VOymBspNHSqlFxyOC-FyOSweRv5mzfln4Z__-7c85eed4.png) I picked a base image that includes maven and openjdk8, copy my source into the image, and call maven to build and run my application. This example works perfectly fine. My application will launch and runs smoothly. However, the Docker image that I just created has a size of 631 MB. Let's change this Dockerfile and use a multi-stage build: -![](https://lh4.googleusercontent.com/pxZ5K5IuS4i9HCwAucIBvg6j67kKHrs_ASAAR9sTJQbt_-yP15Llam0ZVXe_sH9kPunc-Lo0HflytCYgIxQUnY3iRU8dwdSMt8eglIum6wIPyNMmFTLHwO0DG4l_4hJuZiCnddBp) +![](pxZ5K5IuS4i9HCwAucIBvg6j67kKHrs_ASAAR9sT-3ada583d.png) What happens now is that I still use the maven-openjdk8 image to build my project. However, this will not be the output. I create a new image based on a significantly smaller java 8 JRE image and copy only the executable spring-boot jar. Now I just have to execute the `jar-file`, and I am done! The result is a Docker image that does not include the JDK or maven but only the JRE. The image size reduces dramatically to 132 MB. @@ -57,7 +57,7 @@ You can also use this when you have to include secrets for accessing a private r When creating a Docker container, by default, you will run it as root. Although this is convenient for development, you do not want this in your production images. Suppose, for whatever reason, an attacker has access to a terminal or can execute code. In that case, it has significant privileges over that running container, as well as potentially accessing host filesystems via filesystem bind mounts with inappropriately high access rights. The easiest way to do to prevent this is to create a specific user like here: -![](https://lh5.googleusercontent.com/Ppz8LxO_-sLRcdqC12-gDuXAhmN-E6WiGFZAfjxIQ5My_u6gqTXJJdM0zOEAgSQ_bL1WYMFhdxjntP1pXN2MTjJb6T4R2sDiddUKMwtPyloMw5tv6LQ6UXx2FCsq4PpdPih5kYYB) +![](Ppz8LxO_-sLRcdqC12-gDuXAhmN-E6WiGFZAfjxI-edc21519.png) On the third line, I am creating a new group and adding a user. This user is a system user (-r) without a password and home directory. I am also adding it to the newly created group. @@ -77,7 +77,7 @@ If I want to scan an `adoptopenjdk` image as I mentioned in the first section, t $ snyk container test adoptopenjdk/opendjdk11:latest Output: -![](https://lh6.googleusercontent.com/xrnalf7_hXKJ9wddZ8l2cAV6DlxwVbNipgr31sDdnBmOGG-PvWIXaZwHv2vWDtgKGe5cZQu3lSJi80jXi_dl3VAO6jKl6IFu8AAoz-RTHbFfMla9QICBWRTCS-z4rIFin9vxiUi3) +![](xrnalf7_hXKJ9wddZ8l2cAV6DlxwVbNipgr31sDd-10328bff.png) You can both test and monitor the Docker image. For monitoring, you use `snyk container monitor `. Monitoring takes a snapshot and monitors if new vulnerabilities or fixes are available for your image over time. diff --git a/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/pxZ5K5IuS4i9HCwAucIBvg6j67kKHrs_ASAAR9sT-3ada583d.png b/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/pxZ5K5IuS4i9HCwAucIBvg6j67kKHrs_ASAAR9sT-3ada583d.png new file mode 100644 index 000000000..7e3b6e22b Binary files /dev/null and b/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/pxZ5K5IuS4i9HCwAucIBvg6j67kKHrs_ASAAR9sT-3ada583d.png differ diff --git a/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/xrnalf7_hXKJ9wddZ8l2cAV6DlxwVbNipgr31sDd-10328bff.png b/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/xrnalf7_hXKJ9wddZ8l2cAV6DlxwVbNipgr31sDd-10328bff.png new file mode 100644 index 000000000..c481d84ed Binary files /dev/null and b/content/posts/2020/12/25/5-tips-to-create-secure-docker-images-for-java-applications/xrnalf7_hXKJ9wddZ8l2cAV6DlxwVbNipgr31sDd-10328bff.png differ diff --git a/content/posts/2021/01/04/local-variable-type-inference-declare-var-not-war/default-yellow-8f95b1d6.png b/content/posts/2021/01/04/local-variable-type-inference-declare-var-not-war/default-yellow-8f95b1d6.png new file mode 100644 index 000000000..21ed36b7e Binary files /dev/null and b/content/posts/2021/01/04/local-variable-type-inference-declare-var-not-war/default-yellow-8f95b1d6.png differ diff --git a/content/posts/2021/01/04/local-variable-type-inference-declare-var-not-war/index.md b/content/posts/2021/01/04/local-variable-type-inference-declare-var-not-war/index.md index 0c7f971fb..1c64ce103 100644 --- a/content/posts/2021/01/04/local-variable-type-inference-declare-var-not-war/index.md +++ b/content/posts/2021/01/04/local-variable-type-inference-declare-var-not-war/index.md @@ -6,7 +6,7 @@ description: "In this article, I will try to explain the new feature, from Java canonical: "https://ashishtechmill.com/local-variable-type-inference-declare-var-not-war" authors: - "yrashish" -image: "https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" +image: "default-yellow-8f95b1d6.png" categories: - "JEPs" related_posts: @@ -120,7 +120,7 @@ In this article, we have covered what is the Local-Variable Type Inference new J #### Support me If you like what you've just read, you can buy me a coffee! 🙂 -[![Buy Me A Coffee](https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png)](https://www.buymeacoffee.com/meashish) +[![Buy Me A Coffee](default-yellow-8f95b1d6.png)](https://www.buymeacoffee.com/meashish) #### Further Reading diff --git a/content/posts/2021/01/08/how-to-bring-your-java-microservices-to-the-cloud/index.md b/content/posts/2021/01/08/how-to-bring-your-java-microservices-to-the-cloud/index.md index 893c0377f..772ba2fa6 100644 --- a/content/posts/2021/01/08/how-to-bring-your-java-microservices-to-the-cloud/index.md +++ b/content/posts/2021/01/08/how-to-bring-your-java-microservices-to-the-cloud/index.md @@ -6,7 +6,7 @@ description: "Cloud and microservices come up more in architectural decisions. I canonical: "https://blog.payara.fish/java-microservices-cloud" authors: - "jadon-ortlepp" -image: "pizza-service.png" +image: "pizza-service.jpg" categories: - "Microservices" - "Tutorials" diff --git a/content/posts/2021/01/08/how-to-bring-your-java-microservices-to-the-cloud/pizza-service.jpg b/content/posts/2021/01/08/how-to-bring-your-java-microservices-to-the-cloud/pizza-service.jpg new file mode 100644 index 000000000..01eac72d7 Binary files /dev/null and b/content/posts/2021/01/08/how-to-bring-your-java-microservices-to-the-cloud/pizza-service.jpg differ diff --git a/content/posts/2021/01/08/how-to-bring-your-java-microservices-to-the-cloud/pizza-service.png b/content/posts/2021/01/08/how-to-bring-your-java-microservices-to-the-cloud/pizza-service.png deleted file mode 100644 index 016259615..000000000 Binary files a/content/posts/2021/01/08/how-to-bring-your-java-microservices-to-the-cloud/pizza-service.png and /dev/null differ diff --git a/content/posts/2021/01/11/device-monitoring-with-javafx-and-fxgl/index.md b/content/posts/2021/01/11/device-monitoring-with-javafx-and-fxgl/index.md index 486b9c523..362cd0bda 100644 --- a/content/posts/2021/01/11/device-monitoring-with-javafx-and-fxgl/index.md +++ b/content/posts/2021/01/11/device-monitoring-with-javafx-and-fxgl/index.md @@ -261,7 +261,7 @@ When the application starts, you have the choice to select between an IP address {{< gallery cols="3" caption=`Screenshots of the application with "Mock Data"` >}} mock-selection-1024x462.png -mock-overview-1024x599.png +mock-overview-1024x599.jpg mock-cpu-graph-1024x659.png {{< /gallery >}} diff --git a/content/posts/2021/01/11/device-monitoring-with-javafx-and-fxgl/mock-overview-1024x599.jpg b/content/posts/2021/01/11/device-monitoring-with-javafx-and-fxgl/mock-overview-1024x599.jpg new file mode 100644 index 000000000..79b988679 Binary files /dev/null and b/content/posts/2021/01/11/device-monitoring-with-javafx-and-fxgl/mock-overview-1024x599.jpg differ diff --git a/content/posts/2021/01/11/device-monitoring-with-javafx-and-fxgl/mock-overview-1024x599.png b/content/posts/2021/01/11/device-monitoring-with-javafx-and-fxgl/mock-overview-1024x599.png deleted file mode 100644 index 6b5b3b3ab..000000000 Binary files a/content/posts/2021/01/11/device-monitoring-with-javafx-and-fxgl/mock-overview-1024x599.png and /dev/null differ diff --git a/content/posts/2021/01/18/high-performance-rendering-in-javafx/index.md b/content/posts/2021/01/18/high-performance-rendering-in-javafx/index.md index 5fda1d9a4..9b59c3d22 100644 --- a/content/posts/2021/01/18/high-performance-rendering-in-javafx/index.md +++ b/content/posts/2021/01/18/high-performance-rendering-in-javafx/index.md @@ -5,7 +5,7 @@ lastmod: "2021-01-26T13:30:59+00:00" description: "Different rendering techniques in JavaFX using Canvas API, AWT Graphics2D, PixelBuffer and PixelBuffer GPU." authors: - "almasbaimagambetov" -image: "https://raw.githubusercontent.com/AlmasB/git-server/master/storage/images/javafx_render_particles.png" +image: "javafx_render_particles-ecf6b228.jpg" categories: - "JavaFX" - "Performance" @@ -31,7 +31,7 @@ The evaluation suggests the following order of approaches from fastest to slowes All of the source code developed for this article can be found on [GitHub](https://github.com/AlmasB/FXGL-FastRender). An example demo with 1 000 000 particles looks like this: -![1M Particles in JavaFX](https://raw.githubusercontent.com/AlmasB/git-server/master/storage/images/javafx_render_particles.png) +![1M Particles in JavaFX](javafx_render_particles-ecf6b228.jpg) ## Introduction diff --git a/content/posts/2021/01/18/high-performance-rendering-in-javafx/javafx_render_particles-ecf6b228.jpg b/content/posts/2021/01/18/high-performance-rendering-in-javafx/javafx_render_particles-ecf6b228.jpg new file mode 100644 index 000000000..ce92cabb1 Binary files /dev/null and b/content/posts/2021/01/18/high-performance-rendering-in-javafx/javafx_render_particles-ecf6b228.jpg differ diff --git a/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/1-EaQd3mLLRO9rjuUuW4v8mw-f28c708d.png b/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/1-EaQd3mLLRO9rjuUuW4v8mw-f28c708d.png new file mode 100644 index 000000000..df1d458c9 Binary files /dev/null and b/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/1-EaQd3mLLRO9rjuUuW4v8mw-f28c708d.png differ diff --git a/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/Screenshot-2021-01-16-at-2.48.04-AM-700x408.jpg b/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/Screenshot-2021-01-16-at-2.48.04-AM-700x408.jpg new file mode 100644 index 000000000..6251c925d Binary files /dev/null and b/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/Screenshot-2021-01-16-at-2.48.04-AM-700x408.jpg differ diff --git a/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/Screenshot-2021-01-16-at-2.48.04-AM-700x408.png b/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/Screenshot-2021-01-16-at-2.48.04-AM-700x408.png deleted file mode 100644 index 2bee4add2..000000000 Binary files a/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/Screenshot-2021-01-16-at-2.48.04-AM-700x408.png and /dev/null differ diff --git a/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/default-yellow-8f95b1d6.png b/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/default-yellow-8f95b1d6.png new file mode 100644 index 000000000..21ed36b7e Binary files /dev/null and b/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/default-yellow-8f95b1d6.png differ diff --git a/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/index.md b/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/index.md index 80367882b..763203830 100644 --- a/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/index.md +++ b/content/posts/2021/01/19/ci-cd-workflow-for-spring-boot-applications-on-kubernetes-via-skaffold/index.md @@ -27,7 +27,7 @@ It is a known fact that developing applications with Kubernetes is cumbersome. T As I said earlier developing applications with Kubernetes is not so easy task and that's where Skaffold comes into play as it eases the development and deployment of your applications running on Kubernetes. It manages the entire workflow and you get instant feedback while developing and deploying your application locally or on a remote Kubernetes cluster. -![Image for post](https://miro.medium.com/max/1288/1*EaQd3mLLRO9rjuUuW4v8mw.png) +![Image for post](1-EaQd3mLLRO9rjuUuW4v8mw-f28c708d.png) Following are some of the benefits of using Skaffold. @@ -307,7 +307,7 @@ Just run following commands and that's it. Make sure docker and minikube are up Following are the screenshots from Cloud Shell. -![Cloud shell output](Screenshot-2021-01-16-at-2.48.04-AM-700x408.png) +![Cloud shell output](Screenshot-2021-01-16-at-2.48.04-AM-700x408.jpg) {{< img src="Screenshot-2021-01-16-at-2.48.36-AM-700x92.png" class="size-medium" alt="curl output" width="700" height="92" >}} @@ -322,7 +322,7 @@ In this article, I have just covered a handful of features that Skaffold provide #### Support me If you like what you just read then you can buy me a coffee -[![Buy Me A Coffee](https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png)](https://www.buymeacoffee.com/meashish) +[![Buy Me A Coffee](default-yellow-8f95b1d6.png)](https://www.buymeacoffee.com/meashish) **Further reading** diff --git a/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/image-7-1024x433.jpg b/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/image-7-1024x433.jpg new file mode 100644 index 000000000..76a5d43b8 Binary files /dev/null and b/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/image-7-1024x433.jpg differ diff --git a/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/image-7-1024x433.png b/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/image-7-1024x433.png deleted file mode 100644 index b000b0d60..000000000 Binary files a/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/image-7-1024x433.png and /dev/null differ diff --git a/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/image-8-1024x411.jpg b/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/image-8-1024x411.jpg new file mode 100644 index 000000000..34f307bc2 Binary files /dev/null and b/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/image-8-1024x411.jpg differ diff --git a/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/image-8-1024x411.png b/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/image-8-1024x411.png deleted file mode 100644 index d57ce2f23..000000000 Binary files a/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/image-8-1024x411.png and /dev/null differ diff --git a/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/index.md b/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/index.md index da17ce479..7d8c5c3a1 100644 --- a/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/index.md +++ b/content/posts/2021/01/21/explaining-java-deserialization-vulnerabilities-part-1/index.md @@ -6,7 +6,7 @@ description: "Java serialization—and specifically deserialization—is “the canonical: "https://snyk.io/blog/serialization-and-deserialization-in-java/" authors: - "bmvermeer" -image: "image-7-1024x433.png" +image: "image-7-1024x433.jpg" categories: - "Security" related_posts: @@ -62,10 +62,10 @@ fileOut.close(); ``` When reading the file `ValueObject.ser` containing the serialized object with a hex-editor the output is this: -![](image-7-1024x433.png) +![](image-7-1024x433.jpg) Now I can easily manipulate the string value. Below I change it from `Hi` to `Hallo`: -![](image-8-1024x411.png) +![](image-8-1024x411.jpg) ```java FileInputStream fileIn = new FileInputStream("ValueObject2.ser"); diff --git a/content/posts/2021/01/25/intellij-idea-beyond-the-basics/G9gx6EM-2e3d394b.jpg b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/G9gx6EM-2e3d394b.jpg new file mode 100644 index 000000000..8e951af30 Binary files /dev/null and b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/G9gx6EM-2e3d394b.jpg differ diff --git a/content/posts/2021/01/25/intellij-idea-beyond-the-basics/dgdo7L3-737c0c98.jpg b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/dgdo7L3-737c0c98.jpg new file mode 100644 index 000000000..3e65e7f30 Binary files /dev/null and b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/dgdo7L3-737c0c98.jpg differ diff --git a/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-0ea2c2c7.gif b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-0ea2c2c7.gif new file mode 100644 index 000000000..739a7a993 Binary files /dev/null and b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-0ea2c2c7.gif differ diff --git a/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-2aea3237.gif b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-2aea3237.gif new file mode 100644 index 000000000..43a56e51f Binary files /dev/null and b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-2aea3237.gif differ diff --git a/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-3818344a.gif b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-3818344a.gif new file mode 100644 index 000000000..303f7f9e9 Binary files /dev/null and b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-3818344a.gif differ diff --git a/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-3991fe92.gif b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-3991fe92.gif new file mode 100644 index 000000000..7545edcdc Binary files /dev/null and b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-3991fe92.gif differ diff --git a/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-5dad1894.gif b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-5dad1894.gif new file mode 100644 index 000000000..9862e7aed Binary files /dev/null and b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-5dad1894.gif differ diff --git a/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-b21b0dbd.gif b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-b21b0dbd.gif new file mode 100644 index 000000000..8012aad1a Binary files /dev/null and b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-b21b0dbd.gif differ diff --git a/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-e8de7021.gif b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-e8de7021.gif new file mode 100644 index 000000000..d9066a0fb Binary files /dev/null and b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/giphy-e8de7021.gif differ diff --git a/content/posts/2021/01/25/intellij-idea-beyond-the-basics/index.md b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/index.md index 0e277f0be..3dc52129c 100644 --- a/content/posts/2021/01/25/intellij-idea-beyond-the-basics/index.md +++ b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/index.md @@ -27,35 +27,35 @@ In this article, I'll talk about some tricks I use in my day to day job. And sho Jetbrains developer advocates recommend working with IntelliJ without using the UI (tool window buttons, toolbar, etc.). Always remember that all shortcuts are configurable. So make sure to take your time to customize the IDE according to your needs and preferences. Up till now, most developers I've met are using IntelliJ with UI enabled. -![](https://i.imgur.com/G9gx6EM.png) +![](G9gx6EM-2e3d394b.jpg) However, it isn't recommended to do it that way! If you want to take your IDEA's skills to the next level, you have to get rid of those UIs. They represent distraction to the developer, preventing you from focusing on what matters: Your code! Now you can remove these distractions by going into your **Main Menu \| View \| Appearance** and uncheck toolbar, tool window bar, navigation bar. What's left are tabs. Please get rid of them by right-click into the tab and choose **Configure Editor Tabs…** and on the appearance section, set **tab placement** to **None**. The resulting IDEA's UI would be: -![](https://i.imgur.com/kpltSyQ.png) +![](kpltSyQ-2b5b9d27.jpg) Fantastic! I've been working with IDEA for almost two years in this mode. At first, it may sound overwhelming the number of shortcuts/actions you'll have to learn. Learning IDEA's shortcuts is like driving. When you know how to drive a car, you don't think about the process of driving. It comes naturally. But when driving for the first time, you do. So be patient with yourself. ### Running Code How do you run code in IDEA? Typically, you would go to Edit Configuration in the toolbar and set up your run configuration. Once you do that, you build and run your code by clicking the toolbar's run button. Using the mouse to run your code isn't professional. Instead, I prefer to do the following: You can set up multiple run configurations using a keyboard shortcut and run the runnable class directly from IDEA so IDEA can create the run configs using its defaults. Then, whenever you want to run your project. Invoke the run popup (using a shortcut) and choose the appropriate config: -![grab-landing-page](https://media.giphy.com/media/l36D9ivFJOvc2c9yAD/giphy.gif) +![grab-landing-page](giphy-e8de7021.gif) ### Abbreviate Actions Sometimes actions can be hard to remember and take more time to type compared to an abbreviation. Fortunately, in IDEA, you can set up an abbreviation for any action, and when you invoke **Find Action** you can just type the name of the abbreviation, and it'll invoke the action that is associated with it. First, you can set an abbreviation like so: -![grab-landing-page](https://media.giphy.com/media/KHPOeQYUTJBNLIJmhK/giphy.gif) +![grab-landing-page](giphy-3991fe92.gif) After setting your action abbreviation, call it using **Find by Action**. Type your abbreviation and boom your action will appear in two keystrokes: -![grab-landing-page](https://media.giphy.com/media/KDtmbLZypP3Erz0TF8/giphy.gif) +![grab-landing-page](giphy-5dad1894.gif) ### Navigation In IntelliJ, you don't need tabs. Tabs are inefficient in navigation. Instead, IDEA provides you powerful ways to navigate in your project. You can navigate using "**Recent Files**" action. This action shows all the recent files you've visited. A double shortcut would show only recent files that have been changed: -![grab-landing-page](https://media.giphy.com/media/gGqn826NbrurZthsCE/giphy.gif) +![grab-landing-page](giphy-2aea3237.gif) **Recent Locations** action is also a great way to navigate/search for recent portions of code: -![grab-landing-page](https://media.giphy.com/media/Y4DC7WiZrfq8CVUXFH/giphy.gif) +![grab-landing-page](giphy-0ea2c2c7.gif) ### File Preview @@ -67,14 +67,14 @@ What if you want to preview a file without opening it? **Quick Definition** acti * Etc… This GIF showcase how I use **Quick Definition** action to preview a specific file: -![grab-landing-page](https://media.giphy.com/media/cNZ2UStMMqCOL9euJC/giphy.gif) +![grab-landing-page](giphy-3818344a.gif) ### VCS I could write a bunch of articles talking about VCS support in IDEA. But in this article, I'd like to highlight an unknown feature of IntelliJ, which IntelliJ's VCS Shelve. Shelving commits is similar to stashing commits in git, but it's more powerful. **I prefer to shelve changes instead of stashing them if I am not sharing my changes elsewhere.** Stashing is a git feature and doesn't give you the option to select specific files or changes inside a file. Shelving can do that, but this is an IDE-specific feature, not a git feature: -![grab-landing-page](https://media.giphy.com/media/LpFJWC5yiBXtIxjyMd/giphy.gif) +![grab-landing-page](giphy-b21b0dbd.gif) As you can see, I am able to choose to specify which files/lines to include on my shelve. Note that I can't do that with stashing. @@ -83,7 +83,7 @@ Beware using shelves in the IDE may limit the portability of your patches becaus ### Learn More If you want to measure your productivity and see usage statistics for IntelliJ IDEA features, make sure to check out **Productivity Guide** by going to the main menu -\> help -\> **Productivity Guide**. It should display a popup containing all usage statistics of IDEA's features: -![](https://i.imgur.com/dgdo7L3.png) +![](dgdo7L3-737c0c98.jpg) Also, Checkout [Key Promoter X](https://plugins.jetbrains.com/plugin/9792-key-promoter-x) plugin if you want to avoid using the mouse. diff --git a/content/posts/2021/01/25/intellij-idea-beyond-the-basics/kpltSyQ-2b5b9d27.jpg b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/kpltSyQ-2b5b9d27.jpg new file mode 100644 index 000000000..127b5f084 Binary files /dev/null and b/content/posts/2021/01/25/intellij-idea-beyond-the-basics/kpltSyQ-2b5b9d27.jpg differ diff --git a/content/posts/2021/01/29/custom-controls-in-javafx-part-i/Affinity-Designer-Untitled-Modified-3051.8-2021-01-15-16-45-35-630x510.jpg b/content/posts/2021/01/29/custom-controls-in-javafx-part-i/Affinity-Designer-Untitled-Modified-3051.8-2021-01-15-16-45-35-630x510.jpg new file mode 100644 index 000000000..e59797466 Binary files /dev/null and b/content/posts/2021/01/29/custom-controls-in-javafx-part-i/Affinity-Designer-Untitled-Modified-3051.8-2021-01-15-16-45-35-630x510.jpg differ diff --git a/content/posts/2021/01/29/custom-controls-in-javafx-part-i/Affinity-Designer-Untitled-Modified-3051.8-2021-01-15-16-45-35-630x510.png b/content/posts/2021/01/29/custom-controls-in-javafx-part-i/Affinity-Designer-Untitled-Modified-3051.8-2021-01-15-16-45-35-630x510.png deleted file mode 100644 index da0ce9157..000000000 Binary files a/content/posts/2021/01/29/custom-controls-in-javafx-part-i/Affinity-Designer-Untitled-Modified-3051.8-2021-01-15-16-45-35-630x510.png and /dev/null differ diff --git a/content/posts/2021/01/29/custom-controls-in-javafx-part-i/css-1-705x1024.jpg b/content/posts/2021/01/29/custom-controls-in-javafx-part-i/css-1-705x1024.jpg new file mode 100644 index 000000000..f48862798 Binary files /dev/null and b/content/posts/2021/01/29/custom-controls-in-javafx-part-i/css-1-705x1024.jpg differ diff --git a/content/posts/2021/01/29/custom-controls-in-javafx-part-i/css-1-705x1024.png b/content/posts/2021/01/29/custom-controls-in-javafx-part-i/css-1-705x1024.png deleted file mode 100644 index 42fa8c77e..000000000 Binary files a/content/posts/2021/01/29/custom-controls-in-javafx-part-i/css-1-705x1024.png and /dev/null differ diff --git a/content/posts/2021/01/29/custom-controls-in-javafx-part-i/index.md b/content/posts/2021/01/29/custom-controls-in-javafx-part-i/index.md index 7ef1b4d8a..0a157b5d8 100644 --- a/content/posts/2021/01/29/custom-controls-in-javafx-part-i/index.md +++ b/content/posts/2021/01/29/custom-controls-in-javafx-part-i/index.md @@ -165,7 +165,7 @@ And voilá here is the checkmark that you find in a JavaFX CheckBox control. But So in our case the new shape for the path should look as follows. -![](Affinity-Designer-Untitled-Modified-3051.8-2021-01-15-16-45-35-630x510.png) +![](Affinity-Designer-Untitled-Modified-3051.8-2021-01-15-16-45-35-630x510.jpg) And the CSS with the SVG path will look like follows: @@ -236,7 +236,7 @@ But that's not all, because you can not only define the inset for all four sides The order of the four sides is defined as follows: top, right, bottom and left. Here is a little drawing that shows the example above and also the CSS style of the box in the CheckBox for the standard and "selected:focused" state: -![](css-1-705x1024.png) +![](css-1-705x1024.jpg) Now, with the insets in place, you can define a paint ("color" or "gradient") for each layer that was defined in the insets and put these paints in the -fx-background-color variable, separated by commas. diff --git a/content/posts/2021/02/03/getting-started-with-devsecops/index.md b/content/posts/2021/02/03/getting-started-with-devsecops/index.md index cfabe96bb..d8bd624b4 100644 --- a/content/posts/2021/02/03/getting-started-with-devsecops/index.md +++ b/content/posts/2021/02/03/getting-started-with-devsecops/index.md @@ -5,7 +5,7 @@ lastmod: "2021-03-09T08:19:15+00:00" description: "What are the quick wins or low hanging fruits if you want to deal more with the topic of security in software development?" authors: - "sven-ruppert" -image: "http://img.youtube.com/vi/lNqADishl8w/mqdefault.jpg" +image: "mqdefault-c839bb56.jpg" categories: - "DevOps" - "Security" @@ -18,7 +18,7 @@ frozen: false The question I am asked is almost always: "What are the quick wins or low hanging fruits if you want to deal more with the topic of security in software development? And I want you to answer this question right **now!**" > For the lazy ones, you can see it in a YouTube video as well, the low hanging fruits of DevSecOps: > -> [![Low hanging Fruits of DevSecOps - english](http://img.youtube.com/vi/lNqADishl8w/mqdefault.jpg)](https://youtu.be/lNqADishl8w "DevSecOps - What are the Low hanging Fruits? - english - 4k") +> [![Low hanging Fruits of DevSecOps - english](mqdefault-c839bb56.jpg)](https://youtu.be/lNqADishl8w "DevSecOps - What are the Low hanging Fruits? - english - 4k") Let's start with the definition of a phrase that often used in the business world. @@ -72,7 +72,7 @@ Until now, the only thing you can do to speed up the information flow is spendin But even more critical is excellent and robust test coverage. Good test coverage will allow you, to switch dependency versions immediately and push this change after a green test run into production. I recommend using a more substantial test coverage as pure line-coverages. The technique called "mutation test coverage" is a powerful one. > If you want to know more about Mutation Test Coverage, check out my YouTube channel. I have a video that explains the theoretical part and the practical one for Java and Kotlin. > -> [![Mutation Testing - english](http://img.youtube.com/vi/6Vej7YEOF8g/mqdefault.jpg)](https://youtu.be/6Vej7YEOF8g "Mutation Testing - english - 4k") +> [![Mutation Testing - english](mqdefault-590ea734.jpg)](https://youtu.be/6Vej7YEOF8g "Mutation Testing - english - 4k") The need for a single point that understands all repo-types @@ -93,7 +93,7 @@ The fastest way to get feedback regarding your dependencies is the **JFrog IDE P If you add a dependency to your project, the IDE Plugin can understand this information based on the used package manager. The IDE Plugin is connected to your JFrog Xray instance and will be queried if there is a change inside your project's dependency definition. The information provided by Xray includes the known vulnerabilities of the added dependency. If there is a fixed version of the dependency available, the new version number will be shown. > If you want to see the IDE Plugin in Action without registering for a Free Tier, have a look at my youtube video: > -> [![JFrog IDE Plugin - english](http://img.youtube.com/vi/PsghzAf-ODU/mqdefault.jpg)](https://youtu.be/PsghzAf-ODU "JFrog IDE Plugin - english - 4k") +> [![JFrog IDE Plugin - english](mqdefault-1b4f0f70.jpg)](https://youtu.be/PsghzAf-ODU "JFrog IDE Plugin - english - 4k") ### Conclusion diff --git a/content/posts/2021/02/03/getting-started-with-devsecops/mqdefault-1b4f0f70.jpg b/content/posts/2021/02/03/getting-started-with-devsecops/mqdefault-1b4f0f70.jpg new file mode 100644 index 000000000..e02bf9a9c Binary files /dev/null and b/content/posts/2021/02/03/getting-started-with-devsecops/mqdefault-1b4f0f70.jpg differ diff --git a/content/posts/2021/02/03/getting-started-with-devsecops/mqdefault-590ea734.jpg b/content/posts/2021/02/03/getting-started-with-devsecops/mqdefault-590ea734.jpg new file mode 100644 index 000000000..4599cb186 Binary files /dev/null and b/content/posts/2021/02/03/getting-started-with-devsecops/mqdefault-590ea734.jpg differ diff --git a/content/posts/2021/02/03/getting-started-with-devsecops/mqdefault-c839bb56.jpg b/content/posts/2021/02/03/getting-started-with-devsecops/mqdefault-c839bb56.jpg new file mode 100644 index 000000000..2bda10377 Binary files /dev/null and b/content/posts/2021/02/03/getting-started-with-devsecops/mqdefault-c839bb56.jpg differ diff --git a/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/index.md b/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/index.md index ca620aa7d..09703ceeb 100644 --- a/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/index.md +++ b/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/index.md @@ -64,7 +64,7 @@ $ sudo apt install ./code_1.50.1-1602600638_arm64.deb ``` Also here you'll now find Visual Studio Code in the Programming list in the start menu. Let's also here add the "Java Extension Pack" (or one from the others mentioned in [the previous post](https://foojay.io/today/welcome-to-vs-code-for-java/)), so we can test a Java application. -![](visualstudiocode-64bit-java-extension-pack.png) Visual Studio Code running on Raspberry Pi OS (64bit) +![](visualstudiocode-64bit-java-extension-pack.jpg) Visual Studio Code running on Raspberry Pi OS (64bit) Maven and BellSoft JDK with JavaFX are already installed on my board: @@ -83,7 +83,7 @@ OpenJDK 64-Bit Server VM (build 11.0.8+10-LTS, mixed mode) ``` Without any further installation, we can now try out [this demo application which you can get from GitHub](https://github.com/FDelporte/JavaOnRaspberryPi/tree/master/Chapter_07_JavaFX/javafx-dashboard). -![](visualstudiocode-64bit-java-testing.png) JavaFX demo application started by Visual Studio Code on the Raspberry Pi +![](visualstudiocode-64bit-java-testing.jpg) JavaFX demo application started by Visual Studio Code on the Raspberry Pi ### Is Microsoft Spying On You? diff --git a/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/visualstudiocode-64bit-java-extension-pack.jpg b/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/visualstudiocode-64bit-java-extension-pack.jpg new file mode 100644 index 000000000..626d1a9b8 Binary files /dev/null and b/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/visualstudiocode-64bit-java-extension-pack.jpg differ diff --git a/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/visualstudiocode-64bit-java-extension-pack.png b/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/visualstudiocode-64bit-java-extension-pack.png deleted file mode 100644 index 7d27769a5..000000000 Binary files a/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/visualstudiocode-64bit-java-extension-pack.png and /dev/null differ diff --git a/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/visualstudiocode-64bit-java-testing.jpg b/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/visualstudiocode-64bit-java-testing.jpg new file mode 100644 index 000000000..5511f8f7b Binary files /dev/null and b/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/visualstudiocode-64bit-java-testing.jpg differ diff --git a/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/visualstudiocode-64bit-java-testing.png b/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/visualstudiocode-64bit-java-testing.png deleted file mode 100644 index ab73a72b4..000000000 Binary files a/content/posts/2021/02/16/java-development-with-vs-code-on-the-raspberry-pi/visualstudiocode-64bit-java-testing.png and /dev/null differ diff --git a/content/posts/2021/02/18/demystifying-google-container-tool-jib-java-image-builder/6BWAJwpEI-d880144a.jpg b/content/posts/2021/02/18/demystifying-google-container-tool-jib-java-image-builder/6BWAJwpEI-d880144a.jpg new file mode 100644 index 000000000..59542c302 Binary files /dev/null and b/content/posts/2021/02/18/demystifying-google-container-tool-jib-java-image-builder/6BWAJwpEI-d880144a.jpg differ diff --git a/content/posts/2021/02/18/demystifying-google-container-tool-jib-java-image-builder/default-yellow-8f95b1d6.png b/content/posts/2021/02/18/demystifying-google-container-tool-jib-java-image-builder/default-yellow-8f95b1d6.png new file mode 100644 index 000000000..21ed36b7e Binary files /dev/null and b/content/posts/2021/02/18/demystifying-google-container-tool-jib-java-image-builder/default-yellow-8f95b1d6.png differ diff --git a/content/posts/2021/02/18/demystifying-google-container-tool-jib-java-image-builder/index.md b/content/posts/2021/02/18/demystifying-google-container-tool-jib-java-image-builder/index.md index f0e04e1e1..1c01255ee 100644 --- a/content/posts/2021/02/18/demystifying-google-container-tool-jib-java-image-builder/index.md +++ b/content/posts/2021/02/18/demystifying-google-container-tool-jib-java-image-builder/index.md @@ -104,13 +104,13 @@ You can inspect images created by Jib using the [Dive](https://github.com/wagood /apps/classes,/apps/libs,/apps/resources -![Screenshot 2021-01-08 at 7.30.23 PM.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1611246809879/6BWAJwpEI.png) +![Screenshot 2021-01-08 at 7.30.23 PM.png](6BWAJwpEI-d880144a.jpg) Dive Image Layer screenshot. Dive also tells you if you are wasting any space and, if you are, then you can discover ways to shrink the size of your Docker/OCI image. However, in our case, no space is wasted! You can view the content of an image with a docker history command as well. Let's see what it looks like in the image below: -![Screenshot 2021-01-09 at 1.15.58 PM.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1611168829601/xK66ceNKF.png) +![Screenshot 2021-01-09 at 1.15.58 PM.png](xK66ceNKF-476a4b8d.png) Docker History Command screenshot. @@ -139,7 +139,7 @@ In this article, we have covered some internals about Jib .i.e. image layering, If you like what you just read, then you can buy me a coffee by clicking the link in the image below: -[![Buy Me A Coffee](https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png)](https://www.buymeacoffee.com/meashish) +[![Buy Me A Coffee](default-yellow-8f95b1d6.png)](https://www.buymeacoffee.com/meashish) ### Further Reading diff --git a/content/posts/2021/02/18/demystifying-google-container-tool-jib-java-image-builder/xK66ceNKF-476a4b8d.png b/content/posts/2021/02/18/demystifying-google-container-tool-jib-java-image-builder/xK66ceNKF-476a4b8d.png new file mode 100644 index 000000000..bfd494cf3 Binary files /dev/null and b/content/posts/2021/02/18/demystifying-google-container-tool-jib-java-image-builder/xK66ceNKF-476a4b8d.png differ diff --git a/content/posts/2021/02/19/custom-controls-in-javafx-part-iv/Affinity-Designer-LED-Modified-110.0-2021-01-29-13-50-29-636x510.jpg b/content/posts/2021/02/19/custom-controls-in-javafx-part-iv/Affinity-Designer-LED-Modified-110.0-2021-01-29-13-50-29-636x510.jpg new file mode 100644 index 000000000..3119d837e Binary files /dev/null and b/content/posts/2021/02/19/custom-controls-in-javafx-part-iv/Affinity-Designer-LED-Modified-110.0-2021-01-29-13-50-29-636x510.jpg differ diff --git a/content/posts/2021/02/19/custom-controls-in-javafx-part-iv/Affinity-Designer-LED-Modified-110.0-2021-01-29-13-50-29-636x510.png b/content/posts/2021/02/19/custom-controls-in-javafx-part-iv/Affinity-Designer-LED-Modified-110.0-2021-01-29-13-50-29-636x510.png deleted file mode 100644 index 9477a03a5..000000000 Binary files a/content/posts/2021/02/19/custom-controls-in-javafx-part-iv/Affinity-Designer-LED-Modified-110.0-2021-01-29-13-50-29-636x510.png and /dev/null differ diff --git a/content/posts/2021/02/19/custom-controls-in-javafx-part-iv/index.md b/content/posts/2021/02/19/custom-controls-in-javafx-part-iv/index.md index 80868685f..41bd6bef9 100644 --- a/content/posts/2021/02/19/custom-controls-in-javafx-part-iv/index.md +++ b/content/posts/2021/02/19/custom-controls-in-javafx-part-iv/index.md @@ -46,7 +46,7 @@ My advice...use a vector drawing program, in this case this is like visual codin After that little advice let's go back to our LED control, here is a drawing that shows the LED in it's final state: -![](Affinity-Designer-LED-Modified-110.0-2021-01-29-13-50-29-636x510.png) +![](Affinity-Designer-LED-Modified-110.0-2021-01-29-13-50-29-636x510.jpg) In principle the whole LED is just made from three circles, filled with different gradients. Here is a little drawing that hopefully explains it better: diff --git a/content/posts/2021/02/23/payara-platform-2021-survey/image-866x1024.jpg b/content/posts/2021/02/23/payara-platform-2021-survey/image-866x1024.jpg new file mode 100644 index 000000000..46d948c81 Binary files /dev/null and b/content/posts/2021/02/23/payara-platform-2021-survey/image-866x1024.jpg differ diff --git a/content/posts/2021/02/23/payara-platform-2021-survey/image-866x1024.png b/content/posts/2021/02/23/payara-platform-2021-survey/image-866x1024.png deleted file mode 100644 index c7ca612f9..000000000 Binary files a/content/posts/2021/02/23/payara-platform-2021-survey/image-866x1024.png and /dev/null differ diff --git a/content/posts/2021/02/23/payara-platform-2021-survey/index.md b/content/posts/2021/02/23/payara-platform-2021-survey/index.md index 779441aa5..cc3e1703e 100644 --- a/content/posts/2021/02/23/payara-platform-2021-survey/index.md +++ b/content/posts/2021/02/23/payara-platform-2021-survey/index.md @@ -6,7 +6,7 @@ description: "The Payara Platform 2021 Survey is underway and we're inviting eve canonical: "https://blog.payara.fish/payara-platform-2021-survey" authors: - "jadon-ortlepp" -image: "image-866x1024.png" +image: "image-866x1024.jpg" categories: - "Microservices" - "Surveys" @@ -21,7 +21,7 @@ We want to know what you like, what you want to see improved, and we're giving y Your survey answers help drive future development efforts for the Payara Platform. **You can answer anonymously or provide your contact details to be entered into the random drawing from all entrants who provide contact details to receive a $25 Amazon voucher. We'll choose two winners randomly after March 22, 2021.** -[![](image-866x1024.png)](https://forms.office.com/Pages/ResponsePage.aspx?id=Ol4Z8U5Yuk6GfwMLbUz_qRvNA3jNrcFAk2okHLVZDLJUOUNCWllWM1ZBMzBQTkk1NU85MUtVU05WNi4u) +[![](image-866x1024.jpg)](https://forms.office.com/Pages/ResponsePage.aspx?id=Ol4Z8U5Yuk6GfwMLbUz_qRvNA3jNrcFAk2okHLVZDLJUOUNCWllWM1ZBMzBQTkk1NU85MUtVU05WNi4u) Thank you for contributing and helping us gain insight into which features and enhancements you would most like to see in future releases of the Payara Platform. diff --git a/content/posts/2021/02/25/java-roots-1-java-memory-architecture/544006-untitled-4f68f8ba.jpg b/content/posts/2021/02/25/java-roots-1-java-memory-architecture/544006-untitled-4f68f8ba.jpg new file mode 100644 index 000000000..29734c73d Binary files /dev/null and b/content/posts/2021/02/25/java-roots-1-java-memory-architecture/544006-untitled-4f68f8ba.jpg differ diff --git a/content/posts/2021/02/25/java-roots-1-java-memory-architecture/index.md b/content/posts/2021/02/25/java-roots-1-java-memory-architecture/index.md index 433e57272..5e489b93a 100644 --- a/content/posts/2021/02/25/java-roots-1-java-memory-architecture/index.md +++ b/content/posts/2021/02/25/java-roots-1-java-memory-architecture/index.md @@ -25,7 +25,7 @@ Series of Articles on Rooted Concepts in Core Java and J2EE. They Revolve Around The diagram below is the Java Memory Model for the Heap as well as the PermGen for any Java Application running in the Java Virtual Machine (JVM). The ratios are also provided to get a fair understanding of how the distribution of allowed memory is done across each of the generation types. All of the info is completely applicable up to Java 1.7 (inclusive). This diagram is also known as the 'Managed Area' of the memory model. -![Image title](https://dzone.com/storage/temp/544006-untitled.jpg) +![Image title](544006-untitled-4f68f8ba.jpg) In addition to the above, there is a Stack Area, which can be configured using the -Xss option. This area holds the references on the heap, native references, pc registers, code cache, and local variables for all threads. This is also known as the 'Native Area' of the memory model. ## → Managed Area of the Java Memory Model diff --git a/content/posts/2021/02/25/towards-continuous-performance-regression-testing/continuous_perf_testing_gc_original-11947f94.png b/content/posts/2021/02/25/towards-continuous-performance-regression-testing/continuous_perf_testing_gc_original-11947f94.png new file mode 100644 index 000000000..3b1708aeb Binary files /dev/null and b/content/posts/2021/02/25/towards-continuous-performance-regression-testing/continuous_perf_testing_gc_original-11947f94.png differ diff --git a/content/posts/2021/02/25/towards-continuous-performance-regression-testing/continuous_perf_testing_gc_regression-83ab6f14.png b/content/posts/2021/02/25/towards-continuous-performance-regression-testing/continuous_perf_testing_gc_regression-83ab6f14.png new file mode 100644 index 000000000..c177e5b2d Binary files /dev/null and b/content/posts/2021/02/25/towards-continuous-performance-regression-testing/continuous_perf_testing_gc_regression-83ab6f14.png differ diff --git a/content/posts/2021/02/25/towards-continuous-performance-regression-testing/continuous_perf_testing_socket_regressio-b00cb97d.png b/content/posts/2021/02/25/towards-continuous-performance-regression-testing/continuous_perf_testing_socket_regressio-b00cb97d.png new file mode 100644 index 000000000..157658e98 Binary files /dev/null and b/content/posts/2021/02/25/towards-continuous-performance-regression-testing/continuous_perf_testing_socket_regressio-b00cb97d.png differ diff --git a/content/posts/2021/02/25/towards-continuous-performance-regression-testing/continuous_perf_testing_tlab_in_jmc-473cbc19.png b/content/posts/2021/02/25/towards-continuous-performance-regression-testing/continuous_perf_testing_tlab_in_jmc-473cbc19.png new file mode 100644 index 000000000..1132b006a Binary files /dev/null and b/content/posts/2021/02/25/towards-continuous-performance-regression-testing/continuous_perf_testing_tlab_in_jmc-473cbc19.png differ diff --git a/content/posts/2021/02/25/towards-continuous-performance-regression-testing/continuous_perf_testing_tlab_stacktrace-675a719d.png b/content/posts/2021/02/25/towards-continuous-performance-regression-testing/continuous_perf_testing_tlab_stacktrace-675a719d.png new file mode 100644 index 000000000..0691685ab Binary files /dev/null and b/content/posts/2021/02/25/towards-continuous-performance-regression-testing/continuous_perf_testing_tlab_stacktrace-675a719d.png differ diff --git a/content/posts/2021/02/25/towards-continuous-performance-regression-testing/index.md b/content/posts/2021/02/25/towards-continuous-performance-regression-testing/index.md index 65c4ca081..f54fca524 100644 --- a/content/posts/2021/02/25/towards-continuous-performance-regression-testing/index.md +++ b/content/posts/2021/02/25/towards-continuous-performance-regression-testing/index.md @@ -6,7 +6,7 @@ description: "Introduction to the JfrUnit open-source project, providing asserti canonical: "https://www.morling.dev/blog/towards-continuous-performance-regression-testing/" authors: - "gunnarmorling" -image: "https://www.morling.dev/images/continuous_perf_testing_tlab_in_jmc.png" +image: "continuous_perf_testing_tlab_in_jmc-473cbc19.png" categories: - "JDK Flight Recorder" - "Performance" @@ -270,10 +270,10 @@ dev.morling.demos.quarkus.TodoResourcePerformanceTest-retrieveTodo.jfr Let's open the \*.jfr file for the failing test in JDK Mission Control (JMC) in order to analyse all the recorded events (note that the recording will always contain some JfrUnit-internal events which are needed for synchronizing the recording stream and the events exposed to the test). When taking a look at the TLAB events of the application's executor thread, the culprit is identified quickly; a lot of the sampled TLAB allocations contain this stack trace (click on the image to enlarge): -[![TLAB allocations in JDK Mission Control](https://www.morling.dev/images/continuous_perf_testing_tlab_in_jmc.png "TLAB allocations in JDK Mission Control")](https://www.morling.dev/images/continuous_perf_testing_tlab_in_jmc.png "TLAB allocations in JDK Mission Control") +[![TLAB allocations in JDK Mission Control](continuous_perf_testing_tlab_in_jmc-473cbc19.png "TLAB allocations in JDK Mission Control")](continuous_perf_testing_tlab_in_jmc-473cbc19.png "TLAB allocations in JDK Mission Control") Interesting, REST Assured loading a Jackson object mapper, what's going on there? Here's the full stacktrace: -[![Complete stacktrace of the TLAB allocation](https://www.morling.dev/images/continuous_perf_testing_tlab_stacktrace.png "Complete stacktrace of the TLAB allocation")](https://www.morling.dev/images/continuous_perf_testing_tlab_stacktrace.png) +[![Complete stacktrace of the TLAB allocation](continuous_perf_testing_tlab_stacktrace-675a719d.png "Complete stacktrace of the TLAB allocation")](continuous_perf_testing_tlab_stacktrace-675a719d.png) So it seems a REST call to another service is made from within the `TodoResource#get(long)` method! At this point we know where to look into the source code of the application: @@ -319,10 +319,10 @@ public void retrieveTodo() throws Exception { Note that the pre-defined configurations imply minimum durations for certain event types; e.g. the I/O events discussed in the next section will only be recorded if they have a duration of 20 ms or longer. Depending on your testing requirements, you may have to adjust and tweak the configuration to be used. Open the recording in JMC, and you'll see there's a substantial amount of GC activity happening: -[![Garbage collections after the performance regression](https://www.morling.dev/images/continuous_perf_testing_gc_regression.png "Garbage collections after the performance regression")](https://www.morling.dev/images/continuous_perf_testing_gc_regression.png) +[![Garbage collections after the performance regression](continuous_perf_testing_gc_regression-83ab6f14.png "Garbage collections after the performance regression")](continuous_perf_testing_gc_regression-83ab6f14.png) The difference to the GC behavior before this code change is striking: -[![Garbage collections before the performance regression](https://www.morling.dev/images/continuous_perf_testing_gc_original.png "Garbage collections before the performance regression")](https://www.morling.dev/images/continuous_perf_testing_gc_original.png) +[![Garbage collections before the performance regression](continuous_perf_testing_gc_original-11947f94.png "Garbage collections before the performance regression")](continuous_perf_testing_gc_original-11947f94.png) Pause times are worse, directly impacting the application's latency, and the largely increased GC volume means the production environment will be able to serve less concurrent requests when reaching its capacity limits, meaning you'd have to provision another machine earlier on as your load increases. > *****Memory Leak in the JFR Event Streaming API***** @@ -409,7 +409,7 @@ to be less than: ``` That's definitely something to look into. So let's open the recording of the failed test in Flight Recorder and take a look at the socket read and write events. Thanks to enabling stacktraces for the two JFR event types we can quite quickly identify the events asssociated to an invocation of the `GET /todo/{id}` API: -[![Socket read and write events after the performance regression](https://www.morling.dev/images/continuous_perf_testing_socket_regression.png "Socket read and write events after the performance regression")](https://www.morling.dev/images/continuous_perf_testing_socket_regression.png) +[![Socket read and write events after the performance regression](continuous_perf_testing_socket_regressio-b00cb97d.png "Socket read and write events after the performance regression")](continuous_perf_testing_socket_regressio-b00cb97d.png) At this point, some familiarity with the application in question will come in handy to identify suspicous events. But even without that, we could compare previous recordings of successful test runs with the recording from the failing one in order to see where differences are. In the case at hand, the `BlobInputStream` and Hibernate's `BlobTypeDescriptor` in the call stack seem pretty unexpected, as our `User` entity didn't have any `BLOB` attribute before. diff --git a/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/4GltJdQil-c67fed45.jpg b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/4GltJdQil-c67fed45.jpg new file mode 100644 index 000000000..561156170 Binary files /dev/null and b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/4GltJdQil-c67fed45.jpg differ diff --git a/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/8sizkbmJ4-2d1cb625.png b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/8sizkbmJ4-2d1cb625.png new file mode 100644 index 000000000..52b9619c1 Binary files /dev/null and b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/8sizkbmJ4-2d1cb625.png differ diff --git a/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/D9-yjMS5D-a94d3289.jpg b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/D9-yjMS5D-a94d3289.jpg new file mode 100644 index 000000000..cbdfde5d6 Binary files /dev/null and b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/D9-yjMS5D-a94d3289.jpg differ diff --git a/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/U5NjQtWkT-e655c89f.png b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/U5NjQtWkT-e655c89f.png new file mode 100644 index 000000000..3ca42a440 Binary files /dev/null and b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/U5NjQtWkT-e655c89f.png differ diff --git a/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/default-yellow-8f95b1d6.png b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/default-yellow-8f95b1d6.png new file mode 100644 index 000000000..21ed36b7e Binary files /dev/null and b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/default-yellow-8f95b1d6.png differ diff --git a/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/gr3QKnsAa-63d42ff6.png b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/gr3QKnsAa-63d42ff6.png new file mode 100644 index 000000000..cb3a4015a Binary files /dev/null and b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/gr3QKnsAa-63d42ff6.png differ diff --git a/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/iGVa450rS-01709eae.png b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/iGVa450rS-01709eae.png new file mode 100644 index 000000000..44bce475b Binary files /dev/null and b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/iGVa450rS-01709eae.png differ diff --git a/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/index.md b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/index.md index e64696481..e0990d31d 100644 --- a/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/index.md +++ b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/index.md @@ -161,35 +161,35 @@ Lens IDE for Kubernetes is a desktop application for macOS, Windows, and Linux t After installing it you can first add a cluster. Lens connects to your Kubernetes cluster using the kubeconfig file which is typically located in your `$HOME/.kube` directory. You have the option to paste it as a text file also. Now select the kubeconfig file, context, and click on Add cluster. -![Screenshot 2021-02-11 at 2.09.54 AM.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1612989621325/x13sR5GgY.png) +![Screenshot 2021-02-11 at 2.09.54 AM.png](x13sR5GgY-f3e0beaf.png) After adding the cluster you can see it on the left side navigation bar. For demo purposes, I have redeployed the Spring Boot application. Under events, you can see that our application image is getting pulled. -![Screenshot 2021-02-11 at 12.49.32 AM.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1612985782109/D9-yjMS5D.png) +![Screenshot 2021-02-11 at 12.49.32 AM.png](D9-yjMS5D-a94d3289.jpg) We can also view the logs of the deployment we just completed. As you can see that application is deployed and running. -![Screenshot 2021-02-11 at 1.05.33 AM.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1612985998835/mDUZ2ngCw.png) +![Screenshot 2021-02-11 at 1.05.33 AM.png](mDUZ2ngCw-d0a4b78e.png) You can scale, restart, edit and remove Kubernetes manifests from Lens IDE itself. -![Screenshot 2021-02-11 at 1.12.58 AM.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1612986254526/gr3QKnsAa.png) +![Screenshot 2021-02-11 at 1.12.58 AM.png](gr3QKnsAa-63d42ff6.png) Under networks, you can also view Kubernetes services. -![Screenshot 2021-02-11 at 1.31.12 AM.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1612987519015/8sizkbmJ4.png) +![Screenshot 2021-02-11 at 1.31.12 AM.png](8sizkbmJ4-2d1cb625.png) Lens has a feature where it allows you to install Prometheus stack in your cluster so that you can gather metrics about the cluster and its nodes. For installation, right-click on the cluster icon in the Lens UI's top-left corner and select Settings. -![Screenshot 2021-02-11 at 1.49.32 AM.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1612988900910/iGVa450rS.png) +![Screenshot 2021-02-11 at 1.49.32 AM.png](iGVa450rS-01709eae.png) On the Settings page, under features, you can see a Metrics section and a button to install Prometheus. Click Install to deploy the Prometheus stack to your cluster. -![Screenshot 2021-02-11 at 1.50.13 AM.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1612989251651/U5NjQtWkT.png) +![Screenshot 2021-02-11 at 1.50.13 AM.png](U5NjQtWkT-e655c89f.png) Lens will start displaying metrics after a minute or so. -![Screenshot 2021-02-11 at 2.08.04 AM.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1612989549853/4GltJdQil.png) +![Screenshot 2021-02-11 at 2.08.04 AM.png](4GltJdQil-c67fed45.jpg) We have only covered a handful of features that Lends IDE for Kubernetes provides. It's a wrap for now. @@ -204,7 +204,7 @@ Go containerize and share your applications! ### Support me If you like what you just read, then you can buy me a coffee by clicking the link in the image below: -[![Buy Me A Coffee](https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png)](https://www.buymeacoffee.com/meashish) +[![Buy Me A Coffee](default-yellow-8f95b1d6.png)](https://www.buymeacoffee.com/meashish) ### Further Reading diff --git a/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/mDUZ2ngCw-d0a4b78e.png b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/mDUZ2ngCw-d0a4b78e.png new file mode 100644 index 000000000..1b4b1eddb Binary files /dev/null and b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/mDUZ2ngCw-d0a4b78e.png differ diff --git a/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/x13sR5GgY-f3e0beaf.png b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/x13sR5GgY-f3e0beaf.png new file mode 100644 index 000000000..d33a41667 Binary files /dev/null and b/content/posts/2021/02/26/deploying-spring-boot-applications-on-kubernetes/x13sR5GgY-f3e0beaf.png differ diff --git a/content/posts/2021/03/03/evolution-of-java-memory-architecture-post-java-7-0/index.md b/content/posts/2021/03/03/evolution-of-java-memory-architecture-post-java-7-0/index.md index b27dfcd17..b2658f27b 100644 --- a/content/posts/2021/03/03/evolution-of-java-memory-architecture-post-java-7-0/index.md +++ b/content/posts/2021/03/03/evolution-of-java-memory-architecture-post-java-7-0/index.md @@ -64,7 +64,7 @@ The most impactful change to Java has been the movement from PermGen to MetaSpac 12. PermGen had a fixed size, but MetaSpace can Auto-Tune and Auto-Increase depending on the underlying OS. \[MetaSpace Size Efficiency\]. 13. Classes can be de-allocated concurrently without GC pauses. It is more efficient than in PermGen, as that required frequent GC pauses. \[MetaSpace Performance\]. -![Image title](https://4.bp.blogspot.com/-03r1GS2jWlk/WPzruNno57I/AAAAAAAANQU/EghKET29INkXMH3Nrd_zNlOsF93T5xmdACLcB/s640/permgen_to_metaspace.jpg) +![Image title](permgen_to_metaspace-24d72e05.jpg) **\[Note\]** Many authors have erroneously stated that PermGen is part of the Java Heap. You have to note this fact that PermGen was/is never a part of the Java Heap. It was only allocated as part of **Contiguous Memory as the Java Heap**. In the case of Metaspace, such a Contiguous Allocation does not exist, Metaspace lies in or is allocated in the native memory of the operating system. diff --git a/content/posts/2021/03/03/evolution-of-java-memory-architecture-post-java-7-0/permgen_to_metaspace-24d72e05.jpg b/content/posts/2021/03/03/evolution-of-java-memory-architecture-post-java-7-0/permgen_to_metaspace-24d72e05.jpg new file mode 100644 index 000000000..e568e5eb5 Binary files /dev/null and b/content/posts/2021/03/03/evolution-of-java-memory-architecture-post-java-7-0/permgen_to_metaspace-24d72e05.jpg differ diff --git a/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/1-3o_FgsGJxscaBSIG4YBWdA-d388c863.png b/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/1-3o_FgsGJxscaBSIG4YBWdA-d388c863.png new file mode 100644 index 000000000..f7b3677e5 Binary files /dev/null and b/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/1-3o_FgsGJxscaBSIG4YBWdA-d388c863.png differ diff --git a/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/1-7xA0K3gOjXvMSy6VYxu0AQ-0c97f3e8.png b/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/1-7xA0K3gOjXvMSy6VYxu0AQ-0c97f3e8.png new file mode 100644 index 000000000..2a627b6dd Binary files /dev/null and b/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/1-7xA0K3gOjXvMSy6VYxu0AQ-0c97f3e8.png differ diff --git a/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/1-mc5CF_MgjHChXK7-zMvZFw-01e28fbb.png b/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/1-mc5CF_MgjHChXK7-zMvZFw-01e28fbb.png new file mode 100644 index 000000000..1945378e0 Binary files /dev/null and b/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/1-mc5CF_MgjHChXK7-zMvZFw-01e28fbb.png differ diff --git a/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/1-wKabH8L0A5lmkN5N-r45NA-6e458b65.png b/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/1-wKabH8L0A5lmkN5N-r45NA-6e458b65.png new file mode 100644 index 000000000..796334e1a Binary files /dev/null and b/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/1-wKabH8L0A5lmkN5N-r45NA-6e458b65.png differ diff --git a/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/default-yellow-8f95b1d6.png b/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/default-yellow-8f95b1d6.png new file mode 100644 index 000000000..21ed36b7e Binary files /dev/null and b/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/default-yellow-8f95b1d6.png differ diff --git a/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/index.md b/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/index.md index fcbc5c683..7921a73a8 100644 --- a/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/index.md +++ b/content/posts/2021/03/04/running-spring-boot-applications-on-openshift/index.md @@ -86,7 +86,7 @@ https://192.168.64.3:8443/console Now you are good to go and browse the Minishift web console, which is accessible by default using this URL . Since there is no authentication/authorization enabled by default, you can create your own username and password when logging in for the first time. -![Minishift Login page](https://cdn-images-1.medium.com/max/2000/1*wKabH8L0A5lmkN5N-r45NA.png)*Minishift Login page* +![Minishift Login page](1-wKabH8L0A5lmkN5N-r45NA-6e458b65.png)*Minishift Login page* ### Creating Project @@ -195,7 +195,7 @@ Following is the output. As you can see that there is one pod running. You can view the same status on the web console also. You should see the following. -![](https://cdn-images-1.medium.com/max/2384/1*mc5CF_MgjHChXK7-zMvZFw.png) +![](1-mc5CF_MgjHChXK7-zMvZFw-01e28fbb.png) If you carefully observe, we have not exposed the application to the outside world yet because we have not created a route. Let's do that now and see if we can access the application. @@ -215,11 +215,11 @@ route.route.openshift.io/springboot-demo-openshift exposed Similarly, if you goto web console applications\>routes. You can see that route is created. Now our application is exposed to the outside world. Cool. -![Route created](https://cdn-images-1.medium.com/max/2370/1*3o_FgsGJxscaBSIG4YBWdA.png)*Route created* +![Route created](1-3o_FgsGJxscaBSIG4YBWdA-d388c863.png)*Route created* Let's hit the URL and access our spring boot demo application. -![](https://cdn-images-1.medium.com/max/2000/1*7xA0K3gOjXvMSy6VYxu0AQ.png) +![](1-7xA0K3gOjXvMSy6VYxu0AQ-0c97f3e8.png) We have successfully deployed our first Spring boot demo application to Openshift locally. @@ -237,7 +237,7 @@ It's a wrap for now. Happy coding! If you like what you just read, then you can buy me a coffee by clicking the link in the image below: -[![Buy Me A Coffee](https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png)](https://www.buymeacoffee.com/meashish) +[![Buy Me A Coffee](default-yellow-8f95b1d6.png)](https://www.buymeacoffee.com/meashish) ## Further reading diff --git a/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-100.0-2021-02-03-17-12-12-700x444.jpg b/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-100.0-2021-02-03-17-12-12-700x444.jpg new file mode 100644 index 000000000..49c2a30e8 Binary files /dev/null and b/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-100.0-2021-02-03-17-12-12-700x444.jpg differ diff --git a/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-100.0-2021-02-03-17-12-12-700x444.png b/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-100.0-2021-02-03-17-12-12-700x444.png deleted file mode 100644 index 43a557097..000000000 Binary files a/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-100.0-2021-02-03-17-12-12-700x444.png and /dev/null differ diff --git a/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-Modified-200.0-2021-02-04-10-53-40-680x510.jpg b/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-Modified-200.0-2021-02-04-10-53-40-680x510.jpg new file mode 100644 index 000000000..7e49e5e33 Binary files /dev/null and b/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-Modified-200.0-2021-02-04-10-53-40-680x510.jpg differ diff --git a/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-Modified-200.0-2021-02-04-10-53-40-680x510.png b/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-Modified-200.0-2021-02-04-10-53-40-680x510.png deleted file mode 100644 index df5928155..000000000 Binary files a/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-Modified-200.0-2021-02-04-10-53-40-680x510.png and /dev/null differ diff --git a/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-Modified-263.4-2021-02-05-10-54-29-647x510.jpg b/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-Modified-263.4-2021-02-05-10-54-29-647x510.jpg new file mode 100644 index 000000000..17dce84dd Binary files /dev/null and b/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-Modified-263.4-2021-02-05-10-54-29-647x510.jpg differ diff --git a/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-Modified-263.4-2021-02-05-10-54-29-647x510.png b/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-Modified-263.4-2021-02-05-10-54-29-647x510.png deleted file mode 100644 index 48cbf24b5..000000000 Binary files a/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/Affinity-Designer-AquaButton-Modified-263.4-2021-02-05-10-54-29-647x510.png and /dev/null differ diff --git a/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/index.md b/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/index.md index 5ad45d089..5c96a6b68 100644 --- a/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/index.md +++ b/content/posts/2021/03/05/custom-controls-in-javafx-part-vi/index.md @@ -5,7 +5,7 @@ lastmod: "2021-03-05T08:21:13+00:00" description: "Drawing on the Canvas node will directly go down to the graphics hardware, making it really fast. Of course, this also comes with drawbacks!" authors: - "gerrit-grunwald" -image: "Affinity-Designer-AquaButton-100.0-2021-02-03-17-12-12-700x444.png" +image: "Affinity-Designer-AquaButton-100.0-2021-02-03-17-12-12-700x444.jpg" categories: - "JavaFX" related_posts: @@ -42,13 +42,13 @@ So, you should only use the Canvas node for controls if the control is so comple The control we are building today does not necessarily make sense but clearly shows what I've tried to explain above. It will be a simple button that should look similar to the aqua style buttons that we saw in older Mac OS X versions. And as always... first we create a graphical prototype in a vector drawing program. Here is my prototype: -![](Affinity-Designer-AquaButton-100.0-2021-02-03-17-12-12-700x444.png) +![](Affinity-Designer-AquaButton-100.0-2021-02-03-17-12-12-700x444.jpg) The control is made out of several shapes, the main shape is a rounded rectangle, in the center there is another rounded rectangle which will be filled with a radial gradient just for the lighter color in the bottom center. On top you will see the other shape that will give us the reflection. And finally in the center there is the text itself. Because some of these shapes are hard to identify on the above screenshot I've created a version that shows the shapes withouth effects but only filled with a color and with this it's more clear what I'm talking about: -![](Affinity-Designer-AquaButton-Modified-200.0-2021-02-04-10-53-40-680x510.png) +![](Affinity-Designer-AquaButton-Modified-200.0-2021-02-04-10-53-40-680x510.jpg) These are the exact same shapes just without making use of gradients and transparency. The idea is to draw these shapes in a Canvas node and fill them with the appropriate gradients and apply effects like drop shadows, inner shadows etc. @@ -246,7 +246,7 @@ Now we only have to make sure that the clipping rectangle always has the exact s With such a clipping shape in place it would like like this: -![](Affinity-Designer-AquaButton-Modified-263.4-2021-02-05-10-54-29-647x510.png) +![](Affinity-Designer-AquaButton-Modified-263.4-2021-02-05-10-54-29-647x510.jpg) Here you see that the particles will be clipped at the border of the rounded rectangle. diff --git a/content/posts/2021/03/08/foojay-announces-initial-companies-making-up-its-advisory-board-sd-times/image-3-1024x385.jpg b/content/posts/2021/03/08/foojay-announces-initial-companies-making-up-its-advisory-board-sd-times/image-3-1024x385.jpg new file mode 100644 index 000000000..4db0f4585 Binary files /dev/null and b/content/posts/2021/03/08/foojay-announces-initial-companies-making-up-its-advisory-board-sd-times/image-3-1024x385.jpg differ diff --git a/content/posts/2021/03/08/foojay-announces-initial-companies-making-up-its-advisory-board-sd-times/image-3-1024x385.png b/content/posts/2021/03/08/foojay-announces-initial-companies-making-up-its-advisory-board-sd-times/image-3-1024x385.png deleted file mode 100644 index d688ef7bb..000000000 Binary files a/content/posts/2021/03/08/foojay-announces-initial-companies-making-up-its-advisory-board-sd-times/image-3-1024x385.png and /dev/null differ diff --git a/content/posts/2021/03/08/foojay-announces-initial-companies-making-up-its-advisory-board-sd-times/index.md b/content/posts/2021/03/08/foojay-announces-initial-companies-making-up-its-advisory-board-sd-times/index.md index dae0f3dba..e53194281 100644 --- a/content/posts/2021/03/08/foojay-announces-initial-companies-making-up-its-advisory-board-sd-times/index.md +++ b/content/posts/2021/03/08/foojay-announces-initial-companies-making-up-its-advisory-board-sd-times/index.md @@ -5,7 +5,7 @@ lastmod: "2021-03-26T14:24:15+00:00" description: "Azul, Datadog, DataStax, JFrog, Payara, and Snyk are the initial companies that will be a part of the advisory board." authors: - "geertjan-wielenga" -image: "image-3-1024x385.png" +image: "image-3-1024x385.jpg" categories: - "Press" related_posts: @@ -13,4 +13,4 @@ frozen: false --- Today, published [by Jenna Sargent in SD Times](https://sdtimes.com/java/whats-coming-in-java-16/): -![](image-3-1024x385.png) +![](image-3-1024x385.jpg) diff --git a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-13-08-700x473.jpg b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-13-08-700x473.jpg new file mode 100644 index 000000000..dbc8c48c2 Binary files /dev/null and b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-13-08-700x473.jpg differ diff --git a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-13-08-700x473.png b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-13-08-700x473.png deleted file mode 100644 index 64f120abb..000000000 Binary files a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-13-08-700x473.png and /dev/null differ diff --git a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-34-44-700x473.jpg b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-34-44-700x473.jpg new file mode 100644 index 000000000..6dd119e22 Binary files /dev/null and b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-34-44-700x473.jpg differ diff --git a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-34-44-700x473.png b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-34-44-700x473.png deleted file mode 100644 index b72fc5708..000000000 Binary files a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-34-44-700x473.png and /dev/null differ diff --git a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-37-46-700x473.jpg b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-37-46-700x473.jpg new file mode 100644 index 000000000..eebb1049e Binary files /dev/null and b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-37-46-700x473.jpg differ diff --git a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-37-46-700x473.png b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-37-46-700x473.png deleted file mode 100644 index 73527dee5..000000000 Binary files a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-37-46-700x473.png and /dev/null differ diff --git a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-39-49-700x473.jpg b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-39-49-700x473.jpg new file mode 100644 index 000000000..357b005a0 Binary files /dev/null and b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-39-49-700x473.jpg differ diff --git a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-39-49-700x473.png b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-39-49-700x473.png deleted file mode 100644 index 0f31e99a1..000000000 Binary files a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-39-49-700x473.png and /dev/null differ diff --git a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-43-25-700x473.jpg b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-43-25-700x473.jpg new file mode 100644 index 000000000..caac32e33 Binary files /dev/null and b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-43-25-700x473.jpg differ diff --git a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-43-25-700x473.png b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-43-25-700x473.png deleted file mode 100644 index 4751b6ae2..000000000 Binary files a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-43-25-700x473.png and /dev/null differ diff --git a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/index.md b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/index.md index ab90c5ee2..7218f1255 100644 --- a/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/index.md +++ b/content/posts/2021/03/12/custom-controls-in-javafx-part-vii/index.md @@ -30,7 +30,7 @@ Every time you select something, the selected text will be colored in a specific First of all, I extended a JavaFX Label which is made from a Labeled container that wraps a LabeledText. In the following screenshot the dashed rectangle represents the border of the Labeled container and the Text represents the LabeledText. -![](Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-13-08-700x473.png) +![](Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-13-08-700x473.jpg) In the SelectableLabel class I've added a Region to the Label using the setGraphics() method and aligned it to the right by calling setContentDisplay(ContentDisplay.RIGHT) as you can see in the following code snippet: @@ -80,19 +80,19 @@ The "magic" is in the -fx-background-insets entry, here we stretch the shape in Because it is easier to understand when looking at a picture, here are some screenshots that hopefully explain it. So let's assume the background color of our columns is blue and the border color is red. So let's first take a look at the triangle: -![](Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-34-44-700x473.png) +![](Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-34-44-700x473.jpg) Here you can see that the triangle will stand out on the right side of our SelectableLabel and because of the stretching and compressing it looks like it has only a red border on the left side. If we now add the column with it's blue background and red border it will look as follows: -![](Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-37-46-700x473.png) +![](Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-37-46-700x473.jpg) Ok so if we now add the next column on the right side and make sure that it will be added to the scene graph after the first column it will look as follows: -![](Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-39-49-700x473.png) +![](Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-39-49-700x473.jpg) And here we go, now it looks like we wanted it to look. If we adjust the colors to the real ones it will look as follows: -![](Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-43-25-700x473.png) +![](Affinity-Designer-Untitled-Modified-200.0-2021-02-10-12-43-25-700x473.jpg) With this technique one can create interesting effects by just tweaking the CSS code without the need of creating complex custom controls. So the take away here is that you should keep in mind that background-insets can also be negative which enables a lot of things. diff --git a/content/posts/2021/03/23/spring-boot-java-16-records/6syBh6OHq-842e94e5.png b/content/posts/2021/03/23/spring-boot-java-16-records/6syBh6OHq-842e94e5.png new file mode 100644 index 000000000..4ccf70a59 Binary files /dev/null and b/content/posts/2021/03/23/spring-boot-java-16-records/6syBh6OHq-842e94e5.png differ diff --git a/content/posts/2021/03/23/spring-boot-java-16-records/X6aLicL5f-68d4cc5e.png b/content/posts/2021/03/23/spring-boot-java-16-records/X6aLicL5f-68d4cc5e.png new file mode 100644 index 000000000..cec7d123a Binary files /dev/null and b/content/posts/2021/03/23/spring-boot-java-16-records/X6aLicL5f-68d4cc5e.png differ diff --git a/content/posts/2021/03/23/spring-boot-java-16-records/default-yellow-8f95b1d6.png b/content/posts/2021/03/23/spring-boot-java-16-records/default-yellow-8f95b1d6.png new file mode 100644 index 000000000..21ed36b7e Binary files /dev/null and b/content/posts/2021/03/23/spring-boot-java-16-records/default-yellow-8f95b1d6.png differ diff --git a/content/posts/2021/03/23/spring-boot-java-16-records/index.md b/content/posts/2021/03/23/spring-boot-java-16-records/index.md index 6d7d19404..46622efb0 100644 --- a/content/posts/2021/03/23/spring-boot-java-16-records/index.md +++ b/content/posts/2021/03/23/spring-boot-java-16-records/index.md @@ -76,7 +76,7 @@ class Point { Another option that we developers use most often is to leave the handling of the boilerplate to the IDE. For example, with Intellij, you can generate constructors, getters, setters, equals, hashCode, and toString, etc., by simply pressing Command + N shortcut key. But the boilerplate code is still there. -![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1616085356856/X6aLicL5f.png) +![image.png](X6aLicL5f-68d4cc5e.png) With Java 16 Records, it's just one line of code. Cool, isn't it: @@ -288,7 +288,7 @@ public record State(String name, String capital) { Then I took the help of the IntelliJ feature to generate the constructor for this record class. It provided me with the following options. -![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1616100878502/6syBh6OHq.png) +![image.png](6syBh6OHq-842e94e5.png) I tried these options but got the same result. I already knew that these options wouldn't work, but I tried my luck, which makes me wonder how to use records with `BeanPropertyRowMapper.` I don't have an answer for this right now, but I will dig this further. If you see any issue with the code or have a better answer, then let me know. @@ -307,4 +307,4 @@ In the last section, we discovered that Records are good for use in cases such a If you like what you just read, then you can buy me a coffee by clicking the link in the image below: -[![Buy Me A Coffee](https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png)](https://www.buymeacoffee.com/meashish) +[![Buy Me A Coffee](default-yellow-8f95b1d6.png)](https://www.buymeacoffee.com/meashish) diff --git a/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Configure-module-dependencies.jpg b/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Configure-module-dependencies.jpg new file mode 100644 index 000000000..52aaaf024 Binary files /dev/null and b/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Configure-module-dependencies.jpg differ diff --git a/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Configure-module-dependencies.png b/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Configure-module-dependencies.png deleted file mode 100644 index 6c75ed895..000000000 Binary files a/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Configure-module-dependencies.png and /dev/null differ diff --git a/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Convert-to-switch-expression.jpg b/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Convert-to-switch-expression.jpg new file mode 100644 index 000000000..f9612de0f Binary files /dev/null and b/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Convert-to-switch-expression.jpg differ diff --git a/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Convert-to-switch-expression.png b/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Convert-to-switch-expression.png deleted file mode 100644 index b05484988..000000000 Binary files a/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Convert-to-switch-expression.png and /dev/null differ diff --git a/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Create-and-export-package.jpg b/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Create-and-export-package.jpg new file mode 100644 index 000000000..6d5957cf9 Binary files /dev/null and b/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Create-and-export-package.jpg differ diff --git a/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Create-and-export-package.png b/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Create-and-export-package.png deleted file mode 100644 index b78bedf9d..000000000 Binary files a/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Create-and-export-package.png and /dev/null differ diff --git a/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Preview-features-severity.jpg b/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Preview-features-severity.jpg new file mode 100644 index 000000000..39a9580ae Binary files /dev/null and b/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Preview-features-severity.jpg differ diff --git a/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Preview-features-severity.png b/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Preview-features-severity.png deleted file mode 100644 index b24d12a8d..000000000 Binary files a/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/Preview-features-severity.png and /dev/null differ diff --git a/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/index.md b/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/index.md index b23a86856..56b5dcb3c 100644 --- a/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/index.md +++ b/content/posts/2021/03/30/keeping-pace-with-java-using-eclipse-ide/index.md @@ -47,7 +47,7 @@ To quickly enable the preview features on an existing Java project, you can righ When a preview feature is used in the code, a default warning is provided by the compiler that the preview feature may not be supported in a future release. You can choose to ignore this problem or set it to Info by changing its severity level on the Java Compiler preference page: -![](Preview-features-severity.png) +![](Preview-features-severity.jpg) ### Sealed Classes @@ -101,7 +101,7 @@ The indentation of a text block can be configured in the formatter profile: Eclipse IDE provides you a Quick Assist (Ctrl/Cmd + 1) and clean up option to convert eligible switch statements into switch expressions: -![](Convert-to-switch-expression.png) +![](Convert-to-switch-expression.jpg) Many quick fixes, quick assists, and templates are also provided to help you in writing code with switch improvements. For example, there are quick fixes to add the `default` case or the missing case statements in a switch expression: @@ -147,7 +147,7 @@ You can go to the project's properties and add libraries to its modulepath on th You can also configure the properties of its module graph on the Java Build Path \> Module Dependencies tab: -![](Configure-module-dependencies.png) +![](Configure-module-dependencies.jpg) Quick Fixes are provided to identify the used types and add the required modules to module-info.java file: @@ -155,7 +155,7 @@ Quick Fixes are provided to identify the used types and add the required modules You can create and export a new non-empty package directly from the module-info.java file using the provided Quick Fixes: -![](Create-and-export-package.png) +![](Create-and-export-package.jpg) You can also provide a service implementation from module-info.java with the help of the provided Quick Fixes: diff --git a/content/posts/2021/04/01/java-ecosystem-survey-2021/Java-Ecosystem-2021-Survey-1-1024x576.jpg b/content/posts/2021/04/01/java-ecosystem-survey-2021/Java-Ecosystem-2021-Survey-1-1024x576.jpg new file mode 100644 index 000000000..768059836 Binary files /dev/null and b/content/posts/2021/04/01/java-ecosystem-survey-2021/Java-Ecosystem-2021-Survey-1-1024x576.jpg differ diff --git a/content/posts/2021/04/01/java-ecosystem-survey-2021/Java-Ecosystem-2021-Survey-1-1024x576.png b/content/posts/2021/04/01/java-ecosystem-survey-2021/Java-Ecosystem-2021-Survey-1-1024x576.png deleted file mode 100644 index 9de609034..000000000 Binary files a/content/posts/2021/04/01/java-ecosystem-survey-2021/Java-Ecosystem-2021-Survey-1-1024x576.png and /dev/null differ diff --git a/content/posts/2021/04/01/java-ecosystem-survey-2021/index.md b/content/posts/2021/04/01/java-ecosystem-survey-2021/index.md index 1734e8cda..b2fbc9ee4 100644 --- a/content/posts/2021/04/01/java-ecosystem-survey-2021/index.md +++ b/content/posts/2021/04/01/java-ecosystem-survey-2021/index.md @@ -7,7 +7,7 @@ canonical: "https://snyk.io/blog/java-ecosystem-survey-2021/" authors: - "bmvermeer" - "geertjan-wielenga" -image: "https://lh6.googleusercontent.com/pE3ECVjEXTzDVr3fus4nGAzSoY7288RU21Vb-KQ5Xmu7FJpi8zEvjWQeSCb9gQAdHn4EqApLc0CncLDS0JkxDNi0XRHqqRsxjyqkYhfK69jrSkHOTMNflNrrAdY1KkywbfdAo-02" +image: "pE3ECVjEXTzDVr3fus4nGAzSoY7288RU21Vb-KQ5-4bb1e610.png" categories: - "Surveys" related_posts: @@ -21,7 +21,7 @@ Just like in 2020, [Snyk](https://snyk.io) is creating a comprehensive Java 2021 Here's the summary of the [JVM Ecosystem 2020](https://snyk.io/blog/jvm-ecosystem-report-2020) report: -{{< img src="https://lh6.googleusercontent.com/pE3ECVjEXTzDVr3fus4nGAzSoY7288RU21Vb-KQ5Xmu7FJpi8zEvjWQeSCb9gQAdHn4EqApLc0CncLDS0JkxDNi0XRHqqRsxjyqkYhfK69jrSkHOTMNflNrrAdY1KkywbfdAo-02" class="aligncenter is-resized" width="800" height="435" >}} +{{< img src="pE3ECVjEXTzDVr3fus4nGAzSoY7288RU21Vb-KQ5-4bb1e610.png" class="aligncenter is-resized" width="800" height="435" >}} As always, we couldn't have done this without you! So, once again, we ask for your help with the 2021 edition of the JVM Ecosystem Report. [Go to the Java 2021 survey](https://snykteam.typeform.com/to/ZHuh7NzJ) @@ -30,7 +30,7 @@ Just like last year, we put together a comprehensive survey. Together with our p It takes less than 3 minutes to voice your preferences in this year's Java and JVM report! -{{< img src="Java-Ecosystem-2021-Survey-1-1024x576.png" class="aligncenter size-large is-resized" width="768" height="432" >}} +{{< img src="Java-Ecosystem-2021-Survey-1-1024x576.jpg" class="aligncenter size-large is-resized" width="768" height="432" >}} Our final report this year will embed multiple data points, on top of the survey results, so this will be extra interesting! Besides data that we already have at Snyk, we will look at GitHub projects, Google searches, and other available data. Combined with the survey results, we aim to create the most comprehensive overview of the JVM 2021 landscape. diff --git a/content/posts/2021/04/01/java-ecosystem-survey-2021/pE3ECVjEXTzDVr3fus4nGAzSoY7288RU21Vb-KQ5-4bb1e610.png b/content/posts/2021/04/01/java-ecosystem-survey-2021/pE3ECVjEXTzDVr3fus4nGAzSoY7288RU21Vb-KQ5-4bb1e610.png new file mode 100644 index 000000000..65ba0698c Binary files /dev/null and b/content/posts/2021/04/01/java-ecosystem-survey-2021/pE3ECVjEXTzDVr3fus4nGAzSoY7288RU21Vb-KQ5-4bb1e610.png differ diff --git a/content/posts/2021/04/02/creating-a-javafx-world-clock-from-scratch-part-3/References-to-controller-css.jpg b/content/posts/2021/04/02/creating-a-javafx-world-clock-from-scratch-part-3/References-to-controller-css.jpg new file mode 100644 index 000000000..19facb609 Binary files /dev/null and b/content/posts/2021/04/02/creating-a-javafx-world-clock-from-scratch-part-3/References-to-controller-css.jpg differ diff --git a/content/posts/2021/04/02/creating-a-javafx-world-clock-from-scratch-part-3/References-to-controller-css.png b/content/posts/2021/04/02/creating-a-javafx-world-clock-from-scratch-part-3/References-to-controller-css.png deleted file mode 100644 index b4326584e..000000000 Binary files a/content/posts/2021/04/02/creating-a-javafx-world-clock-from-scratch-part-3/References-to-controller-css.png and /dev/null differ diff --git a/content/posts/2021/04/02/creating-a-javafx-world-clock-from-scratch-part-3/index.md b/content/posts/2021/04/02/creating-a-javafx-world-clock-from-scratch-part-3/index.md index 00fce655c..ff86ac592 100644 --- a/content/posts/2021/04/02/creating-a-javafx-world-clock-from-scratch-part-3/index.md +++ b/content/posts/2021/04/02/creating-a-javafx-world-clock-from-scratch-part-3/index.md @@ -153,7 +153,7 @@ From a high-level here are the ingredients and steps to create a JavaFX UI Form. Once the controller and CSS files exist (created) you can reference them in Scene Builder tool as shown below: -![Referencing Controller and CSS files](References-to-controller-css.png) +![Referencing Controller and CSS files](References-to-controller-css.jpg) On the left (1) shows the controller class referencing the `com.carlfx.worldclock.ConfigLocationsController.java` class. And on the right (2) you'll notice the references to the CSS files for styling the UI Form (AnchorPane). diff --git a/content/posts/2021/04/06/java-16-and-intellij-idea/Java16_blog-e688b224.jpg b/content/posts/2021/04/06/java-16-and-intellij-idea/Java16_blog-e688b224.jpg new file mode 100644 index 000000000..1f4a3daac Binary files /dev/null and b/content/posts/2021/04/06/java-16-and-intellij-idea/Java16_blog-e688b224.jpg differ diff --git a/content/posts/2021/04/06/java-16-and-intellij-idea/index.md b/content/posts/2021/04/06/java-16-and-intellij-idea/index.md index ed2fb0265..fdf64efbc 100644 --- a/content/posts/2021/04/06/java-16-and-intellij-idea/index.md +++ b/content/posts/2021/04/06/java-16-and-intellij-idea/index.md @@ -26,7 +26,7 @@ Fun fact - Records was voted the most popular Java 16 language feature by 1158 d In this blog post, I will limit coverage of Java 16 to its language features, why you need them, and how you can start using them in [IntelliJ IDEA](https://www.jetbrains.com/idea/nextversion/). You can use [this link](https://openjdk.java.net/projects/jdk/16/) for a comprehensive list of the new Java 16 features. Let's get started. -![Java 16 and IntelliJ IDEA](https://blog.jetbrains.com/wp-content/uploads/2021/03/Java16_blog.png) +![Java 16 and IntelliJ IDEA](Java16_blog-e688b224.jpg) Records introduce a new type declaration that simplifies the task of modeling your immutable data. Though it helps cut down on boilerplate code significantly, that isn't the primary reason for its introduction. Here's an example: @@ -36,7 +36,7 @@ record Person(String name, int age) {} With just one line of code, the preceding example defines a record `Person` with two components `name` and `age`. To create a record using IntelliJ IDEA 2021.1, select Record in the New Java Class dialog box. Fill in the name and you are good to go. -![](https://blog.jetbrains.com/wp-content/uploads/2021/03/java16-6-cover.png) +![](java16-6-cover-a755f786.png) Let's quickly check the configuration of IntelliJ IDEA on your system to ensure you can get the code to run it. @@ -44,7 +44,7 @@ Let's quickly check the configuration of IntelliJ IDEA on your system to ensure Java 16 features are supported in IntelliJ IDEA 2021.1, which is scheduled to be released this March. The early access versions of 2021.1 are already available. You can configure it to use Java 16 by selecting 16 as the Project SDK and choosing *16 (Preview) – Sealed types* in the Project language level for your Project and Modules settings. -![](https://blog.jetbrains.com/wp-content/uploads/2021/03/java16-config.png) +![](java16-config-6966cd25.png) You can also download Java 16 directly from IntelliJ IDEA. To do so, go to *Platform Settings* and click on *SDKs* , then click the '+' sign at the top, choose *Download JDK*, then select the Vendor and version and the directory to download the JDK to. @@ -64,11 +64,11 @@ Imagine you want to persist the details of, say, a person to a file. Before the The following gif demonstrates how you can declare class `Person` as a regular class, generate code for it, implement the interface `Serializable` and run it to verify you can write it to a file and read from it: -![](https://blog.jetbrains.com/wp-content/uploads/2021/03/java16-7-cover.png) +![](java16-7-cover-1bd7ce60.png) Now, let's declare `Person` as a record using just one line of code with components `name` (String) and `age` (int). It implements the interface `Serializable` since we need to persist its instances to a file. Note that you can still use the same methods to persist it to a text file. Also, there are no changes in how you instantiate it (by using the new operator): -![](https://blog.jetbrains.com/wp-content/uploads/2021/03/java16-15-cover.png) +![](java16-15-cover-839c0edc.png) Record `Person` is just one example on how you can use Records. You can use records to model your data, without additional overhead of defining additional methods. @@ -96,13 +96,13 @@ IntelliJ IDEA lets you insert a compact, canonical, or custom constructor in a r Let's see how you can insert a compact constructor using the Alt+Insert shortcut in IntelliJ IDEA, and add validation code to it: -![](https://blog.jetbrains.com/wp-content/uploads/2021/03/java16-8-cover.png) +![](java16-8-cover-321c0775.png) You can also add a canonical constructor to a record. This defines a parameter list – which must have the same names and order as those of the components of a record. A mismatch would result in a compilation error. By invoking context actions in IntelliJ IDEA (with Alt+Enter), you can easily convert a canonical constructor to a compact constructor: -![](https://blog.jetbrains.com/wp-content/uploads/2021/03/java16-9-cover.png) +![](java16-9-cover-7cbc6705.png) ## Truly immutable data @@ -205,19 +205,19 @@ new Table(), 200, 100, 55, 136.88); If you are working with records but need to transition it to the codebase of an older Java version that doesn't support records, you can quickly convert a record to a regular class by using the context action Convert record to class or vice-versa by using the context action Convert to a record: -![](https://blog.jetbrains.com/wp-content/uploads/2021/03/java16-10-cover.png) +![](java16-10-cover-138300c9.png) ## Records as components of record A record component can be another record. In the following example, record `Automobile` defines one of its components as `Engine`, another record: -![](https://blog.jetbrains.com/wp-content/uploads/2021/03/java16-11-cover.png) +![](java16-11-cover-8dcfd7ed.png) ## Adding annotations to record components You can add an appropriate annotation to the components of a record, say, `@NotNull`, as demonstrated in the following gif: -![](https://blog.jetbrains.com/wp-content/uploads/2021/03/java16-12-cover.png) +![](java16-12-cover-60723fae.png) Developers often use third-party libraries like Jackson to persist value objects. Jackson supports records too. However, depending on the Jackson library version you are using (say, 2.11.3), you might need to annotate the components of your records using the annotation `@JsonProperty`, as follows: @@ -337,7 +337,7 @@ public class ReadWriteObj { You can refactor a Record and modify the order of its components or types, modify their names, and add new or remove existing ones. IntelliJ IDEA has simplified how you apply Rename or Change Signature Refactorings. The changes would reflect in a record's canonical constructor and its instance creation: -![](https://blog.jetbrains.com/wp-content/uploads/2021/03/java16-13-cover.png) +![](java16-13-cover-d127d075.png) ## A restricted identifier diff --git a/content/posts/2021/04/06/java-16-and-intellij-idea/java16-10-cover-138300c9.png b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-10-cover-138300c9.png new file mode 100644 index 000000000..598dd66b1 Binary files /dev/null and b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-10-cover-138300c9.png differ diff --git a/content/posts/2021/04/06/java-16-and-intellij-idea/java16-11-cover-8dcfd7ed.png b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-11-cover-8dcfd7ed.png new file mode 100644 index 000000000..48413e746 Binary files /dev/null and b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-11-cover-8dcfd7ed.png differ diff --git a/content/posts/2021/04/06/java-16-and-intellij-idea/java16-12-cover-60723fae.png b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-12-cover-60723fae.png new file mode 100644 index 000000000..d0bd7e2de Binary files /dev/null and b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-12-cover-60723fae.png differ diff --git a/content/posts/2021/04/06/java-16-and-intellij-idea/java16-13-cover-d127d075.png b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-13-cover-d127d075.png new file mode 100644 index 000000000..a26300bb3 Binary files /dev/null and b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-13-cover-d127d075.png differ diff --git a/content/posts/2021/04/06/java-16-and-intellij-idea/java16-15-cover-839c0edc.png b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-15-cover-839c0edc.png new file mode 100644 index 000000000..1a6741054 Binary files /dev/null and b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-15-cover-839c0edc.png differ diff --git a/content/posts/2021/04/06/java-16-and-intellij-idea/java16-6-cover-a755f786.png b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-6-cover-a755f786.png new file mode 100644 index 000000000..1a7c79465 Binary files /dev/null and b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-6-cover-a755f786.png differ diff --git a/content/posts/2021/04/06/java-16-and-intellij-idea/java16-7-cover-1bd7ce60.png b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-7-cover-1bd7ce60.png new file mode 100644 index 000000000..798b40fad Binary files /dev/null and b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-7-cover-1bd7ce60.png differ diff --git a/content/posts/2021/04/06/java-16-and-intellij-idea/java16-8-cover-321c0775.png b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-8-cover-321c0775.png new file mode 100644 index 000000000..79821e786 Binary files /dev/null and b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-8-cover-321c0775.png differ diff --git a/content/posts/2021/04/06/java-16-and-intellij-idea/java16-9-cover-7cbc6705.png b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-9-cover-7cbc6705.png new file mode 100644 index 000000000..785b0541d Binary files /dev/null and b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-9-cover-7cbc6705.png differ diff --git a/content/posts/2021/04/06/java-16-and-intellij-idea/java16-config-6966cd25.png b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-config-6966cd25.png new file mode 100644 index 000000000..c270c26bb Binary files /dev/null and b/content/posts/2021/04/06/java-16-and-intellij-idea/java16-config-6966cd25.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Build-Maven-Project-in-Jenkins-1-1f915142.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Build-Maven-Project-in-Jenkins-1-1f915142.png new file mode 100644 index 000000000..e88c89b0b Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Build-Maven-Project-in-Jenkins-1-1f915142.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Build-Executor-Status-d0f724aa.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Build-Executor-Status-d0f724aa.png new file mode 100644 index 000000000..164e63176 Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Build-Executor-Status-d0f724aa.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Access-Token-1-8609f112.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Access-Token-1-8609f112.png new file mode 100644 index 000000000..f68101642 Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Access-Token-1-8609f112.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Build-Debug-1-21254432.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Build-Debug-1-21254432.png new file mode 100644 index 000000000..6a53d0901 Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Build-Debug-1-21254432.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Create-New-Job-3b49dfcb.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Create-New-Job-3b49dfcb.png new file mode 100644 index 000000000..a859529ca Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Create-New-Job-3b49dfcb.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Domain-2-1178226b.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Domain-2-1178226b.png new file mode 100644 index 000000000..2b357504b Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Domain-2-1178226b.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-GitHub-Project-ca3d1f8c.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-GitHub-Project-ca3d1f8c.png new file mode 100644 index 000000000..fc186542b Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-GitHub-Project-ca3d1f8c.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-HelloWorld-1-26702e09.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-HelloWorld-1-26702e09.png new file mode 100644 index 000000000..1b519d40d Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-HelloWorld-1-26702e09.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Java-Application-Deploym-35423ef2.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Java-Application-Deploym-35423ef2.png new file mode 100644 index 000000000..6ad4558d6 Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Java-Application-Deploym-35423ef2.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Java-Project-df4a632d.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Java-Project-df4a632d.png new file mode 100644 index 000000000..9181987e9 Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Java-Project-df4a632d.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Label-Expression-1-8ab09dfe.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Label-Expression-1-8ab09dfe.png new file mode 100644 index 000000000..1a25078e1 Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Label-Expression-1-8ab09dfe.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Maven-settings-1-136d5932.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Maven-settings-1-136d5932.png new file mode 100644 index 000000000..dc6aa5788 Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Maven-settings-1-136d5932.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Parameters-b7c0cc7d.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Parameters-b7c0cc7d.png new file mode 100644 index 000000000..fc961447a Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Parameters-b7c0cc7d.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Repository-1-40201e89.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Repository-1-40201e89.png new file mode 100644 index 000000000..4b68d0499 Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Repository-1-40201e89.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Variables-1-939ce403.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Variables-1-939ce403.png new file mode 100644 index 000000000..4d1472f11 Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Variables-1-939ce403.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Workers-and-Master-e0e5e544.jpg b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Workers-and-Master-e0e5e544.jpg new file mode 100644 index 000000000..7d4715313 Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Cluster-Workers-and-Master-e0e5e544.jpg differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Executors-c534659c.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Executors-c534659c.png new file mode 100644 index 000000000..a456f8016 Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Jenkins-Executors-c534659c.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Maven-Java-Project-in-Jenkins-1-74e6d66e.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Maven-Java-Project-in-Jenkins-1-74e6d66e.png new file mode 100644 index 000000000..ca828a63e Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/Maven-Java-Project-in-Jenkins-1-74e6d66e.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/index.md b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/index.md index dcc9f64ee..f473c1d1d 100644 --- a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/index.md +++ b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/index.md @@ -30,39 +30,39 @@ In this article, we'll describe how to install Jenkins cluster with slave nodes 2. If required, change the number of **Workers** (slaves), **Environment name** and destination **Region**. -![Jenkins Cluster installation](https://jelastic.com/blog/wp-content/uploads/2020/02/new-logo-install.png) +![Jenkins Cluster installation](new-logo-install-33786926.png) 3. As shown in the picture below, the deployed Jenkins topology comprises one master node and two worker nodes. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2020/02/jenkins-cluster-environment-1.png" class="size-medium" width="625" height="254" >}} +{{< img src="jenkins-cluster-environment-1-75a3b813.png" class="size-medium" width="625" height="254" >}} ### Installation as New Environment In order to simplify cluster provisioning our team has prepared Jenkins certified templates for master and worker nodes. Once you click on the **New Environment** and add Jenkins application server, the **Auto-Clustering** functionality creates cluster topology which comprises one master node and one worker node by default. The worker nodes can be scaled out horizontally up to 16 nodes being automatically detected and registered at master node and vice versa. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/jenkins-auto-clustering.png) +![](jenkins-auto-clustering-97144303.png) ## Jenkins Cluster Specifics Each worker node has an [executor](https://wiki.jenkins.io/display/JENKINS/Terminology) process that is used for building the projects. By default one job at a time can be run since there is one executor configured in a worker. You may change the number of executors. To do this click on **Build Executor Status** and press **Configure** at node you need to change the number of executors in. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Build-Executor-Status.png) +![](Jenkins-Build-Executor-Status-d0f724aa.png) Change the number of executors and apply changes with the **Save** button. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Executors.png) +![](Jenkins-Executors-c534659c.png) For example you build tasks stuck in a long queue, the worker nodes can be [scaled out horizontally](https://jelastic.com/blog/horizontal-scaling-of-cloud-environments-stateless-stateful-automatic/) either manually or automatically for speeding up a large number of the project builds. In such cases, the package ensures an automatic discovery of new worker nodes by the Jenkins master node. It takes just a couple minutes to expand cluster e.g. up to 10 workers. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2020/02/jenkins-cluster-cicd-1.png" class="size-medium" width="711" height="154" >}} +{{< img src="jenkins-cluster-cicd-1-b663e931.png" class="size-medium" width="711" height="154" >}} Press **Change Environment Topology** and choose Workers layer (Java Engine) and do horizontal scaling with + button in the **Horizontal Scaling** section of the wizard. It's also preferable to choose **stateless** scaling mode as we do not store any important state in the workers. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/jenkins-cluster-java-engine-1.png) +![](jenkins-cluster-java-engine-1-c810ae6f.png) Once scaling is completed, make sure the all newly created worker nodes were discovered and registered automatically at master. Go back to the Jenkins admin panel and click on **Build Executor Status** link once again to see all of available cluster members in a friendly format. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Cluster-Workers-and-Master.png) +![](Jenkins-Cluster-Workers-and-Master-e0e5e544.jpg) ## Create a New Job through Jenkins Admin Panel @@ -70,19 +70,19 @@ Now let's see how to create a job that builds and publishes a simple project to 1.After installation, log in to the admin panel with credentials from the respective email. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/open-jenkins-cluster-1.png) +![](open-jenkins-cluster-1-f62b925f.png) 2.At the top of the page click on create new jobs. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Cluster-Create-New-Job.png) +![](Jenkins-Cluster-Create-New-Job-3b49dfcb.png) 3.Specify the project name (e.g. *My Java Project* ), choose **Maven project** and press **OK**. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Cluster-Java-Project.png) +![](Jenkins-Cluster-Java-Project-df4a632d.png) 4.Define the project **Description** , click on the **GitHub project** and specify the repository URL. Within this tutorial, we use . -![](https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Cluster-GitHub-Project.png) +![](Jenkins-Cluster-GitHub-Project-ca3d1f8c.png) 5.The Jelastic Maven plugin requires the destination environment access parameters to be defined and passed to the [pom.xml](https://github.com/jelastic/helloworld/blob/master/pom.xml) file located in the repository of the application you build. @@ -111,17 +111,17 @@ The plugin's section in the **pom.xml** looks as follows: For defining parameters via project variables click on the checkbox This project is parameterized and add the first variable clicking on **Add Parameter \> String Parameter**. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Cluster-Parameters.png) +![](Jenkins-Cluster-Parameters-b7c0cc7d.png) As for our example, we use four variables defined globally for the project: * **JELASTIC_API_ENDPOINT** - Defines destination hosting platform hostname. See Hoster Domain field in the list of [Jelastic Hosting Providers](https://docs.jelastic.com/jelastic-hoster-info). * **TARGET_ENV** - deployment destination environment [shortdomain](https://docs.jelastic.com/create-env-api) name within the destination hosting platform. The destination environment must have a Java application server, here we use [Tomcat](https://docs.jelastic.com/tomcat). You can deploy to a single node environment or clusterized one. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Cluster-Domain-2.png" class="size-medium" width="841" height="195" >}} +{{< img src="Jenkins-Cluster-Domain-2-1178226b.png" class="size-medium" width="841" height="195" >}} * **TOKEN** - access token for the platform on which the deployment environment is located.Set the **Description** for new access token and expiry date, then in the **API** field use a predefined **Maven Plugin** template which will allow the DeployApp API method to be executed. The respective access parameters will be selected automatically. - ![](https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Cluster-Access-Token-1.png) + ![](Jenkins-Cluster-Access-Token-1-8609f112.png) @@ -129,15 +129,15 @@ As for our example, we use four variables defined globally for the project: Finally, the variables section should look like in the picture below. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Cluster-Variables-1.png) +![](Jenkins-Cluster-Variables-1-939ce403.png) 6.Then scroll down to the **Source Code Management** section and specify the **Repository URL**. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Cluster-Repository-1.png) +![](Jenkins-Cluster-Repository-1-40201e89.png) 7.In the **Build** section set the phases the Maven will execute: **clean** , **package** and **jelastic:deploy** . Finally, press the **Save** button. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Cluster-Maven-settings-1.png) +![](Jenkins-Cluster-Maven-settings-1-136d5932.png) Resulting from the **clean** and **package** phases you will get a war archive file. In our case, it will be **helloworld.war** file as for project. @@ -147,23 +147,23 @@ The **jelastic:deploy** is performed by Jelastic Maven plugin on the fly during 1.Click on **Build Now**. Then confirm the parameters to be passed to the Jelastic Maven plugin. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/Maven-Java-Project-in-Jenkins-1.png) +![](Maven-Java-Project-in-Jenkins-1-74e6d66e.png) 2.In the **Build History** , you can see that the build is performed successfully and marked with a green sign next to the **#1**. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/Build-Maven-Project-in-Jenkins-1.png) +![](Build-Maven-Project-in-Jenkins-1-1f915142.png) ## Build Debug inside Jenkins By hovering over the sign next to the build, you can open the **Console Output** that may help you to debug project building. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Cluster-Build-Debug-1.png) +![](Jenkins-Cluster-Build-Debug-1-21254432.png) The output contains all of the commands executed during the build. Jenkins does job distribution among all of the available worker nodes trying to load them equally. If you want to execute project building on the specific node, go to the **General** section and enable **Restrict where this project can be run** option. Fill out the **Label Expression** field with hostname like node${nodeID}. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Cluster-Label-Expression-1.png) +![](Jenkins-Cluster-Label-Expression-1-8ab09dfe.png) ## Java Project Deployment via Jenkins @@ -171,10 +171,10 @@ If the build procedure succeeds, it means that Jenkins deployed the result appli Click on the **Open in Browser** button at the destination server to make sure the deployment was performed properly. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Cluster-Java-Application-Deployment.png" class="size-medium" width="838" height="194" >}} +{{< img src="Jenkins-Cluster-Java-Application-Deploym-35423ef2.png" class="size-medium" width="838" height="194" >}} The *helloworld.war* application web page should be displayed as follows. -![](https://jelastic.com/blog/wp-content/uploads/2020/02/Jenkins-Cluster-HelloWorld-1.png) +![](Jenkins-Cluster-HelloWorld-1-26702e09.png) That's it! Now you know how to easily get Jenkins cluster installation in the cloud with the Maven project build and deploy. Register at one of [Jelastic cloud service providers](https://jelastic.com/) to automate continuous integration and delivery of your Java applications using pre-configured master-slave Jenkins cluster. diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/jenkins-auto-clustering-97144303.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/jenkins-auto-clustering-97144303.png new file mode 100644 index 000000000..53a11bdab Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/jenkins-auto-clustering-97144303.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/jenkins-cluster-cicd-1-b663e931.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/jenkins-cluster-cicd-1-b663e931.png new file mode 100644 index 000000000..9481444e6 Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/jenkins-cluster-cicd-1-b663e931.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/jenkins-cluster-environment-1-75a3b813.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/jenkins-cluster-environment-1-75a3b813.png new file mode 100644 index 000000000..26e26ceed Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/jenkins-cluster-environment-1-75a3b813.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/jenkins-cluster-java-engine-1-c810ae6f.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/jenkins-cluster-java-engine-1-c810ae6f.png new file mode 100644 index 000000000..a3e7c56be Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/jenkins-cluster-java-engine-1-c810ae6f.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/new-logo-install-33786926.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/new-logo-install-33786926.png new file mode 100644 index 000000000..717f23b78 Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/new-logo-install-33786926.png differ diff --git a/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/open-jenkins-cluster-1-f62b925f.png b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/open-jenkins-cluster-1-f62b925f.png new file mode 100644 index 000000000..cce3fe035 Binary files /dev/null and b/content/posts/2021/04/12/jenkins-cluster-continuous-integration-delivery-in-jelastic-paas/open-jenkins-cluster-1-f62b925f.png differ diff --git a/content/posts/2021/04/13/deep-dive-into-multi-threading-in-java/dzone-com-cefc94ac.png b/content/posts/2021/04/13/deep-dive-into-multi-threading-in-java/dzone-com-cefc94ac.png new file mode 100644 index 000000000..2cf4cbb7a Binary files /dev/null and b/content/posts/2021/04/13/deep-dive-into-multi-threading-in-java/dzone-com-cefc94ac.png differ diff --git a/content/posts/2021/04/13/deep-dive-into-multi-threading-in-java/index.md b/content/posts/2021/04/13/deep-dive-into-multi-threading-in-java/index.md index dafcfc944..35dd3bdc7 100644 --- a/content/posts/2021/04/13/deep-dive-into-multi-threading-in-java/index.md +++ b/content/posts/2021/04/13/deep-dive-into-multi-threading-in-java/index.md @@ -40,7 +40,7 @@ Multi-threading represents a very intriguing topic, even after years of research **Reentrancy:** When a method or subroutine can be reentered without completing its previous invocation. -![Image title](https://dzone.com/storage/temp/4926946-4.png) +![Image title](dzone-com-cefc94ac.png) ### Thread Interfaces or Classes or in Java diff --git a/content/posts/2021/04/15/8-best-practices-to-prevent-sql-injection-attacks/8-best-practices-to-prevent-SQL-injection-attacks-1-1024x724.jpg b/content/posts/2021/04/15/8-best-practices-to-prevent-sql-injection-attacks/8-best-practices-to-prevent-SQL-injection-attacks-1-1024x724.jpg new file mode 100644 index 000000000..9fd548c5d Binary files /dev/null and b/content/posts/2021/04/15/8-best-practices-to-prevent-sql-injection-attacks/8-best-practices-to-prevent-SQL-injection-attacks-1-1024x724.jpg differ diff --git a/content/posts/2021/04/15/8-best-practices-to-prevent-sql-injection-attacks/8-best-practices-to-prevent-SQL-injection-attacks-1-1024x724.png b/content/posts/2021/04/15/8-best-practices-to-prevent-sql-injection-attacks/8-best-practices-to-prevent-SQL-injection-attacks-1-1024x724.png deleted file mode 100644 index 21d307c5d..000000000 Binary files a/content/posts/2021/04/15/8-best-practices-to-prevent-sql-injection-attacks/8-best-practices-to-prevent-SQL-injection-attacks-1-1024x724.png and /dev/null differ diff --git a/content/posts/2021/04/15/8-best-practices-to-prevent-sql-injection-attacks/index.md b/content/posts/2021/04/15/8-best-practices-to-prevent-sql-injection-attacks/index.md index 13e5afedf..985c14e2d 100644 --- a/content/posts/2021/04/15/8-best-practices-to-prevent-sql-injection-attacks/index.md +++ b/content/posts/2021/04/15/8-best-practices-to-prevent-sql-injection-attacks/index.md @@ -29,4 +29,4 @@ These are the 8 best practices we discuss in [this article](https://snyk.io/blog 8. Be careful with stored procedures [Read the full article](https://snyk.io/blog/sql-injection-cheat-sheet/). -[![](8-best-practices-to-prevent-SQL-injection-attacks-1-1024x724.png)](https://snyk.io/blog/sql-injection-cheat-sheet/) +[![](8-best-practices-to-prevent-SQL-injection-attacks-1-1024x724.jpg)](https://snyk.io/blog/sql-injection-cheat-sheet/) diff --git a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/enable-git-staging-1.jpg b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/enable-git-staging-1.jpg new file mode 100644 index 000000000..1fef14e39 Binary files /dev/null and b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/enable-git-staging-1.jpg differ diff --git a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/enable-git-staging-1.png b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/enable-git-staging-1.png deleted file mode 100644 index fb6a5a636..000000000 Binary files a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/enable-git-staging-1.png and /dev/null differ diff --git a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/index.md b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/index.md index 1217dcde3..ba305f960 100644 --- a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/index.md +++ b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/index.md @@ -46,7 +46,7 @@ This means that when you commit your files to Git, all the changes in the file t Alternatively, if you want to commit some, but not all, of that file, you can double-click the file from the *Default Changelist* to open the *diff* view. This view shows the last known version that Git has on the left and then your local copy on the right in blue, which you can edit. You can select the checkboxes adjacent to each code change you have made on the right to specifically say that you only want to commit changes in that range, not the whole file. -![Default changelist - partial file selected](intellij-idea-default-changelist-partial-commit-1.png) +![Default changelist - partial file selected](intellij-idea-default-changelist-partial-commit-1.jpg) Note that if you only select part of the file to be committed as in this example, the *Default Changelist* will indicate that the file will be partially committed with a line through the checkbox adjacent to the filename in the Default Changelist as you can see above. @@ -89,7 +89,7 @@ You can also move changes between Changelists using the coloured bars in the gut Lastly, we've already shown you how to set a new Changelist to be the active one, but it's worth mentioning that IntelliJ IDEA needs to know which Changelist to use for new changes; you always need one Changelist that is the active one. You can choose which Changelist is the active one when you have more than one by right-clicking on the Changelist and selecting **Set Active Changelist**. If you don't see this option, it's because the Changelist you have selected is already the active Changelist. -![Set Active IntelliJ IDEA Changelist](set-active-changelist.png) +![Set Active IntelliJ IDEA Changelist](set-active-changelist.jpg) When you commit any new changes, they will be placed in your *Active* IntelliJ IDEA Changelist by default. @@ -109,7 +109,7 @@ IntelliJ IDEA 2020.3 introduced support for [Git staging](https://git-scm.com/do You can then turn it on: -![Enable git staging](enable-git-staging-1.png) +![Enable git staging](enable-git-staging-1.jpg) You can also enable Git staging from the Settings/Preferences dialog with **⌘,** on macOS, or **Ctrl** +**Alt** +**S** to display and then type in *git staging*. @@ -123,7 +123,7 @@ With Git Staging you'll see two folders as opposed to the one IntelliJ IDEA Chan When you make a change to a file it will appear in your *Unstaged* folder initially as a diff that you can stage. You can stage the whole file by dragging it up to the Staged folder, by using the ***+*** icon in the tree, or right-click and select ***+Stage*** . IntelliJ IDEA will run a `git add` command when you do this: -![Staging a whole file](stage-whole-file.png) +![Staging a whole file](stage-whole-file.jpg) `Git add` modifies the file content in the index (the staged content). If you subsequently modify content inside that same range, it will not be committed until it's staged. You can use the staging area to change what is going to be committed independently of any modifications to the local files. With IntelliJ Changelists, any change inside of that same range will be committed. @@ -131,7 +131,7 @@ When you make a change to a file it will appear in your *Unstaged* folder initia Alternatively, you can add part of a file by double-clicking on the file from the *Unstaged* folder and using the `<>` arrows on the Staged version on the left-hand side: -![Reverting part of a file](reverting-changes.png) +![Reverting part of a file](reverting-changes.jpg) You can also rollback a whole file by selecting it from the *Unstaged* area and selecting **Rollback** (or **Revert** prior to version 2021.1). This rollback the file to the state in the index, not the HEAD. @@ -141,7 +141,7 @@ Let's take a look at the functionality in the *Staged* area. Changes in the *Sta You may change your mind and decide you want to unstage a whole file that you've previously staged. As with staging a file, you can either drag it from the *Staged* folder into the *Unstaged* folder, click the \***-\*\*** icon in the tree, or right-click and select 'Unstage': -![Unstage a file](unstage-a-whole-file.png) +![Unstage a file](unstage-a-whole-file.jpg) When you unstage a file, or part of a file, IntelliJ IDEA runs a `git reset` for the change. @@ -149,7 +149,7 @@ When you unstage a file, or part of a file, IntelliJ IDEA runs a `git reset` for You can also unstage a change in a file if you need to. To do that, you need to open the file that contains the change that you want to unstage from the *Staged* folder *diff* view. You can then use the `>>` arrows from the staged portion on the left-hand side to *Unstage* the change. This will unstage that specific change and again, IntelliJ IDEA will run a Git command to reflect the change. You can also type into the editor if you prefer. -![Unstage part of a file](unstage-part-file.png) +![Unstage part of a file](unstage-part-file.jpg) ### Staging or Unstaging Individual Changes Using the Gutter Icons diff --git a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/intellij-idea-default-changelist-partial-commit-1.jpg b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/intellij-idea-default-changelist-partial-commit-1.jpg new file mode 100644 index 000000000..2af5b734a Binary files /dev/null and b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/intellij-idea-default-changelist-partial-commit-1.jpg differ diff --git a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/intellij-idea-default-changelist-partial-commit-1.png b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/intellij-idea-default-changelist-partial-commit-1.png deleted file mode 100644 index d800be8ed..000000000 Binary files a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/intellij-idea-default-changelist-partial-commit-1.png and /dev/null differ diff --git a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/reverting-changes.jpg b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/reverting-changes.jpg new file mode 100644 index 000000000..696fe3a8b Binary files /dev/null and b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/reverting-changes.jpg differ diff --git a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/reverting-changes.png b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/reverting-changes.png deleted file mode 100644 index ff2b77b44..000000000 Binary files a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/reverting-changes.png and /dev/null differ diff --git a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/set-active-changelist.jpg b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/set-active-changelist.jpg new file mode 100644 index 000000000..aa6e6a770 Binary files /dev/null and b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/set-active-changelist.jpg differ diff --git a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/set-active-changelist.png b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/set-active-changelist.png deleted file mode 100644 index 4fc063645..000000000 Binary files a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/set-active-changelist.png and /dev/null differ diff --git a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/stage-whole-file.jpg b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/stage-whole-file.jpg new file mode 100644 index 000000000..8fb303ca2 Binary files /dev/null and b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/stage-whole-file.jpg differ diff --git a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/stage-whole-file.png b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/stage-whole-file.png deleted file mode 100644 index 6bfd66576..000000000 Binary files a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/stage-whole-file.png and /dev/null differ diff --git a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/unstage-a-whole-file.jpg b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/unstage-a-whole-file.jpg new file mode 100644 index 000000000..a38041c3d Binary files /dev/null and b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/unstage-a-whole-file.jpg differ diff --git a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/unstage-a-whole-file.png b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/unstage-a-whole-file.png deleted file mode 100644 index 8d6578c24..000000000 Binary files a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/unstage-a-whole-file.png and /dev/null differ diff --git a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/unstage-part-file.jpg b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/unstage-part-file.jpg new file mode 100644 index 000000000..de4b8723a Binary files /dev/null and b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/unstage-part-file.jpg differ diff --git a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/unstage-part-file.png b/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/unstage-part-file.png deleted file mode 100644 index 3f6c5d4ed..000000000 Binary files a/content/posts/2021/04/16/intellij-idea-changelists-and-git-staging/unstage-part-file.png and /dev/null differ diff --git a/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/add-project-to-environment-6283c523.png b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/add-project-to-environment-6283c523.png new file mode 100644 index 000000000..ed11af8f5 Binary files /dev/null and b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/add-project-to-environment-6283c523.png differ diff --git a/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/deploy-application-66523042.png b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/deploy-application-66523042.png new file mode 100644 index 000000000..aff191c35 Binary files /dev/null and b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/deploy-application-66523042.png differ diff --git a/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/fat-jar-jelastic-url-7eba0937.png b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/fat-jar-jelastic-url-7eba0937.png new file mode 100644 index 000000000..958717ade Binary files /dev/null and b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/fat-jar-jelastic-url-7eba0937.png differ diff --git a/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/fat-jar-microservice-deployment-574a3e7c.png b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/fat-jar-microservice-deployment-574a3e7c.png new file mode 100644 index 000000000..02dae486d Binary files /dev/null and b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/fat-jar-microservice-deployment-574a3e7c.png differ diff --git a/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/import-fat-jar-manifest-201fa8a4.png b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/import-fat-jar-manifest-201fa8a4.png new file mode 100644 index 000000000..df360f291 Binary files /dev/null and b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/import-fat-jar-manifest-201fa8a4.png differ diff --git a/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/index.md b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/index.md index 2537933d6..1d328c092 100644 --- a/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/index.md +++ b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/index.md @@ -24,49 +24,49 @@ You can spend hours reading numerous articles in the net, regarding how to build For a quick start, we have prepared a package with [Maven](https://maven.apache.org/what-is-maven.html) and popular framework [Spring Boot](https://projects.spring.io/spring-boot/) inside Java Engine node. It automates building a sample Java project as *Fat* *(or so-called Uber) Jar*to run it as a microservice. -![jelastic spring boot microservices tutorial](https://jelastic.com/blog/wp-content/uploads/2018/08/maven-microservice-package.png) +![jelastic spring boot microservices tutorial](maven-microservice-package-1c987e06.png) ## Installation of Spring Boot Fat (Uber) Jar Builder To get started, log in to Jelastic dashboard, find the *Spring Boot Fat* *Jar* *Builder* in the **Marketplace** and click **Install**. -![building microservices](https://jelastic.com/blog/wp-content/uploads/2018/08/spring-boot-fat-jar-builder.png) +![building microservices](spring-boot-fat-jar-builder-4d3d1901.png) Or you can **Import** the required manifest using the link from GitHub: [https://github.com/jelastic-jps/spring-boot/blob/master/microservice-fat-jar/manifest.jps](https://github.com/jelastic-jps/spring-boot/blob/master/microservice-fat-jar/manifest.jps?utm_source=spring-boot-fat) -[![maven archetype spring boot](https://jelastic.com/blog/wp-content/uploads/2018/08/import-fat-jar-manifest.png)](https://github.com/jelastic-jps/spring-boot/blob/master/microservice-fat-jar/manifest.jps?utm_source=spring-boot-fat) +[![maven archetype spring boot](import-fat-jar-manifest-201fa8a4.png)](https://github.com/jelastic-jps/spring-boot/blob/master/microservice-fat-jar/manifest.jps?utm_source=spring-boot-fat) If required, change installation settings such as environment name or Git repository link to a custom Spring Boot project. Then press **Install** *.* -*![java spring boot](https://jelastic.com/blog/wp-content/uploads/2018/08/spring-boot-fat-jar-installation.png)* +*![java spring boot](spring-boot-fat-jar-installation-40215c48.png)* When the installation and building of the project are completed, a corresponding message appears. You still need to wait a few minutes for deploy to be finished (feel free to track the process in *Tasks* panel). In the default implementation, it is done under **api/greeting**context. -![how to build microservices](https://jelastic.com/blog/wp-content/uploads/2018/08/fat-jar-microservice-deployment.png) +![how to build microservices](fat-jar-microservice-deployment-574a3e7c.png) Afterwards, you can make sure, that application is up and running by pressing **Open in browser** button. -![spring boot uber jar](https://jelastic.com/blog/wp-content/uploads/2018/08/fat-jar-jelastic-url.png) +![spring boot uber jar](fat-jar-jelastic-url-7eba0937.png) ## Running Multiple Microservices with Spring Boot Projects You can use just created Maven node for building extra projects and deploying them to different environments to get a set of distributed microservices. -![spring boot microservices example](https://jelastic.com/blog/wp-content/uploads/2018/08/set-of-microservices-in-maven-node.png) +![spring boot microservices example](set-of-microservices-in-maven-node-09cd9bbc.png) First of all, create a separate environment with *Java Engine*. -![spring boot maven tutorial](https://jelastic.com/blog/wp-content/uploads/2018/08/java-engine-environment.png) +![spring boot maven tutorial](java-engine-environment-b6db482f.jpg) Then click **Add Project** next to the *Maven* node in the initial environment. -![spring boot maven](https://jelastic.com/blog/wp-content/uploads/2018/08/add-project-to-environment.png) +![spring boot maven](add-project-to-environment-6283c523.png) Specify the name and link to the project, as well as choose the environment where it should be deployed. Additionally, you can activate automatic updates. Then confirm pressing **Add + Deploy**. -![spring boot maven plugin](https://jelastic.com/blog/wp-content/uploads/2018/08/deploy-application.png) +![spring boot maven plugin](deploy-application-66523042.png) More details on how to build and deploy Java applications can be found at the [Maven node documentation](https://docs.jelastic.com/java-vcs-deployment?utm_source=spring-boot-fat). diff --git a/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/java-engine-environment-b6db482f.jpg b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/java-engine-environment-b6db482f.jpg new file mode 100644 index 000000000..d868cf4a2 Binary files /dev/null and b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/java-engine-environment-b6db482f.jpg differ diff --git a/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/maven-microservice-package-1c987e06.png b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/maven-microservice-package-1c987e06.png new file mode 100644 index 000000000..3af9eef52 Binary files /dev/null and b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/maven-microservice-package-1c987e06.png differ diff --git a/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/set-of-microservices-in-maven-node-09cd9bbc.png b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/set-of-microservices-in-maven-node-09cd9bbc.png new file mode 100644 index 000000000..148717a05 Binary files /dev/null and b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/set-of-microservices-in-maven-node-09cd9bbc.png differ diff --git a/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/spring-boot-fat-jar-builder-4d3d1901.png b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/spring-boot-fat-jar-builder-4d3d1901.png new file mode 100644 index 000000000..26abc25c4 Binary files /dev/null and b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/spring-boot-fat-jar-builder-4d3d1901.png differ diff --git a/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/spring-boot-fat-jar-installation-40215c48.png b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/spring-boot-fat-jar-installation-40215c48.png new file mode 100644 index 000000000..bc32b000a Binary files /dev/null and b/content/posts/2021/04/21/building-microservices-spring-boot-fat-uber-jar/spring-boot-fat-jar-installation-40215c48.png differ diff --git a/content/posts/2021/04/22/namespace-shadowing-a-k-a-dependency-confusion-attack/Common-Configuration-Include-and-Exclude-e6bc66c2.webp b/content/posts/2021/04/22/namespace-shadowing-a-k-a-dependency-confusion-attack/Common-Configuration-Include-and-Exclude-e6bc66c2.webp new file mode 100644 index 000000000..792f814a7 Binary files /dev/null and b/content/posts/2021/04/22/namespace-shadowing-a-k-a-dependency-confusion-attack/Common-Configuration-Include-and-Exclude-e6bc66c2.webp differ diff --git a/content/posts/2021/04/22/namespace-shadowing-a-k-a-dependency-confusion-attack/index.md b/content/posts/2021/04/22/namespace-shadowing-a-k-a-dependency-confusion-attack/index.md index a8932d49d..5b20b7ae1 100644 --- a/content/posts/2021/04/22/namespace-shadowing-a-k-a-dependency-confusion-attack/index.md +++ b/content/posts/2021/04/22/namespace-shadowing-a-k-a-dependency-confusion-attack/index.md @@ -5,7 +5,7 @@ lastmod: "2021-04-22T06:31:55+00:00" description: "The npm Registry is vulnerable to supply chain namespace shadowing, also known as “Dependency Confusion” attacks!" authors: - "jbaruch" -image: "https://media.jfrog.com/wp-content/uploads/2021/02/08172937/Common-Configuration-Include-and-Exclude-Patterns.png.webp" +image: "Common-Configuration-Include-and-Exclude-e6bc66c2.webp" categories: - "DevOps" - "Security" @@ -25,7 +25,7 @@ The npm Registry is vulnerable to supply chain namespace shadowing, also known a I remember the first JFrog customer training I delivered in February 2012. This slide was the one where I explained the importance of setting exclude patterns on your repositories (you can see it is 2012 by the slide design, right? Also, Ant was a thing.): -![Old training slide](https://media.jfrog.com/wp-content/uploads/2021/02/08172937/Common-Configuration-Include-and-Exclude-Patterns.png.webp) +![Old training slide](Common-Configuration-Include-and-Exclude-e6bc66c2.webp) The story went like this: Your company, Acme, has JFrog Artifactory installed. It has the usual set of remote repositories (which proxy various central repositories like Maven Central), local repositories (which host your company's internal artifacts), and a virtual repository (which aggregates locals and remotes under a single URL), simplifying the configuration of your build tool (in 2012, that would be Maven, duh). diff --git a/content/posts/2021/04/26/2021-jakarta-ee-developer-survey/JakartaEESurvey2021-1024x574-89696f30.jpg b/content/posts/2021/04/26/2021-jakarta-ee-developer-survey/JakartaEESurvey2021-1024x574-89696f30.jpg new file mode 100644 index 000000000..ac5d81b59 Binary files /dev/null and b/content/posts/2021/04/26/2021-jakarta-ee-developer-survey/JakartaEESurvey2021-1024x574-89696f30.jpg differ diff --git a/content/posts/2021/04/26/2021-jakarta-ee-developer-survey/index.md b/content/posts/2021/04/26/2021-jakarta-ee-developer-survey/index.md index 5c66eaf20..115f7aa92 100644 --- a/content/posts/2021/04/26/2021-jakarta-ee-developer-survey/index.md +++ b/content/posts/2021/04/26/2021-jakarta-ee-developer-survey/index.md @@ -19,7 +19,7 @@ frozen: false --- The annual [2021Jakarta EE Developer Survey](https://www.surveymonkey.com/r/F9SWSDF) is out. Make sure to use this opportunity to make your voice heard! -[![](https://www.agilejava.eu/wp-content/uploads/2021/04/JakartaEESurvey2021-1024x574.png)](https://www.surveymonkey.com/r/F9SWSDF) +[![](JakartaEESurvey2021-1024x574-89696f30.jpg)](https://www.surveymonkey.com/r/F9SWSDF) This is the fourth Jakarta EE Developer Survey, so it is safe to say that it has become an annual tradition and is your chance to influence the direction of the Jakarta EE working group. diff --git a/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/index.md b/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/index.md index b0868da30..07a04a2c5 100644 --- a/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/index.md +++ b/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/index.md @@ -127,7 +127,7 @@ slf4j-api-2.0.0-alpha0.jar slf4j-simple-2.0.0-alpha0.jar ``` -![](maven-build-finished-1024x675.png) +![](maven-build-finished-1024x675.jpg) ## Run Modes @@ -160,7 +160,7 @@ $ sudo bash run.sh As you can see in the video, because we are using an example application from the Pi4J project, we are able to control a LED with the button in the application. -![](running-application-1024x626.png) +![](running-application-1024x626.jpg) ### Kiosk Mode diff --git a/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/maven-build-finished-1024x675.jpg b/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/maven-build-finished-1024x675.jpg new file mode 100644 index 000000000..6af765580 Binary files /dev/null and b/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/maven-build-finished-1024x675.jpg differ diff --git a/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/maven-build-finished-1024x675.png b/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/maven-build-finished-1024x675.png deleted file mode 100644 index 0affc3933..000000000 Binary files a/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/maven-build-finished-1024x675.png and /dev/null differ diff --git a/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/running-application-1024x626.jpg b/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/running-application-1024x626.jpg new file mode 100644 index 000000000..f8dd95e37 Binary files /dev/null and b/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/running-application-1024x626.jpg differ diff --git a/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/running-application-1024x626.png b/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/running-application-1024x626.png deleted file mode 100644 index f9ffe7d7b..000000000 Binary files a/content/posts/2021/04/27/javafx-running-in-kiosk-mode-on-the-raspberry-pi/running-application-1024x626.png and /dev/null differ diff --git a/content/posts/2021/04/27/modern-javafx-game-development-with-fxgl-pong-simple/fxgl_pong-d6286394.png b/content/posts/2021/04/27/modern-javafx-game-development-with-fxgl-pong-simple/fxgl_pong-d6286394.png new file mode 100644 index 000000000..aff96d7c2 Binary files /dev/null and b/content/posts/2021/04/27/modern-javafx-game-development-with-fxgl-pong-simple/fxgl_pong-d6286394.png differ diff --git a/content/posts/2021/04/27/modern-javafx-game-development-with-fxgl-pong-simple/index.md b/content/posts/2021/04/27/modern-javafx-game-development-with-fxgl-pong-simple/index.md index 3230d5be0..baa101569 100644 --- a/content/posts/2021/04/27/modern-javafx-game-development-with-fxgl-pong-simple/index.md +++ b/content/posts/2021/04/27/modern-javafx-game-development-with-fxgl-pong-simple/index.md @@ -5,7 +5,7 @@ lastmod: "2021-04-27T07:48:32+00:00" description: "How to make a simple clone of Pong using the JavaFX FXGL game engine. We will be using the latest (currently 11.15) version of FXGL." authors: - "almasbaimagambetov" -image: "https://raw.githubusercontent.com/AlmasB/git-server/master/storage/images/fxgl_pong.png" +image: "fxgl_pong-d6286394.png" categories: - "Game Development" - "JavaFX" @@ -28,7 +28,7 @@ We will be using the latest (currently 11.15) version of FXGL via Maven (or Grad The full source code is available at the end of this page. The game will look like this: -![](https://raw.githubusercontent.com/AlmasB/git-server/master/storage/images/fxgl_pong.png) +![](fxgl_pong-d6286394.png) Whilst this tutorial is meant to teach basic concepts, building on them will allow us to produce much more [complex examples](https://youtu.be/yhr1b4061os?t=496). diff --git a/content/posts/2021/04/28/beginning-javafx-with-intellij/03-Empty-Project-1024x357.jpg b/content/posts/2021/04/28/beginning-javafx-with-intellij/03-Empty-Project-1024x357.jpg new file mode 100644 index 000000000..d23439a48 Binary files /dev/null and b/content/posts/2021/04/28/beginning-javafx-with-intellij/03-Empty-Project-1024x357.jpg differ diff --git a/content/posts/2021/04/28/beginning-javafx-with-intellij/03-Empty-Project-1024x357.png b/content/posts/2021/04/28/beginning-javafx-with-intellij/03-Empty-Project-1024x357.png deleted file mode 100644 index ea7103806..000000000 Binary files a/content/posts/2021/04/28/beginning-javafx-with-intellij/03-Empty-Project-1024x357.png and /dev/null differ diff --git a/content/posts/2021/04/28/beginning-javafx-with-intellij/Final-project-editor-1024x797.jpg b/content/posts/2021/04/28/beginning-javafx-with-intellij/Final-project-editor-1024x797.jpg new file mode 100644 index 000000000..37177bede Binary files /dev/null and b/content/posts/2021/04/28/beginning-javafx-with-intellij/Final-project-editor-1024x797.jpg differ diff --git a/content/posts/2021/04/28/beginning-javafx-with-intellij/Final-project-editor-1024x797.png b/content/posts/2021/04/28/beginning-javafx-with-intellij/Final-project-editor-1024x797.png deleted file mode 100644 index 3f9f62d1e..000000000 Binary files a/content/posts/2021/04/28/beginning-javafx-with-intellij/Final-project-editor-1024x797.png and /dev/null differ diff --git a/content/posts/2021/04/28/beginning-javafx-with-intellij/index.md b/content/posts/2021/04/28/beginning-javafx-with-intellij/index.md index 7cfe472fd..45495daee 100644 --- a/content/posts/2021/04/28/beginning-javafx-with-intellij/index.md +++ b/content/posts/2021/04/28/beginning-javafx-with-intellij/index.md @@ -141,7 +141,7 @@ Here you'll notice two things, a generated JavaFX class and no errors from missi The final project in IntelliJ should look like the following: -{{< img src="Final-project-editor-1024x797.png" class="size-large is-resized" width="1024" height="797" style="width:775px;height:603px" caption="Figure 18. The completed HelloWorldFX project in the IntelliJ IDE." >}} +{{< img src="Final-project-editor-1024x797.jpg" class="size-large is-resized" width="1024" height="797" style="width:775px;height:603px" caption="Figure 18. The completed HelloWorldFX project in the IntelliJ IDE." >}} **Step 15:** Executing the HelloWorldFX application project. @@ -181,7 +181,7 @@ Next, you'll be specifying Maven coordinates GroupId, ArtifactId and Version as Click on **Finish**. The project will output as shown below in Figure 24. -![](03-Empty-Project-1024x357.png) Figure 24. An empty Maven Java project. +![](03-Empty-Project-1024x357.jpg) Figure 24. An empty Maven Java project. Step 4: Add Plugins and dependencies into **pom.xml**file diff --git a/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/index.md b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/index.md index 8507619cd..10ec2e38b 100644 --- a/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/index.md +++ b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/index.md @@ -5,7 +5,7 @@ lastmod: "2021-09-16T14:49:21+00:00" description: "What types of garbage collection is available at the market, what GC does for Java applications and how it works within Jelastic PaaS." authors: - "tetiana-fydorenchyk" -image: "java-garbage-collection-choice.png" +image: "java-garbage-collection-choice.jpg" categories: - "Jakarta EE" - "Jelastic" @@ -14,7 +14,7 @@ related_posts: frozen: false --- -{{< img src="https://jelastic.com/blog/wp-content/uploads/2019/08/java-gc.png" class="alignleft is-resized" alt="java gc" width="250" >}} +{{< img src="java-gc-bcf84d7a.png" class="alignleft is-resized" alt="java gc" width="250" >}} Performance and price are two big considerations in application hosting that always matter. And, often, we question ourselves on how to decrease the spends, without affecting the performance of your apps at the same time. In this article, we'd like to address automatic memory management for Java applications hosted with Jelastic using garbage collection. @@ -28,7 +28,7 @@ The created object uses some memory that remains allocated until there are refer We've [tested different kinds of Garbage Collectors (GC)](https://jelastic.com/blog/tuning-garbage-collector-java-memory-usage-optimization/) and defined the most appropriate ones for the Java applications hosted in our cloud, taking into consideration the automatic vertical scaling that Jelastic provides. As a result of our investigations, we adjusted the default settings of Garbage Collectors in Jelastic in order to increase the benefits for our users. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2019/08/java-garbage-collector-types.png" class="aligncenter is-resized" alt="java-garbage-collector-types" width="600" >}} +{{< img src="java-garbage-collector-types-199385f3.png" class="aligncenter is-resized" alt="java-garbage-collector-types" width="600" >}} Jelastic supports the following GCs: @@ -62,7 +62,7 @@ For JVM 12+ versions, the platform provides [integrated vertical scaling](https: Custom multiplier to flexibly adjust the G1PeriodicGCSystemLoadThreshold value * **G1PERIODIC_GC_SYS_LOAD_THRESHOLD={CPU_cores_number}\*GC_SYS_LOAD_THRESHOLD_RATE** Activates garbage collection, if the average one-minute system load is below the set value. This condition is ignored if set as zero. -![java garbage collection variables for scaling](https://jelastic.com/blog/wp-content/uploads/2019/08/java-garbage-collection-variables-for-scaling.png) +![java garbage collection variables for scaling](java-garbage-collection-variables-for-sc-944bc9c7.png) You can always check current settings of your Java process by executing ***ps -ax \| grep java*** *.*You will see something like this: @@ -89,7 +89,7 @@ For more details, you can review the following script that manages [automatic co If you believe that customization of default settings can improve performance or memory consumption, you can tune them according to the requirements of your application. We recommend customizing these configurations only if you fully understand the impact of such changes on your application behaviour. You can set a custom GC parameter based on your application requirements via [Environment Variables](https://docs.jelastic.com/environment-variables) (please do not mix them with Java options). -![java garbage collection variables](https://jelastic.com/blog/wp-content/uploads/2019/08/java-garbage-collection-variables.png) +![java garbage collection variables](java-garbage-collection-variables-51dd69bb.png) * **_JAVA_OPTIONS and JAVA_TOOL_OPTIONS** - please [read more about these options](https://stackoverflow.com/questions/28327620/difference-between-java-options-java-tool-options-and-java-opts). Java options can be used for changing default GC type, for example: @@ -124,22 +124,22 @@ All of the paths to config, executable or log files can differ based on the Java | Jetty | /opt/jetty/etc/variables.confor/opt/shared/conf/etc/variables.conf | 1. Open **Conf** files to configure your Java server. -![java garbage collection configurations](https://jelastic.com/blog/wp-content/uploads/2019/08/java-garbage-collection-configurations.png) +![java garbage collection configurations](java-garbage-collection-configurations-95e85e3c.png) 2. For Tomcat, navigate to the **opt** \>**tomcat** \>**conf** \>**variables.conf**file. -![java garbage collection configurations](https://jelastic.com/blog/wp-content/uploads/2019/08/java-garbage-collection-configurations2.png) +![java garbage collection configurations](java-garbage-collection-configurations2-15b1f15e.png) 3. In the opened **variables.conf** file you can override garbage collector default settings or even add another GC to replace the default one *(G1)* ***.*** So if you want to use *ShenandoahGC* instead, simply add it to the *variables.conf* as stated in the example below: ***-XX:+UseShenandoahGC*** -![java garbage collection change GC](https://jelastic.com/blog/wp-content/uploads/2019/08/java-garbage-collection-change-gc-1.png) +![java garbage collection change GC](java-garbage-collection-change-gc-1-bba675c1.png) 4. After this, only the specified garbage collector will be used while starting your Java server without taking into consideration the amount of allocated resources. 5. Also, you can control how JVM handles its heap memory with other JAVA options stated in this file. -![java garbage collection heap memory](https://jelastic.com/blog/wp-content/uploads/2019/08/java-garbage-collection-heap-memory-1.png) +![java garbage collection heap memory](java-garbage-collection-heap-memory-1-51628e82.png) As a result of properly configured options, the GC can be observed in action via the [Statistics](https://docs.jelastic.com/view-app-statistics) tab. -![java garbage collection statistics](https://jelastic.com/blog/wp-content/uploads/2019/08/java-garbage-collection-statistics.png) +![java garbage collection statistics](java-garbage-collection-statistics-017bdfbb.png) That's it! Enjoy resource efficiency while running your Java applications in the cloud. Try it yourself with [Jelastic Multi-Cloud PaaS](https://jelastic.cloud/). diff --git a/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-change-gc-1-bba675c1.png b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-change-gc-1-bba675c1.png new file mode 100644 index 000000000..60e214b1a Binary files /dev/null and b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-change-gc-1-bba675c1.png differ diff --git a/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-choice.jpg b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-choice.jpg new file mode 100644 index 000000000..fed2e8c7d Binary files /dev/null and b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-choice.jpg differ diff --git a/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-choice.png b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-choice.png deleted file mode 100644 index 8b5459d74..000000000 Binary files a/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-choice.png and /dev/null differ diff --git a/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-configurations-95e85e3c.png b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-configurations-95e85e3c.png new file mode 100644 index 000000000..c92d10ec3 Binary files /dev/null and b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-configurations-95e85e3c.png differ diff --git a/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-configurations2-15b1f15e.png b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-configurations2-15b1f15e.png new file mode 100644 index 000000000..76b5896a6 Binary files /dev/null and b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-configurations2-15b1f15e.png differ diff --git a/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-heap-memory-1-51628e82.png b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-heap-memory-1-51628e82.png new file mode 100644 index 000000000..20b794202 Binary files /dev/null and b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-heap-memory-1-51628e82.png differ diff --git a/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-statistics-017bdfbb.png b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-statistics-017bdfbb.png new file mode 100644 index 000000000..3c91f4dc9 Binary files /dev/null and b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-statistics-017bdfbb.png differ diff --git a/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-variables-51dd69bb.png b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-variables-51dd69bb.png new file mode 100644 index 000000000..fb8f87ef1 Binary files /dev/null and b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-variables-51dd69bb.png differ diff --git a/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-variables-for-sc-944bc9c7.png b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-variables-for-sc-944bc9c7.png new file mode 100644 index 000000000..2f35d4087 Binary files /dev/null and b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collection-variables-for-sc-944bc9c7.png differ diff --git a/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collector-types-199385f3.png b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collector-types-199385f3.png new file mode 100644 index 000000000..3962839f6 Binary files /dev/null and b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-garbage-collector-types-199385f3.png differ diff --git a/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-gc-bcf84d7a.png b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-gc-bcf84d7a.png new file mode 100644 index 000000000..5725adbe0 Binary files /dev/null and b/content/posts/2021/04/29/java-garbage-collection-types-and-settings-customization-via-jelastic-paas/java-gc-bcf84d7a.png differ diff --git a/content/posts/2021/05/05/elastic-jvm-configuring-g1-for-automatic-vertical-memory-scaling/elastic-jvm-e1545213859238-2b2c265b.png b/content/posts/2021/05/05/elastic-jvm-configuring-g1-for-automatic-vertical-memory-scaling/elastic-jvm-e1545213859238-2b2c265b.png new file mode 100644 index 000000000..bfca9baa8 Binary files /dev/null and b/content/posts/2021/05/05/elastic-jvm-configuring-g1-for-automatic-vertical-memory-scaling/elastic-jvm-e1545213859238-2b2c265b.png differ diff --git a/content/posts/2021/05/05/elastic-jvm-configuring-g1-for-automatic-vertical-memory-scaling/index.md b/content/posts/2021/05/05/elastic-jvm-configuring-g1-for-automatic-vertical-memory-scaling/index.md index f3d8f5335..38a75b320 100644 --- a/content/posts/2021/05/05/elastic-jvm-configuring-g1-for-automatic-vertical-memory-scaling/index.md +++ b/content/posts/2021/05/05/elastic-jvm-configuring-g1-for-automatic-vertical-memory-scaling/index.md @@ -13,7 +13,7 @@ related_posts: frozen: false --- -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/12/elastic-jvm-e1545213859238.png" class="alignleft" alt="Automatic Vertical Memory Scaling" >}} +{{< img src="elastic-jvm-e1545213859238-2b2c265b.png" class="alignleft" alt="Automatic Vertical Memory Scaling" >}} Nowadays, JVM-based applications can benefit from elasticity and density of container technology. However, there are still some issues that may prevent from unleashing the full potential of Java and containers "marriage." @@ -29,7 +29,7 @@ There is a necessity to rethink the Garbage Collection (GC) policies that contro As a result, in most cases, the Java heap will not be released unless forced externally. Such behavior is particularly disadvantageous in scalable container environments when the JVM uses a fraction of assigned memory resources due to inactivity or a small load. This results in customers overpaying for unused resources, and cloud providers not being able to fully utilize their hardware. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/12/jdk-9-e1545213845349.png" class="alignright" alt="Automatic Vertical Memory Scaling of Java" >}} +{{< img src="jdk-9-e1545213845349-bdd1e188.png" class="alignright" alt="Automatic Vertical Memory Scaling of Java" >}} In order to overcome this issue, we have introduced additional logic into the JVM to trigger a heap reduction whenever the amount of unused memory is significant. It can be performed at any time by configurable options, not only during regular GC cycles. diff --git a/content/posts/2021/05/05/elastic-jvm-configuring-g1-for-automatic-vertical-memory-scaling/jdk-9-e1545213845349-bdd1e188.png b/content/posts/2021/05/05/elastic-jvm-configuring-g1-for-automatic-vertical-memory-scaling/jdk-9-e1545213845349-bdd1e188.png new file mode 100644 index 000000000..caacb2ceb Binary files /dev/null and b/content/posts/2021/05/05/elastic-jvm-configuring-g1-for-automatic-vertical-memory-scaling/jdk-9-e1545213845349-bdd1e188.png differ diff --git a/content/posts/2021/05/05/why-java-developers-continue-to-rely-on-jakarta-ee/JakartaEEWhitepaper-09e55960.jpg b/content/posts/2021/05/05/why-java-developers-continue-to-rely-on-jakarta-ee/JakartaEEWhitepaper-09e55960.jpg new file mode 100644 index 000000000..ff71a3325 Binary files /dev/null and b/content/posts/2021/05/05/why-java-developers-continue-to-rely-on-jakarta-ee/JakartaEEWhitepaper-09e55960.jpg differ diff --git a/content/posts/2021/05/05/why-java-developers-continue-to-rely-on-jakarta-ee/index.md b/content/posts/2021/05/05/why-java-developers-continue-to-rely-on-jakarta-ee/index.md index 53b1e82a2..1d833897f 100644 --- a/content/posts/2021/05/05/why-java-developers-continue-to-rely-on-jakarta-ee/index.md +++ b/content/posts/2021/05/05/why-java-developers-continue-to-rely-on-jakarta-ee/index.md @@ -5,7 +5,7 @@ lastmod: "2021-08-23T15:33:08+00:00" description: "Eclipse Foundation spoke to Java developers to discuss why they rely on Jakarta EE and the unique benefits of using Jakarta EE technologies." authors: - "ivar-grimstad" -image: "https://www.agilejava.eu/wp-content/uploads/2021/03/JakartaEEWhitepaper.png" +image: "JakartaEEWhitepaper-09e55960.jpg" categories: - "Jakarta EE" - "Kubernetes" @@ -20,7 +20,7 @@ frozen: false Over the past year, the Eclipse Foundation spoke to leading Java developers around the world to discuss why they rely on[Jakarta EE](https://jakarta.ee/) and the unique benefits of using Jakarta EE technologies. Their input is captured in our white paper, which describes the important advantages Jakarta EE offers today and for the future. -{{< img src="https://www.agilejava.eu/wp-content/uploads/2021/03/JakartaEEWhitepaper.png" class="aligncenter size-large is-resized" width="222" height="288" >}} +{{< img src="JakartaEEWhitepaper-09e55960.jpg" class="aligncenter size-large is-resized" width="222" height="288" >}} [Download the Jakarta EE white paper!](https://outreach.jakartaee.org/white-paper-java-applications) diff --git a/content/posts/2021/05/11/7-functional-programming-techniques-in-java-a-primer/index.md b/content/posts/2021/05/11/7-functional-programming-techniques-in-java-a-primer/index.md index 1886d5af9..557e659b1 100644 --- a/content/posts/2021/05/11/7-functional-programming-techniques-in-java-a-primer/index.md +++ b/content/posts/2021/05/11/7-functional-programming-techniques-in-java-a-primer/index.md @@ -6,7 +6,7 @@ description: "In this article I'm going to focus on things that you can do in Ja canonical: "https://deepu.tech/functional-programming-in-java-for-beginners/" authors: - "deepu-sasidharan" -image: "https://thepracticaldev.s3.amazonaws.com/i/zf8mvgix8icaz64mgj89.png" +image: "zf8mvgix8icaz64mgj89-61fb2317.jpg" categories: - "Tutorials" related_posts: @@ -17,7 +17,7 @@ related_posts: frozen: false --- -![header image](https://thepracticaldev.s3.amazonaws.com/i/zf8mvgix8icaz64mgj89.png) +![header image](zf8mvgix8icaz64mgj89-61fb2317.jpg) There is a lot of hype around functional programming (FP) and a lot of cool kids are doing it but it is not a silver bullet. Like other programming paradigms/styles, functional programming also has its pros and cons and one may prefer one paradigm over the other. If you are a Java developer and wants to venture into functional programming, do not worry, you don't have to learn functional programming oriented languages like Haskell or Clojure(or even Scala or JavaScript though they are not pure functional programming languages) since Java has you covered and this post is for you. diff --git a/content/posts/2021/05/11/7-functional-programming-techniques-in-java-a-primer/zf8mvgix8icaz64mgj89-61fb2317.jpg b/content/posts/2021/05/11/7-functional-programming-techniques-in-java-a-primer/zf8mvgix8icaz64mgj89-61fb2317.jpg new file mode 100644 index 000000000..49c14bc14 Binary files /dev/null and b/content/posts/2021/05/11/7-functional-programming-techniques-in-java-a-primer/zf8mvgix8icaz64mgj89-61fb2317.jpg differ diff --git a/content/posts/2021/05/17/map-equals-hashcode-java-challenge/index.md b/content/posts/2021/05/17/map-equals-hashcode-java-challenge/index.md index dd3467781..966703134 100644 --- a/content/posts/2021/05/17/map-equals-hashcode-java-challenge/index.md +++ b/content/posts/2021/05/17/map-equals-hashcode-java-challenge/index.md @@ -5,7 +5,7 @@ lastmod: "2021-08-23T12:22:47+00:00" description: "Understanding deeply how to use a Map, equals, and hashcode in Java will be a massive help for you to create high-quality code!" authors: - "rafael-del-nero" -image: "map_equals.png" +image: "map_equals.jpg" categories: - "Tutorials" related_posts: diff --git a/content/posts/2021/05/17/map-equals-hashcode-java-challenge/map_equals.jpg b/content/posts/2021/05/17/map-equals-hashcode-java-challenge/map_equals.jpg new file mode 100644 index 000000000..1d25d3b7d Binary files /dev/null and b/content/posts/2021/05/17/map-equals-hashcode-java-challenge/map_equals.jpg differ diff --git a/content/posts/2021/05/17/map-equals-hashcode-java-challenge/map_equals.png b/content/posts/2021/05/17/map-equals-hashcode-java-challenge/map_equals.png deleted file mode 100644 index 44480933e..000000000 Binary files a/content/posts/2021/05/17/map-equals-hashcode-java-challenge/map_equals.png and /dev/null differ diff --git a/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/index.md b/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/index.md index 97b556e97..41570f87b 100644 --- a/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/index.md +++ b/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/index.md @@ -57,7 +57,7 @@ This feature is released as part of [Java Extension Pack](https://marketplace.vi [Debugger for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-debug "Debugger for Java") extension is now able to show variable values inline in editor when stepping through source code: -![](inlineValues.png) +![](inlineValues.jpg) You can enable this feature by selecting **Files** -\>**Preferences** -\>**Settings** menu, searching for "**debug.inlineValues**" on settings view, and selecting the option. @@ -67,7 +67,7 @@ You can enable this feature by selecting **Files** -\>**Preferences** -\>**Setti You can right-clicking the view to bring up customization menu. -![](variablesViewCustomization.png) +![](variablesViewCustomization.jpg) Debugging enhancements were demonstrated at [VS Code 1.56 Release Party](https://channel9.msdn.com/Shows/VS-Code-Livestreams/1-56-Release-Party#time=20m55s "VS Code 1.56 Release Party"). diff --git a/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/inlineValues.jpg b/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/inlineValues.jpg new file mode 100644 index 000000000..77890ecc2 Binary files /dev/null and b/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/inlineValues.jpg differ diff --git a/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/inlineValues.png b/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/inlineValues.png deleted file mode 100644 index dcfac339a..000000000 Binary files a/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/inlineValues.png and /dev/null differ diff --git a/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/moveRefactoring.webp b/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/moveRefactoring.webp index 844e4c2c2..4b84395fc 100644 Binary files a/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/moveRefactoring.webp and b/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/moveRefactoring.webp differ diff --git a/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/variablesViewCustomization.jpg b/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/variablesViewCustomization.jpg new file mode 100644 index 000000000..5ff6ecfcf Binary files /dev/null and b/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/variablesViewCustomization.jpg differ diff --git a/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/variablesViewCustomization.png b/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/variablesViewCustomization.png deleted file mode 100644 index 25e31ff42..000000000 Binary files a/content/posts/2021/05/18/vs-code-getting-better-and-better-for-java/variablesViewCustomization.png and /dev/null differ diff --git a/content/posts/2021/05/20/demystifying-jvm-memory-management/8uh8SPy-d33a37bf.png b/content/posts/2021/05/20/demystifying-jvm-memory-management/8uh8SPy-d33a37bf.png new file mode 100644 index 000000000..30b7a9d21 Binary files /dev/null and b/content/posts/2021/05/20/demystifying-jvm-memory-management/8uh8SPy-d33a37bf.png differ diff --git a/content/posts/2021/05/20/demystifying-jvm-memory-management/AZaR0LP-abaf216a.gif b/content/posts/2021/05/20/demystifying-jvm-memory-management/AZaR0LP-abaf216a.gif new file mode 100644 index 000000000..76d7c222a Binary files /dev/null and b/content/posts/2021/05/20/demystifying-jvm-memory-management/AZaR0LP-abaf216a.gif differ diff --git a/content/posts/2021/05/20/demystifying-jvm-memory-management/Kv9ichJ-5fd29799-poster.png b/content/posts/2021/05/20/demystifying-jvm-memory-management/Kv9ichJ-5fd29799-poster.png new file mode 100644 index 000000000..be38476a1 Binary files /dev/null and b/content/posts/2021/05/20/demystifying-jvm-memory-management/Kv9ichJ-5fd29799-poster.png differ diff --git a/content/posts/2021/05/20/demystifying-jvm-memory-management/Kv9ichJ-5fd29799.gif b/content/posts/2021/05/20/demystifying-jvm-memory-management/Kv9ichJ-5fd29799.gif new file mode 100644 index 000000000..eb7a9fa01 Binary files /dev/null and b/content/posts/2021/05/20/demystifying-jvm-memory-management/Kv9ichJ-5fd29799.gif differ diff --git a/content/posts/2021/05/20/demystifying-jvm-memory-management/RbnjDWX-af34cff6.png b/content/posts/2021/05/20/demystifying-jvm-memory-management/RbnjDWX-af34cff6.png new file mode 100644 index 000000000..fd2afb849 Binary files /dev/null and b/content/posts/2021/05/20/demystifying-jvm-memory-management/RbnjDWX-af34cff6.png differ diff --git a/content/posts/2021/05/20/demystifying-jvm-memory-management/index.md b/content/posts/2021/05/20/demystifying-jvm-memory-management/index.md index a877dbd50..8748d5dba 100644 --- a/content/posts/2021/05/20/demystifying-jvm-memory-management/index.md +++ b/content/posts/2021/05/20/demystifying-jvm-memory-management/index.md @@ -6,7 +6,7 @@ description: "I aim to demystify the concepts behind memory management and take canonical: "https://deepu.tech/memory-management-in-jvm/" authors: - "deepu-sasidharan" -image: "https://i.imgur.com/Kv9ichJ.gif" +image: "Kv9ichJ-5fd29799-poster.png" categories: - "Java Core" - "Performance" @@ -20,7 +20,7 @@ aliases: - "/today/🚀-demystifying-jvm-memory-management/" --- -![cover-image](https://i.imgur.com/Kv9ichJ.gif) +![cover-image](Kv9ichJ-5fd29799.gif) In [this multi-part series](https://deepu.tech/memory-management-in-programming/), I aim to demystify the concepts behind memory management and take a deeper look at memory management in some of the modern programming languages, in particular Java, Kotlin, Scala, Groovy, and Clojure. @@ -30,7 +30,7 @@ If you haven't read the [first part](https://foojay.io/today/demystifying-memory First, let us see what the memory structure of JVM is. This is based on **JDK 11** onwards. Below is the memory available to a JVM process and is allocated by the Operating System (OS). -![JVM Memory structure](https://i.imgur.com/8uh8SPy.png) +![JVM Memory structure](8uh8SPy-d33a37bf.png) This is the native memory allocated by the OS and the amount depends on OS, processor, and JRE. @@ -126,7 +126,7 @@ Now that we know how JVM allocates memory, let us see how it automatically manag JVM manages the heap memory by garbage collection. In simple terms, it frees the memory used by orphan objects, i.e, objects that are no longer referenced from the Stack directly or indirectly(via a reference in another object) to make space for new object creation. -![GC Roots](https://i.imgur.com/RbnjDWX.png) +![GC Roots](RbnjDWX-af34cff6.png) The garbage collector in JVM is responsible for: @@ -141,7 +141,7 @@ JVM garbage collectors are generational(Objects in Heap are grouped by their age JVM uses a separate daemon thread that runs in the background for garbage collection and the process runs when certain conditions are met. Mark \& Sweep GC generally involves two phases and sometimes there is an optional third phase depending on the algorithm used. -![Mark & sweep GC](http://i.imgur.com/AZaR0LP.gif) +![Mark & sweep GC](AZaR0LP-abaf216a.gif) * **Marking**: First step where garbage collector identifies which objects are in use and which ones are not in use. The objects in use or reachable from GC roots(Stack pointers) recursively are marked as alive. * **Sweeping**: The garbage collector traverses the heap and removes any object that is not marked alive. This space is now marked as free. diff --git a/content/posts/2021/05/25/jakarta-ee-91-released/JakartaEE91_release-9035fc60.jpg b/content/posts/2021/05/25/jakarta-ee-91-released/JakartaEE91_release-9035fc60.jpg new file mode 100644 index 000000000..a92f7a4c5 Binary files /dev/null and b/content/posts/2021/05/25/jakarta-ee-91-released/JakartaEE91_release-9035fc60.jpg differ diff --git a/content/posts/2021/05/25/jakarta-ee-91-released/index.md b/content/posts/2021/05/25/jakarta-ee-91-released/index.md index e1a74d1ea..b782528e4 100644 --- a/content/posts/2021/05/25/jakarta-ee-91-released/index.md +++ b/content/posts/2021/05/25/jakarta-ee-91-released/index.md @@ -5,7 +5,7 @@ lastmod: "2021-08-23T15:32:31+00:00" description: "The Jakarta EE Working Group Releases Jakarta EE 9.1 as Industry Continues to Embrace Open Source Enterprise Java." authors: - "ivar-grimstad" -image: "https://www.agilejava.eu/wp-content/uploads/2021/05/JakartaEE91_release.png" +image: "JakartaEE91_release-9035fc60.jpg" categories: - "Jakarta EE" - "Microservices" @@ -21,7 +21,7 @@ aliases: [The Jakarta EE Working Group Releases Jakarta EE 9.1 as Industry Continues to Embrace Open Source Enterprise Java](https://jakarta.ee/news/jakarta-ee-9-1-released/)! Jakarta EE 9.1 adds support for Java SE 11 runtimes to the foundational Jakarta EE 9 release. This gives developers more flexibility when migrating from previous Jakarta EE releases. -[![](https://www.agilejava.eu/wp-content/uploads/2021/05/JakartaEE91_release.png)](https://www.agilejava.eu/wp-content/uploads/2021/05/JakartaEE91_release.png) +[![](JakartaEE91_release-9035fc60.jpg)](JakartaEE91_release-9035fc60.jpg) In order to upgrade to the new version, simply change the dependency version in your *pom.xml* to `9.1.0`. If you are upgrading from a version prior to Jakarta EE 9, follow the [migration steps](https://www.agilejava.eu/2021/01/22/migration-guide/) for the namespace change from `javax.*` to `jakarta.*`. diff --git a/content/posts/2021/05/25/type-erasure-generics-java-challenge/generics.jpg b/content/posts/2021/05/25/type-erasure-generics-java-challenge/generics.jpg new file mode 100644 index 000000000..a07d21ab1 Binary files /dev/null and b/content/posts/2021/05/25/type-erasure-generics-java-challenge/generics.jpg differ diff --git a/content/posts/2021/05/25/type-erasure-generics-java-challenge/generics.png b/content/posts/2021/05/25/type-erasure-generics-java-challenge/generics.png deleted file mode 100644 index d7eb7ad4c..000000000 Binary files a/content/posts/2021/05/25/type-erasure-generics-java-challenge/generics.png and /dev/null differ diff --git a/content/posts/2021/05/25/type-erasure-generics-java-challenge/index.md b/content/posts/2021/05/25/type-erasure-generics-java-challenge/index.md index c1e39f0a8..6c42e72bd 100644 --- a/content/posts/2021/05/25/type-erasure-generics-java-challenge/index.md +++ b/content/posts/2021/05/25/type-erasure-generics-java-challenge/index.md @@ -5,7 +5,7 @@ lastmod: "2021-08-23T12:35:40+00:00" description: "In this challenge, you will see the generic type that will be erased by the compiler and will be replaced by the type we defined at runtime." authors: - "rafael-del-nero" -image: "generics.png" +image: "generics.jpg" categories: - "Tutorials" related_posts: diff --git a/content/posts/2021/05/28/interviews-with-robert-savage-and-johan-vos-on-the-state-of-java-on-raspberry-pi/github-pi4j-search-1024x901.jpg b/content/posts/2021/05/28/interviews-with-robert-savage-and-johan-vos-on-the-state-of-java-on-raspberry-pi/github-pi4j-search-1024x901.jpg new file mode 100644 index 000000000..249ee2ee1 Binary files /dev/null and b/content/posts/2021/05/28/interviews-with-robert-savage-and-johan-vos-on-the-state-of-java-on-raspberry-pi/github-pi4j-search-1024x901.jpg differ diff --git a/content/posts/2021/05/28/interviews-with-robert-savage-and-johan-vos-on-the-state-of-java-on-raspberry-pi/github-pi4j-search-1024x901.png b/content/posts/2021/05/28/interviews-with-robert-savage-and-johan-vos-on-the-state-of-java-on-raspberry-pi/github-pi4j-search-1024x901.png deleted file mode 100644 index a4b1a63a1..000000000 Binary files a/content/posts/2021/05/28/interviews-with-robert-savage-and-johan-vos-on-the-state-of-java-on-raspberry-pi/github-pi4j-search-1024x901.png and /dev/null differ diff --git a/content/posts/2021/05/28/interviews-with-robert-savage-and-johan-vos-on-the-state-of-java-on-raspberry-pi/index.md b/content/posts/2021/05/28/interviews-with-robert-savage-and-johan-vos-on-the-state-of-java-on-raspberry-pi/index.md index 33833b859..a216cf6fd 100644 --- a/content/posts/2021/05/28/interviews-with-robert-savage-and-johan-vos-on-the-state-of-java-on-raspberry-pi/index.md +++ b/content/posts/2021/05/28/interviews-with-robert-savage-and-johan-vos-on-the-state-of-java-on-raspberry-pi/index.md @@ -41,7 +41,7 @@ Work is ongoing for a totally refactored V2 which will bring modules and improve Robert is the founding father of the Pi4J project. He started in 2012 and quickly got a lot of attention from the Java community. Pi4J is now actively in use in a lot of projects. He also presented his work in the Devoxx 2014 and Oracle Code One 2019 conferences. {{< gallery cols="3" >}} -github-pi4j-search-1024x901.png +github-pi4j-search-1024x901.jpg robert-savage-devoxx-2014-1024x768.jpg robert-savage.jpg {{< /gallery >}} diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/2-env-0af64a68.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/2-env-0af64a68.png new file mode 100644 index 000000000..0df1e851d Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/2-env-0af64a68.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/admin-console-hal-3e122f19.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/admin-console-hal-3e122f19.png new file mode 100644 index 000000000..a36744235 Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/admin-console-hal-3e122f19.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/autocluster11-4f2b39b8.jpg b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/autocluster11-4f2b39b8.jpg new file mode 100644 index 000000000..743e0ff31 Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/autocluster11-4f2b39b8.jpg differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/change-topology-1213806e.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/change-topology-1213806e.png new file mode 100644 index 000000000..9216284ce Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/change-topology-1213806e.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/cloning-f6681875.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/cloning-f6681875.png new file mode 100644 index 000000000..7352b0321 Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/cloning-f6681875.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/clsuter-topology-78f51b4a.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/clsuter-topology-78f51b4a.png new file mode 100644 index 000000000..c3b6bc95a Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/clsuter-topology-78f51b4a.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/clsuter-topology-adminka-3d002ebc.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/clsuter-topology-adminka-3d002ebc.png new file mode 100644 index 000000000..119ca405e Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/clsuter-topology-adminka-3d002ebc.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/clsuter-topology-deployment-app-bf6348a0.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/clsuter-topology-deployment-app-bf6348a0.png new file mode 100644 index 000000000..ae28064b3 Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/clsuter-topology-deployment-app-bf6348a0.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/clsuter-topology-restart-b7cb812b.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/clsuter-topology-restart-b7cb812b.png new file mode 100644 index 000000000..97fc91e5b Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/clsuter-topology-restart-b7cb812b.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/complexity-of-managed-domain-topology-dd95a099.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/complexity-of-managed-domain-topology-dd95a099.png new file mode 100644 index 000000000..ba09ab49d Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/complexity-of-managed-domain-topology-dd95a099.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/create-new-wildfly-environment-89528537.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/create-new-wildfly-environment-89528537.png new file mode 100644 index 000000000..2c3d9de2d Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/create-new-wildfly-environment-89528537.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/decomposition-and-building-modified-topo-9ca32dd5.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/decomposition-and-building-modified-topo-9ca32dd5.png new file mode 100644 index 000000000..99106100e Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/decomposition-and-building-modified-topo-9ca32dd5.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/deploy-64f84b1e.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/deploy-64f84b1e.png new file mode 100644 index 000000000..f13c679d2 Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/deploy-64f84b1e.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/deployment-manager-1-6e0360c6.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/deployment-manager-1-6e0360c6.png new file mode 100644 index 000000000..2d75cc6d0 Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/deployment-manager-1-6e0360c6.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/domain-processes-0b91bd4c.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/domain-processes-0b91bd4c.png new file mode 100644 index 000000000..ffda1c405 Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/domain-processes-0b91bd4c.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/index.md b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/index.md index 4b67075b9..db7b2185e 100644 --- a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/index.md +++ b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/index.md @@ -21,7 +21,7 @@ As a result, developers go with standalone nodes as the only available productio But what developers should do if they are looking for a solution to migrate from VMs to containers already existing and nicely working Jakarta EE clusters in managed domain mode? Until now, there have been very few examples (e.g., for [GlassFish](https://jelastic.com/blog/glassfish-payara-auto-clustering-cloud-hosting/?utm_source=blog-wildfly-managed-domain) and [WebLogic](https://jelastic.com/blog/migration-from-vms-to-containers/?utm_source=blog-wildfly-managed-domain)) how to run and scale Java application servers in managed domain mode within containers correctly. In most cases, lack of knowledge or even the absence of a working solution for the domain mode in containers leads to the loss of integrated Jakarta EE clustering features that just become obsolete. -![wildfly admin panel ui](https://jelastic.com/blog/wp-content/uploads/2018/05/admin-console-hal.png) +![wildfly admin panel ui](admin-console-hal-3e122f19.png) But managed domain mode is still awesome! A vast portion of mission-critical and large-scale applications such as banking and billing are still running on Jakarta EE in VMs. Integrated [Jakarta EE](https://jakartablogs.ee/) clustering provides functionality that people are interested in, including high-availability and automated deployment among distributed Java application servers regardless of underlying infrastructure, and, of course, Admin Panel to manage your cluster using a nice UI. To get familiar with benefits of natively integrated clustering technology please refer to a good article "[Under the Hood of J2EE Clustering](https://www.theserverside.com/news/1364410/Under-the-Hood-of-J2EE-Clustering)". Merging this rich functionality with ready-to-go containers provides a huge benefit by saving time and efforts of the team, and enables fast iterations as the majority of developers do not deal with containers or VMs if environment setup is fully automated. @@ -36,8 +36,8 @@ We can easily run one big service or several small interrelated services per clu ## Complexity of Managed Domain Topology -![complex managed domain topology](https://jelastic.com/blog/wp-content/uploads/2018/05/complexity-of-managed-domain-topology.png) -![java processes inside VM](https://jelastic.com/blog/wp-content/uploads/2018/05/java-processes-inside-each-VM-or-bare-metal-host.png) +![complex managed domain topology](complexity-of-managed-domain-topology-dd95a099.png) +![java processes inside VM](java-processes-inside-each-VM-or-bare-me-4576a679.png) Let's have a look at the topology of WildFly cluster in managed domain mode, which is illustrated in the [official documentation](https://docs.jboss.org/author/display/WFLY/Operating+modes). The illustration below provides a sense of the complexity of managed domain architecture. This scheme is considered as a classical Jakarta EE topology in VMs, or so-called "legacy dragon" which should be tamed and decomposed properly into containers. We adjusted this illustration for a little bit better view of the topology, as well as to show additional "hidden" Java processes inside each VM or bare metal host. This will help us during the further decomposition. @@ -66,7 +66,7 @@ Moreover, system containers provide a better resource and security isolation com ## Decomposition and Building Modified Topology -![resource usage efficiency](https://jelastic.com/blog/wp-content/uploads/2018/05/decomposition-and-building-modified-topology.png) +![resource usage efficiency](decomposition-and-building-modified-topo-9ca32dd5.png) We are ready to start our decomposition journey. The first rule is in the spirit of microservices - it is always better to put only one Worker Server per one container. Also, we create only one server group per domain for all containers inside the cluster. Such simple adjustments will give tremendous and desired flexibility for scaling each Worker Server vertically, gaining [resource usage efficiency](https://jelastic.com/blog/stop-overpaying-for-java-cloud-hosting-resources/?utm_source=blog-wildfly-managed-domain), and scaling the group of containers horizontally by adding new instances on demand. Please note that each container for handling incoming requests runs 3 Java processes: Worker Server (WS), Host Controller (HC) and Process Controller (PC). And admin container that manages the cluster runs 2 Java processes: Domain Controller (DC) and Process Controller (PC). @@ -81,7 +81,7 @@ Below you'll see how standalone WildFly transforms into the cluster by means of ## Create Standalone WildFly With Jelastic, the required topology can be built using a convenient wizard: -![create new wildfly environment](https://jelastic.com/blog/wp-content/uploads/2018/05/create-new-wildfly-environment.png) +![create new wildfly environment](create-new-wildfly-environment-89528537.png) 1. Create a new environment @@ -89,14 +89,14 @@ With Jelastic, the required topology can be built using a convenient wizard: * Set up vertical scaling limits * Change the name of environment if needed (e.g. **wildfly**) -![standalone wildfly via wizard](https://jelastic.com/blog/wp-content/uploads/2018/05/new-env.png) -![add wildfly node](https://jelastic.com/blog/wp-content/uploads/2018/05/mail.png) +![standalone wildfly via wizard](new-env-38da1483.png) +![add wildfly node](mail-82121608.png) You will receive an email confirmation of environment creation with the credentials to the Admin Panel. 2. Now, you are ready to deploy the application to the just provisioned standalone server. -![deploy the application](https://jelastic.com/blog/wp-content/uploads/2018/05/deployment-manager-1.png) -![deploy java application](https://jelastic.com/blog/wp-content/uploads/2018/05/deploy.png) -![create wildfly environment](https://jelastic.com/blog/wp-content/uploads/2018/05/oib.png) -![web ssh client](https://jelastic.com/blog/wp-content/uploads/2018/05/ssh1.png) +![deploy the application](deployment-manager-1-6e0360c6.png) +![deploy java application](deploy-64f84b1e.png) +![create wildfly environment](oib-de35dc34.png) +![web ssh client](ssh1-93555ae4.png) In the Deployment manager, click **Deploy to…** button. Specify the **Context** as required or just leave default ROOT value. Make sure that your application is up and running, pressing **Open in browser** near the created environment. If you log in to your container via built-in [Web SSH client](https://docs.jelastic.com/web-ssh-client?utm_source=blog-wildfly-managed-domain), you'll see only one running process of **Standalone** server. @@ -106,14 +106,14 @@ WildFly clustering with domain mode is configured automatically by means of Auto * **Manually** -![change wildfly environment topology](https://jelastic.com/blog/wp-content/uploads/2018/05/change-topology.png) -![wildfly horizontal scaling](https://jelastic.com/blog/wp-content/uploads/2018/05/autocluster11.png) +![change wildfly environment topology](change-topology-1213806e.png) +![wildfly horizontal scaling](autocluster11-4f2b39b8.jpg) Add new servers via wizard while creating the environment or by [changing its topology](https://docs.jelastic.com/jelastic-dashboard-guide?utm_source=blog-wildfly-managed-domain). Just refer to the application server layer within the left-side environment panel, enable Auto-Clustering mode and add **(+)** nodes within the [Horizontal Scaling](https://docs.jelastic.com/horizontal-scaling?utm_source=blog-wildfly-managed-domain) frame. * **Automatically** -![wildfly horizontal scaling](https://jelastic.com/blog/wp-content/uploads/2018/05/triggers1.png) +![wildfly horizontal scaling](triggers1-b34d9157.png) The number of servers can be changed automatically by setting up [scaling triggers](https://docs.jelastic.com/automatic-horizontal-scaling?utm_source=blog-wildfly-managed-domain) based on the resource consumption within **Settings \> Auto Horizontal Scaling** . **Note**: @@ -124,34 +124,34 @@ The number of servers can be changed automatically by setting up [scaling trigge Afterwards, as the scaling is completed (manual or automatic), all WildFly instances will join the cluster, working in operation mode of WildFly Managed Domain. Domain Controller and Load Balancer are added automatically as required components of the cluster. Upon this scaling, the previously deployed application is also automatically redeployed to the rest of WildFly instances of the cluster. Also, database connection pool configurations and other config customizations, previously made via WildFly admin console, are replicated across the whole application server layer. -![wildfly environment running](https://jelastic.com/blog/wp-content/uploads/2018/05/clsuter-topology.png) +![wildfly environment running](clsuter-topology-78f51b4a.png) You can check how WildFly topology is changed from standalone mode to managed domain cluster: Worker Nodes run 3 processes instead of one as it was in standalone mode: * Server:worker * Process Controller -* Host Controller ![web ssh wildfly node](https://jelastic.com/blog/wp-content/uploads/2018/05/processes.png) +* Host Controller ![web ssh wildfly node](processes-18f3ac77.png) And Domain Controller node has two processes running: * Process Controller -* Host Controller ![Domain Controller node](https://jelastic.com/blog/wp-content/uploads/2018/05/domain-processes.png) +* Host Controller ![Domain Controller node](domain-processes-0b91bd4c.png) -![wildfly admin panel](https://jelastic.com/blog/wp-content/uploads/2018/05/clsuter-topology-adminka.png) +![wildfly admin panel](clsuter-topology-adminka-3d002ebc.png) Also, the topology changes are synchronized and shown within WildFly Admin Panel. In this way you get a ready-to-use WildFly cluster that can be scaled out and in, making hosting of your applications extremely flexible and cost-effective. ## Application Availability among Workers -![application availability among workers](https://jelastic.com/blog/wp-content/uploads/2018/05/clsuter-topology-deployment-app.png) -![restart wildfly nodes](https://jelastic.com/blog/wp-content/uploads/2018/05/clsuter-topology-restart.png) +![application availability among workers](clsuter-topology-deployment-app-bf6348a0.png) +![restart wildfly nodes](clsuter-topology-restart-b7cb812b.png) The application deployed to the standalone server is redeployed to all server instances during transformation to the cluster. To check this you can click **Open in browser** at each Worker. Also, you can make sure that the cluster provides high availability. For this, press **Restart node** button for one or even two nodes and try to access your application via **Open in browser** for the whole cluster. The application will be up and running without any interruptions. ## Cloning Cluster in Domain Mode -![clone wildfly environment](https://jelastic.com/blog/wp-content/uploads/2018/05/cloning.png) -![running wildfly environment](https://jelastic.com/blog/wp-content/uploads/2018/05/2-env.png) +![clone wildfly environment](cloning-f6681875.png) +![running wildfly environment](2-env-0af64a68.png) When releasing new application version or just applying some essential adjustments, it's a good practice to check how the newly implemented changes could affect the service work. The Jelastic PaaS allows you to accomplish such testing 'on-fly' (i.e. without service downtime and implicitly for your customers) with the **Clone Environment** option. A cloned environment is a ready-to-work cluster copy with all the required modifications already applied. The newly provisioned Domain Controller node operates with the appropriate cloned Workers, which are already listed within its admin panel. And the application from the original environment is deployed to the cloned one. Thus, the only thing that remains is to recheck your application's code and custom server configurations for the hardcoded IPs/domains and fix them accordingly (if there are any issues). This way, you can apply the implied changes to your environment copy without affecting the actual production. To increase the high availability of the system, Jelastic uses **several synchronized Load-Balancers**, placed at different nodes, for handling requests simultaneously. All of them work with a single data storage, which makes them fully interchangeable in case of any issue occurs at one of the instances. diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/java-processes-inside-each-VM-or-bare-me-4576a679.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/java-processes-inside-each-VM-or-bare-me-4576a679.png new file mode 100644 index 000000000..d26f4d321 Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/java-processes-inside-each-VM-or-bare-me-4576a679.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/mail-82121608.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/mail-82121608.png new file mode 100644 index 000000000..65a0c04f1 Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/mail-82121608.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/new-env-38da1483.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/new-env-38da1483.png new file mode 100644 index 000000000..b47881b68 Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/new-env-38da1483.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/oib-de35dc34.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/oib-de35dc34.png new file mode 100644 index 000000000..b7afb7925 Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/oib-de35dc34.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/processes-18f3ac77.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/processes-18f3ac77.png new file mode 100644 index 000000000..caad2fe26 Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/processes-18f3ac77.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/ssh1-93555ae4.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/ssh1-93555ae4.png new file mode 100644 index 000000000..67cecaf34 Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/ssh1-93555ae4.png differ diff --git a/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/triggers1-b34d9157.png b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/triggers1-b34d9157.png new file mode 100644 index 000000000..db9d63459 Binary files /dev/null and b/content/posts/2021/05/31/automatic-wildfly-clustering-managed-domain-scaling-containers/triggers1-b34d9157.png differ diff --git a/content/posts/2021/06/01/asynchronous-completablefuture-san-francisco-adventure-java-challenge/completable_future-1024x801-1.jpg b/content/posts/2021/06/01/asynchronous-completablefuture-san-francisco-adventure-java-challenge/completable_future-1024x801-1.jpg new file mode 100644 index 000000000..bef6e6256 Binary files /dev/null and b/content/posts/2021/06/01/asynchronous-completablefuture-san-francisco-adventure-java-challenge/completable_future-1024x801-1.jpg differ diff --git a/content/posts/2021/06/01/asynchronous-completablefuture-san-francisco-adventure-java-challenge/completable_future-1024x801-1.png b/content/posts/2021/06/01/asynchronous-completablefuture-san-francisco-adventure-java-challenge/completable_future-1024x801-1.png deleted file mode 100644 index 75b954e22..000000000 Binary files a/content/posts/2021/06/01/asynchronous-completablefuture-san-francisco-adventure-java-challenge/completable_future-1024x801-1.png and /dev/null differ diff --git a/content/posts/2021/06/01/asynchronous-completablefuture-san-francisco-adventure-java-challenge/index.md b/content/posts/2021/06/01/asynchronous-completablefuture-san-francisco-adventure-java-challenge/index.md index c4db26866..1da6bc809 100644 --- a/content/posts/2021/06/01/asynchronous-completablefuture-san-francisco-adventure-java-challenge/index.md +++ b/content/posts/2021/06/01/asynchronous-completablefuture-san-francisco-adventure-java-challenge/index.md @@ -5,7 +5,7 @@ lastmod: "2021-08-23T12:35:13+00:00" description: "Solving the limitations of the Future interface, we have the CompletableFuture API with methods to build reliable high-performant software." authors: - "rafael-del-nero" -image: "completable_future-1024x801-1.png" +image: "completable_future-1024x801-1.jpg" categories: - "Tutorials" related_posts: diff --git a/content/posts/2021/06/02/book-review-java-by-comparison/index.md b/content/posts/2021/06/02/book-review-java-by-comparison/index.md index 8ead5894e..b8a4ff7a5 100644 --- a/content/posts/2021/06/02/book-review-java-by-comparison/index.md +++ b/content/posts/2021/06/02/book-review-java-by-comparison/index.md @@ -5,7 +5,7 @@ lastmod: "2021-09-04T07:46:46+00:00" description: "“Java by Comparison”, Simon Harrer, Jörg Lenhard, and Linus Dietz, promises the reader to become a “Java Craftsman” by studying 70 examples." authors: - "cay-horstmann" -image: "javabycomparison.png" +image: "javabycomparison.jpg" categories: - "Book Review" - "Books" diff --git a/content/posts/2021/06/02/book-review-java-by-comparison/javabycomparison.jpg b/content/posts/2021/06/02/book-review-java-by-comparison/javabycomparison.jpg new file mode 100644 index 000000000..7b6370aae Binary files /dev/null and b/content/posts/2021/06/02/book-review-java-by-comparison/javabycomparison.jpg differ diff --git a/content/posts/2021/06/02/book-review-java-by-comparison/javabycomparison.png b/content/posts/2021/06/02/book-review-java-by-comparison/javabycomparison.png deleted file mode 100644 index 75f2fd56f..000000000 Binary files a/content/posts/2021/06/02/book-review-java-by-comparison/javabycomparison.png and /dev/null differ diff --git a/content/posts/2021/06/03/jep-411-what-it-means-for-javas-security-model/Swiss_cheese_model-47912861.svg b/content/posts/2021/06/03/jep-411-what-it-means-for-javas-security-model/Swiss_cheese_model-47912861.svg new file mode 100644 index 000000000..7012bfc38 --- /dev/null +++ b/content/posts/2021/06/03/jep-411-what-it-means-for-javas-security-model/Swiss_cheese_model-47912861.svg @@ -0,0 +1,1111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hazards + + Losses prevented + + + + + + + + + + + + + + + + + + + + + + + + + + Defensive Layers (Controls) + + + + + + + + + + + + + + + + + Loss notprevented (Incident) + + + + + Near miss + + + + + + + + + diff --git a/content/posts/2021/06/03/jep-411-what-it-means-for-javas-security-model/index.md b/content/posts/2021/06/03/jep-411-what-it-means-for-javas-security-model/index.md index abbd05476..1695cb90a 100644 --- a/content/posts/2021/06/03/jep-411-what-it-means-for-javas-security-model/index.md +++ b/content/posts/2021/06/03/jep-411-what-it-means-for-javas-security-model/index.md @@ -5,7 +5,7 @@ lastmod: "2021-06-03T08:02:30+00:00" description: "Java, like most platforms or languages has layers of security, this article lookS at the Authorization layer and how JEP 411 relates to it." authors: - "peter-firmstone" -image: "https://upload.wikimedia.org/wikipedia/commons/0/07/Swiss_cheese_model.svg" +image: "Swiss_cheese_model-47912861.svg" categories: - "JEPs" - "Security" @@ -13,7 +13,7 @@ related_posts: frozen: false --- -![](https://upload.wikimedia.org/wikipedia/commons/0/07/Swiss_cheese_model.svg) +![](Swiss_cheese_model-47912861.svg) Java, like most platforms or languages has layers of security, this article intends to look at Java's Authorization layer, which is unlike in other languages, and to distinguish between two different ways this layer is typically utilized, why one is effective while the other isn't and investigate why JEP 411 only considers the least effective method and hopefully increase awareness of the Principle of Least Privilege as it's applied to Java Authorization, improve adoption, encourage people to take advantage of the improved security it provides, as well as prolong its support and possibly even improve it in future. diff --git a/content/posts/2021/06/04/javafx-gluon-status-update-dual-screen-on-raspberry-pi-sample-intellij-new-javafx-project-wizard/UX_JavaFXWizard-3c47029c-poster.jpg b/content/posts/2021/06/04/javafx-gluon-status-update-dual-screen-on-raspberry-pi-sample-intellij-new-javafx-project-wizard/UX_JavaFXWizard-3c47029c-poster.jpg new file mode 100644 index 000000000..bc67f3938 Binary files /dev/null and b/content/posts/2021/06/04/javafx-gluon-status-update-dual-screen-on-raspberry-pi-sample-intellij-new-javafx-project-wizard/UX_JavaFXWizard-3c47029c-poster.jpg differ diff --git a/content/posts/2021/06/04/javafx-gluon-status-update-dual-screen-on-raspberry-pi-sample-intellij-new-javafx-project-wizard/UX_JavaFXWizard-3c47029c.webp b/content/posts/2021/06/04/javafx-gluon-status-update-dual-screen-on-raspberry-pi-sample-intellij-new-javafx-project-wizard/UX_JavaFXWizard-3c47029c.webp new file mode 100644 index 000000000..46ab8a64d Binary files /dev/null and b/content/posts/2021/06/04/javafx-gluon-status-update-dual-screen-on-raspberry-pi-sample-intellij-new-javafx-project-wizard/UX_JavaFXWizard-3c47029c.webp differ diff --git a/content/posts/2021/06/04/javafx-gluon-status-update-dual-screen-on-raspberry-pi-sample-intellij-new-javafx-project-wizard/index.md b/content/posts/2021/06/04/javafx-gluon-status-update-dual-screen-on-raspberry-pi-sample-intellij-new-javafx-project-wizard/index.md index aad2a89b6..45707c8be 100644 --- a/content/posts/2021/06/04/javafx-gluon-status-update-dual-screen-on-raspberry-pi-sample-intellij-new-javafx-project-wizard/index.md +++ b/content/posts/2021/06/04/javafx-gluon-status-update-dual-screen-on-raspberry-pi-sample-intellij-new-javafx-project-wizard/index.md @@ -5,7 +5,7 @@ lastmod: "2021-12-10T13:00:24+00:00" description: "In this post we are going to take a deeper look into some of the recent JavaFX announcements, e.g., dual screen support on Raspberry Pi!" authors: - "frankdelporte" -image: "https://blog.jetbrains.com/wp-content/uploads/2021/05/UX_JavaFXWizard.gif" +image: "UX_JavaFXWizard-3c47029c-poster.jpg" categories: - "Embedded" - "Gluon" @@ -94,7 +94,7 @@ And that wasn't the only JavaFX announcement last week! JetBrains showed a great *To save you time configuring settings after project creation, we've reworked the new project wizard for JavaFX. It only takes two steps. First, you add a project SDK and the language you will use, the desired build system, and the test framework.* *Then you will have the opportunity to choose from a list of the most frequently used libraries, which come with short descriptions on the right. Once you create your new JavaFX project, your IDE will generate a fully configured sample application.* -![](https://blog.jetbrains.com/wp-content/uploads/2021/05/UX_JavaFXWizard.gif) +![](UX_JavaFXWizard-3c47029c.webp) ## Conclusion diff --git a/content/posts/2021/06/07/immutable-records/ebook_upd-ee1842a7.png b/content/posts/2021/06/07/immutable-records/ebook_upd-ee1842a7.png new file mode 100644 index 000000000..71e1274b2 Binary files /dev/null and b/content/posts/2021/06/07/immutable-records/ebook_upd-ee1842a7.png differ diff --git a/content/posts/2021/06/07/immutable-records/index.md b/content/posts/2021/06/07/immutable-records/index.md index 447fcd25d..fc81a76f4 100644 --- a/content/posts/2021/06/07/immutable-records/index.md +++ b/content/posts/2021/06/07/immutable-records/index.md @@ -6,7 +6,7 @@ description: "Records help remove repetitive error-prone code, increasing develo canonical: "https://jfeatures.com/blog/immutable_records" authors: - "vipin-sharma" -image: "https://jfeatures.com/img/ebook_upd.png" +image: "ebook_upd-ee1842a7.png" categories: - "Records" related_posts: @@ -70,7 +70,7 @@ Records help you remove repetitive and error-prone code, and increases developer If you want to get amazing Java jobs, I wrote an ebook [5 steps to Best Java Jobs](https://jfeatures.com/). You can download this step-by-step guide for free! -[![](https://jfeatures.com/img/ebook_upd.png)](https://jfeatures.com/) +[![](ebook_upd-ee1842a7.png)](https://jfeatures.com/) ### Resources diff --git a/content/posts/2021/06/09/foojay-status-report-january-june-2021/image-15-1024x576.jpg b/content/posts/2021/06/09/foojay-status-report-january-june-2021/image-15-1024x576.jpg new file mode 100644 index 000000000..390c18c47 Binary files /dev/null and b/content/posts/2021/06/09/foojay-status-report-january-june-2021/image-15-1024x576.jpg differ diff --git a/content/posts/2021/06/09/foojay-status-report-january-june-2021/image-15-1024x576.png b/content/posts/2021/06/09/foojay-status-report-january-june-2021/image-15-1024x576.png deleted file mode 100644 index 3d338b2a9..000000000 Binary files a/content/posts/2021/06/09/foojay-status-report-january-june-2021/image-15-1024x576.png and /dev/null differ diff --git a/content/posts/2021/06/09/foojay-status-report-january-june-2021/index.md b/content/posts/2021/06/09/foojay-status-report-january-june-2021/index.md index 89623e18c..51fe8b30c 100644 --- a/content/posts/2021/06/09/foojay-status-report-january-june-2021/index.md +++ b/content/posts/2021/06/09/foojay-status-report-january-june-2021/index.md @@ -29,7 +29,7 @@ Only from February onwards has real promotion of Foojay.io begun, since that's w Here's a map of the [20+ JUG visits across March and April](https://foojay.io/today/schedule-for-foojay-virtual-jug-tour/), all done virtually, of course, with [a large cross-section of the Java community and its technologies involved](https://foojay.io/today/virtual-foojay-jug-tour/): -{{< img src="image-15-1024x576.png" class="size-large is-resized" width="678" height="381" >}} +{{< img src="image-15-1024x576.jpg" class="size-large is-resized" width="678" height="381" >}} After that there were a number of significant spikes, in the graph above, which can also be explained: the big spike towards the end of April is because of Wim Deblauwe's brilliant and very well received "[Better Error Handling for Your Spring Boot REST APIs](https://foojay.io/today/better-error-handling-for-your-spring-boot-rest-apis/)", while the massive spike in May is because of Deepu Sasidharan's fantastically explained and comprehensive "[Demystifying JVM Memory Management](https://foojay.io/today/demystifying-jvm-memory-management/)", these two articles were extremely well received, really popular on Reddit, for example, as well as elsewhere, drawing a lot of traffic to Foojay.io, not to mention the hot discussions around JEP 411 and the deprecation of the SecurityManager, with Peter Firmstone providing great content around this theme, such as "[The Principle of Least Privilege and How JEP 411 Will Have a Negative Impact on Java Security](https://foojay.io/today/why-jep-411-will-have-a-negative-impact-on-java-security/)". diff --git a/content/posts/2021/06/14/hidden-dracula-polymorphism-java-challenge/dracula_polymorphism.jpg b/content/posts/2021/06/14/hidden-dracula-polymorphism-java-challenge/dracula_polymorphism.jpg new file mode 100644 index 000000000..b7fa4ffa9 Binary files /dev/null and b/content/posts/2021/06/14/hidden-dracula-polymorphism-java-challenge/dracula_polymorphism.jpg differ diff --git a/content/posts/2021/06/14/hidden-dracula-polymorphism-java-challenge/dracula_polymorphism.png b/content/posts/2021/06/14/hidden-dracula-polymorphism-java-challenge/dracula_polymorphism.png deleted file mode 100644 index 6176b263e..000000000 Binary files a/content/posts/2021/06/14/hidden-dracula-polymorphism-java-challenge/dracula_polymorphism.png and /dev/null differ diff --git a/content/posts/2021/06/14/hidden-dracula-polymorphism-java-challenge/index.md b/content/posts/2021/06/14/hidden-dracula-polymorphism-java-challenge/index.md index 4bbfe8e91..c7e3bf400 100644 --- a/content/posts/2021/06/14/hidden-dracula-polymorphism-java-challenge/index.md +++ b/content/posts/2021/06/14/hidden-dracula-polymorphism-java-challenge/index.md @@ -5,7 +5,7 @@ lastmod: "2021-08-23T12:29:05+00:00" description: "Polymorphism, the ability of an object to take on forms, one of the important Java concepts, decouples responsibilities, adding flexibility." authors: - "rafael-del-nero" -image: "dracula_polymorphism.png" +image: "dracula_polymorphism.jpg" categories: - "Tutorials" related_posts: diff --git a/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image1-1-828e8ac6.png b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image1-1-828e8ac6.png new file mode 100644 index 000000000..f4a8f9025 Binary files /dev/null and b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image1-1-828e8ac6.png differ diff --git a/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image10-1-655090a4.png b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image10-1-655090a4.png new file mode 100644 index 000000000..3a8851937 Binary files /dev/null and b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image10-1-655090a4.png differ diff --git a/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image11-1-657f5265.png b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image11-1-657f5265.png new file mode 100644 index 000000000..b85075742 Binary files /dev/null and b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image11-1-657f5265.png differ diff --git a/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image12-1-00b31b7a.png b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image12-1-00b31b7a.png new file mode 100644 index 000000000..fe02ad86a Binary files /dev/null and b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image12-1-00b31b7a.png differ diff --git a/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image13-1-cfbb34aa.png b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image13-1-cfbb34aa.png new file mode 100644 index 000000000..a02244e89 Binary files /dev/null and b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image13-1-cfbb34aa.png differ diff --git a/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image2-1-edb9acdd.jpg b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image2-1-edb9acdd.jpg new file mode 100644 index 000000000..2b55b83e2 Binary files /dev/null and b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image2-1-edb9acdd.jpg differ diff --git a/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image3-1-91f08dc7.jpg b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image3-1-91f08dc7.jpg new file mode 100644 index 000000000..7d8ee08f5 Binary files /dev/null and b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image3-1-91f08dc7.jpg differ diff --git a/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image5-1-95a26568.png b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image5-1-95a26568.png new file mode 100644 index 000000000..b9f042b1c Binary files /dev/null and b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image5-1-95a26568.png differ diff --git a/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image6-1-55b379bd.png b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image6-1-55b379bd.png new file mode 100644 index 000000000..25636262e Binary files /dev/null and b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image6-1-55b379bd.png differ diff --git a/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image8-1-9ccddc98.png b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image8-1-9ccddc98.png new file mode 100644 index 000000000..8c4554b55 Binary files /dev/null and b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image8-1-9ccddc98.png differ diff --git a/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image9-1-7cfdd8dc.png b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image9-1-7cfdd8dc.png new file mode 100644 index 000000000..e020c3f0b Binary files /dev/null and b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/image9-1-7cfdd8dc.png differ diff --git a/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/index.md b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/index.md index ffb357612..95e6a906f 100644 --- a/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/index.md +++ b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/index.md @@ -35,10 +35,10 @@ In this article, we would like to show how to deploy the Jakarta EE projects to ## Kubernetes Installation First, let's create a Kubernetes cluster from the Jelastic marketplace. It's a fully automated process, so just follow our tutorial [Kubernetes Cluster Setup with Automated Scaling and Pay-per-Use Pricing](https://jelastic.com/blog/kubernetes-cluster-scaling-pay-per-use-hosting/). -![Kubernetes Cluster installation](https://jelastic.com/blog/wp-content/uploads/2021/06/k8s-install.png) +![Kubernetes Cluster installation](k8s-install-4f20bd9e.png) The topology of a simple development cluster can look like as follows: -![Kubernetes Cluster](https://jelastic.com/blog/wp-content/uploads/2021/06/image6-1.png) +![Kubernetes Cluster](image6-1-55b379bd.png) ## Jakarta EE Project Deployment @@ -48,10 +48,10 @@ The topology of a simple development cluster can look like as follows: * The **postgres.yaml** will create a PostgreSQL database. * The **cargo-tracker.yaml** will deploy highly available topology of Jakarta EE application which consists of 2 replicas. -![Jakarta EE Project Deployment](https://jelastic.com/blog/wp-content/uploads/2021/06/image9-1.png) +![Jakarta EE Project Deployment](image9-1-7cfdd8dc.png) 2. Use a configuration file manager to create these files on the Control plane node (formerly known as Master) of Kubernetes cluster. -![Jakarta EE Deployment to Kubernetes](https://jelastic.com/blog/wp-content/uploads/2021/06/image1-1.png) +![Jakarta EE Deployment to Kubernetes](image1-1-828e8ac6.png) With help of these files you will create the K8s resources: @@ -69,7 +69,7 @@ To do this Issue: **$ kubectl get ing** As we can observe the **helloworld** application's ingress is holding the "/" context path. -![kubernetes web shh](https://jelastic.com/blog/wp-content/uploads/2021/06/image10-1.png) +![kubernetes web shh](image10-1-655090a4.png) Let's release the path for Cargo-tracker application deleting an existing ingress resource: @@ -80,28 +80,28 @@ After ingress deletion, apply all of the mentioned files in the order as follows **$ kubectl apply -f postgres-secret.yaml** **$ kubectl apply -f postgres.yaml** **$ kubectl apply -f cargo-tracker.yaml** -![kubernetes files](https://jelastic.com/blog/wp-content/uploads/2021/06/image5-1.png) +![kubernetes files](image5-1-95a26568.png) ## Jakarta EE Project Testing Wait for a minute and check whether the mentioned above resources have been created and are running: **$ kubectl get secrets** -![Jakarta EE Project Testing](https://jelastic.com/blog/wp-content/uploads/2021/06/image12-1.png) +![Jakarta EE Project Testing](image12-1-00b31b7a.png) **$ kubectl get deploy** -![jakarta ee inside kubernetes](https://jelastic.com/blog/wp-content/uploads/2021/06/image13-1.png) +![jakarta ee inside kubernetes](image13-1-cfbb34aa.png) **$ kubectl get svc** -![cargo tracker files](https://jelastic.com/blog/wp-content/uploads/2021/06/image8-1.png) +![cargo tracker files](image8-1-9ccddc98.png) Finally, press the **Open in Browser** button to get to your application and check its workability. -![open in browser jakarta ee application](https://jelastic.com/blog/wp-content/uploads/2021/06/image11-1.png) +![open in browser jakarta ee application](image11-1-657f5265.png) -{{< img src="https://jelastic.com/blog/wp-content/uploads/2021/06/image2-1.png" class="is-resized" alt="cargo tracker" width="647" height="512" >}} +{{< img src="image2-1-edb9acdd.jpg" class="is-resized" alt="cargo tracker" width="647" height="512" >}} You can check how the system works using demo Tracking ID **ABC123**. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2021/06/image3-1.png" class="is-resized" alt="cargo tracker testing" width="645" height="600" >}} +{{< img src="image3-1-91f08dc7.jpg" class="is-resized" alt="cargo tracker testing" width="645" height="600" >}} Congratulations! Application setup is finished successfully. Feel free to run your Jakarta EE projects inside Kubernetes clusters with [Jelastic PaaS Providers](https://jelastic.cloud/). diff --git a/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/k8s-install-4f20bd9e.png b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/k8s-install-4f20bd9e.png new file mode 100644 index 000000000..762138fbf Binary files /dev/null and b/content/posts/2021/06/16/jakarta-ee-application-deployment-kubernetes-cluster-jelastic-paas/k8s-install-4f20bd9e.png differ diff --git a/content/posts/2021/06/21/new-book-taming-thymeleaf/hero2x-59a9324a.png b/content/posts/2021/06/21/new-book-taming-thymeleaf/hero2x-59a9324a.png new file mode 100644 index 000000000..e088adb54 Binary files /dev/null and b/content/posts/2021/06/21/new-book-taming-thymeleaf/hero2x-59a9324a.png differ diff --git a/content/posts/2021/06/21/new-book-taming-thymeleaf/index.md b/content/posts/2021/06/21/new-book-taming-thymeleaf/index.md index 7d97931eb..e3afd9b98 100644 --- a/content/posts/2021/06/21/new-book-taming-thymeleaf/index.md +++ b/content/posts/2021/06/21/new-book-taming-thymeleaf/index.md @@ -24,7 +24,7 @@ The book [Taming Thymeleaf](https://www.wimdeblauwe.com/books/taming-thymeleaf/) You will also learn how to integrate libraries like Tailwind CSS that need some npm based processing. The book also shows a nice live-reload setup for maximum productivity during the development of your application. -![hero2x?1602161070](https://d2sofvawe08yqg.cloudfront.net/taming-thymeleaf/hero2x?1602161070) +![hero2x?1602161070](hero2x-59a9324a.png) The book is available as [e-book](https://leanpub.com/taming-thymeleaf) or in [paperback](https://www.lulu.com/en/us/shop/wim-deblauwe/taming-thymeleaf/paperback/product-mgpezn.html?page=1&pageSize=4) format. See for more information and some screenshots of the application you will build during the course of the book. diff --git a/content/posts/2021/06/22/apache-cassandra-4-0-taming-tail-latencies-with-java-16-zgc/index.md b/content/posts/2021/06/22/apache-cassandra-4-0-taming-tail-latencies-with-java-16-zgc/index.md index bf364220e..cbb9146d3 100644 --- a/content/posts/2021/06/22/apache-cassandra-4-0-taming-tail-latencies-with-java-16-zgc/index.md +++ b/content/posts/2021/06/22/apache-cassandra-4-0-taming-tail-latencies-with-java-16-zgc/index.md @@ -27,7 +27,7 @@ Here, I'd like to focus on improvements in Java garbage collection that Cassandr In 2012, I gave a talk titled, "Dealing with JVM Limitations in Apache Cassandra." Here is the first slide from that presentation: -{{< img src="paintpointsforjavadatabases.png" class="size-full is-resized" width="734" >}} +{{< img src="paintpointsforjavadatabases.jpg" class="size-full is-resized" width="734" >}} On the one hand, garbage collection is a primary reason that Java is so much more productive than traditional systems languages like C++. As JVM architect Cliff Click once wrote, "Many concurrent algorithms are very easy to write with a GC and totally hard to downright impossible using explicit free." Cassandra takes full advantage of this power. diff --git a/content/posts/2021/06/22/apache-cassandra-4-0-taming-tail-latencies-with-java-16-zgc/paintpointsforjavadatabases.jpg b/content/posts/2021/06/22/apache-cassandra-4-0-taming-tail-latencies-with-java-16-zgc/paintpointsforjavadatabases.jpg new file mode 100644 index 000000000..ba6472027 Binary files /dev/null and b/content/posts/2021/06/22/apache-cassandra-4-0-taming-tail-latencies-with-java-16-zgc/paintpointsforjavadatabases.jpg differ diff --git a/content/posts/2021/06/22/apache-cassandra-4-0-taming-tail-latencies-with-java-16-zgc/paintpointsforjavadatabases.png b/content/posts/2021/06/22/apache-cassandra-4-0-taming-tail-latencies-with-java-16-zgc/paintpointsforjavadatabases.png deleted file mode 100644 index 6b22fe588..000000000 Binary files a/content/posts/2021/06/22/apache-cassandra-4-0-taming-tail-latencies-with-java-16-zgc/paintpointsforjavadatabases.png and /dev/null differ diff --git a/content/posts/2021/06/22/primitive-set-operations-in-eclipse-collections-part-2/1-Ge_-WW6p36ypRkKo_ARUow-5f415ce7.png b/content/posts/2021/06/22/primitive-set-operations-in-eclipse-collections-part-2/1-Ge_-WW6p36ypRkKo_ARUow-5f415ce7.png new file mode 100644 index 000000000..916d320ee Binary files /dev/null and b/content/posts/2021/06/22/primitive-set-operations-in-eclipse-collections-part-2/1-Ge_-WW6p36ypRkKo_ARUow-5f415ce7.png differ diff --git a/content/posts/2021/06/22/primitive-set-operations-in-eclipse-collections-part-2/1-dIfPbw3i4Vm8Z_nSJc-Bpg-9472a73a.png b/content/posts/2021/06/22/primitive-set-operations-in-eclipse-collections-part-2/1-dIfPbw3i4Vm8Z_nSJc-Bpg-9472a73a.png new file mode 100644 index 000000000..9005da75f Binary files /dev/null and b/content/posts/2021/06/22/primitive-set-operations-in-eclipse-collections-part-2/1-dIfPbw3i4Vm8Z_nSJc-Bpg-9472a73a.png differ diff --git a/content/posts/2021/06/22/primitive-set-operations-in-eclipse-collections-part-2/1-n6jDbl59hZRjqlJTElHOKA-26dcb6f8.png b/content/posts/2021/06/22/primitive-set-operations-in-eclipse-collections-part-2/1-n6jDbl59hZRjqlJTElHOKA-26dcb6f8.png new file mode 100644 index 000000000..284f64584 Binary files /dev/null and b/content/posts/2021/06/22/primitive-set-operations-in-eclipse-collections-part-2/1-n6jDbl59hZRjqlJTElHOKA-26dcb6f8.png differ diff --git a/content/posts/2021/06/22/primitive-set-operations-in-eclipse-collections-part-2/index.md b/content/posts/2021/06/22/primitive-set-operations-in-eclipse-collections-part-2/index.md index 97f72da5a..62ebe2053 100644 --- a/content/posts/2021/06/22/primitive-set-operations-in-eclipse-collections-part-2/index.md +++ b/content/posts/2021/06/22/primitive-set-operations-in-eclipse-collections-part-2/index.md @@ -37,7 +37,7 @@ Method signature: `setA.symmetricDifference(setB)` This operation returns a set that contains elements that are in either one of the two sets but not **both**. In other words, (Set A — Set B) U (Set B — Set A). -{{< img src="https://cdn-images-1.medium.com/max/450/1*n6jDbl59hZRjqlJTElHOKA.png" class="alignleft" alt="Symmetric Difference " width="310" height="305" >}} +{{< img src="1-n6jDbl59hZRjqlJTElHOKA-26dcb6f8.png" class="alignleft" alt="Symmetric Difference " width="310" height="305" >}} Set A — 1, 2, 3. @@ -84,7 +84,7 @@ Method signature: `setA.isSubsetOf(setB)` This operation returns true if all elements from Set A are present in Set B. -{{< img src="https://cdn-images-1.medium.com/max/450/1*Ge_-WW6p36ypRkKo_ARUow.png" class="alignleft" alt="Set A is a subset of Set B" width="216" height="280" >}} +{{< img src="1-Ge_-WW6p36ypRkKo_ARUow-5f415ce7.png" class="alignleft" alt="Set A is a subset of Set B" width="216" height="280" >}} Set A — 1, 2. @@ -160,7 +160,7 @@ Method Signature: `setA.cartesianProduct(setB)` Cartesian Product of Set A and Set B is the set of all possible ordered pairs where the first element of the pair is from Set A and the second element from Set B. -{{< img src="https://cdn-images-1.medium.com/max/450/1*dIfPbw3i4Vm8Z_nSJc-Bpg.png" class="alignleft" alt="Cartesian Product A x B" width="270" height="273" >}} +{{< img src="1-dIfPbw3i4Vm8Z_nSJc-Bpg-9472a73a.png" class="alignleft" alt="Cartesian Product A x B" width="270" height="273" >}} Set A — 1, 3. diff --git a/content/posts/2021/06/24/jdb/index.md b/content/posts/2021/06/24/jdb/index.md index 1f2851f01..427f3fa58 100644 --- a/content/posts/2021/06/24/jdb/index.md +++ b/content/posts/2021/06/24/jdb/index.md @@ -309,4 +309,4 @@ Knowing features like this helps you get the best java jobs, that's why to help Download this step-by-step guide for free! -![](https://jfeatures.com/img/ebook_upd.png) +![](ebook_upd.png) diff --git a/content/posts/2021/06/24/openjdk-and-the-future-of-production-profiling/cropped-ddprofiling-banner.jpg b/content/posts/2021/06/24/openjdk-and-the-future-of-production-profiling/cropped-ddprofiling-banner.jpg new file mode 100644 index 000000000..539024c15 Binary files /dev/null and b/content/posts/2021/06/24/openjdk-and-the-future-of-production-profiling/cropped-ddprofiling-banner.jpg differ diff --git a/content/posts/2021/06/24/openjdk-and-the-future-of-production-profiling/cropped-ddprofiling-banner.png b/content/posts/2021/06/24/openjdk-and-the-future-of-production-profiling/cropped-ddprofiling-banner.png deleted file mode 100644 index 57ea85810..000000000 Binary files a/content/posts/2021/06/24/openjdk-and-the-future-of-production-profiling/cropped-ddprofiling-banner.png and /dev/null differ diff --git a/content/posts/2021/06/24/openjdk-and-the-future-of-production-profiling/index.md b/content/posts/2021/06/24/openjdk-and-the-future-of-production-profiling/index.md index 95b14258c..14cf3b816 100644 --- a/content/posts/2021/06/24/openjdk-and-the-future-of-production-profiling/index.md +++ b/content/posts/2021/06/24/openjdk-and-the-future-of-production-profiling/index.md @@ -6,7 +6,7 @@ description: "With changes in the Java (and the computing) ecosystem, JFR has so canonical: "http://hirt.se/blog/?p=1318" authors: - "hirt" -image: "cropped-ddprofiling-banner.png" +image: "cropped-ddprofiling-banner.jpg" categories: - "JDK Flight Recorder" related_posts: diff --git a/content/posts/2021/06/25/creating-a-javafx-world-clock-from-scratch-part-6/JFX-World-Clock-Part-6.jpg b/content/posts/2021/06/25/creating-a-javafx-world-clock-from-scratch-part-6/JFX-World-Clock-Part-6.jpg new file mode 100644 index 000000000..80e5d6458 Binary files /dev/null and b/content/posts/2021/06/25/creating-a-javafx-world-clock-from-scratch-part-6/JFX-World-Clock-Part-6.jpg differ diff --git a/content/posts/2021/06/25/creating-a-javafx-world-clock-from-scratch-part-6/JFX-World-Clock-Part-6.png b/content/posts/2021/06/25/creating-a-javafx-world-clock-from-scratch-part-6/JFX-World-Clock-Part-6.png deleted file mode 100644 index bd6d3bc2d..000000000 Binary files a/content/posts/2021/06/25/creating-a-javafx-world-clock-from-scratch-part-6/JFX-World-Clock-Part-6.png and /dev/null differ diff --git a/content/posts/2021/06/25/creating-a-javafx-world-clock-from-scratch-part-6/index.md b/content/posts/2021/06/25/creating-a-javafx-world-clock-from-scratch-part-6/index.md index b59403a62..163f0038a 100644 --- a/content/posts/2021/06/25/creating-a-javafx-world-clock-from-scratch-part-6/index.md +++ b/content/posts/2021/06/25/creating-a-javafx-world-clock-from-scratch-part-6/index.md @@ -5,7 +5,7 @@ lastmod: "2022-01-12T13:46:44+00:00" description: "Learn how to make WebService calls (RESTful) from your JavaFX application to retrieve weather data based on geographic locations." authors: - "carldea" -image: "JFX-World-Clock-Part-6.png" +image: "JFX-World-Clock-Part-6.jpg" categories: - "JavaFX" - "Tutorials" @@ -24,7 +24,7 @@ Hello, and welcome to the last part of this series of articles on creating a Jav In this part, I will show you how to make WebService calls (RESTful) to retrieve weather data based on geographic locations. If you remember, [in Part 5](https://foojay.io/today/creating-a-javafx-world-clock-from-scratch-part-5/) you learned how to use the JavaFX WebView and the popular mapping library Leaflet JS enabling the user to discover geographic locations. In Part 6, I will show you how I used Java 11's Http Client to retrieve and display weather content. If you are new to this series, you can visit Part [1](https://foojay.io/today/creating-a-javafx-world-clock-from-scratch-part-1/ "1")-[5](https://foojay.io/today/creating-a-javafx-world-clock-from-scratch-part-5/ "5"). -![JFX World Clock Part 6](JFX-World-Clock-Part-6.png) +![JFX World Clock Part 6](JFX-World-Clock-Part-6.jpg) JFX World Clock Part 6 diff --git a/content/posts/2021/07/02/jps/index.md b/content/posts/2021/07/02/jps/index.md index 59af8853f..54f6206e9 100644 --- a/content/posts/2021/07/02/jps/index.md +++ b/content/posts/2021/07/02/jps/index.md @@ -171,7 +171,7 @@ Output: `jps` is a simple tool with few options that make it easy to master, and when in need it can be a quick and great help you wanted. Utilities like this are very useful in a situation when we need to analyze and resolve problems in production Java application quickly. `jps` is part of OpenJDK, no need to install any third party software. If you want to get amazing Java jobs, I wrote an ebook \[5 steps to Best Java Jobs\](https://jfeatures.com/). You can download this step-by-step guide for free! -![](https://jfeatures.com/img/ebook_upd.png) +![](ebook_upd.png) #### Resources diff --git a/content/posts/2021/07/05/soprano-ofnullable-stream-java-challenge/index.md b/content/posts/2021/07/05/soprano-ofnullable-stream-java-challenge/index.md index df3356c76..657317fb8 100644 --- a/content/posts/2021/07/05/soprano-ofnullable-stream-java-challenge/index.md +++ b/content/posts/2021/07/05/soprano-ofnullable-stream-java-challenge/index.md @@ -5,7 +5,7 @@ lastmod: "2021-08-23T12:17:43+00:00" description: "Since Java 9, you can use Optional with a stream to manipulate values from a List. Check out the latest Java challenge about this!" authors: - "rafael-del-nero" -image: "soprano_challenge.png" +image: "soprano_challenge.jpg" categories: - "Tutorials" related_posts: diff --git a/content/posts/2021/07/05/soprano-ofnullable-stream-java-challenge/soprano_challenge.jpg b/content/posts/2021/07/05/soprano-ofnullable-stream-java-challenge/soprano_challenge.jpg new file mode 100644 index 000000000..2f6acf8ef Binary files /dev/null and b/content/posts/2021/07/05/soprano-ofnullable-stream-java-challenge/soprano_challenge.jpg differ diff --git a/content/posts/2021/07/05/soprano-ofnullable-stream-java-challenge/soprano_challenge.png b/content/posts/2021/07/05/soprano-ofnullable-stream-java-challenge/soprano_challenge.png deleted file mode 100644 index f51a1801d..000000000 Binary files a/content/posts/2021/07/05/soprano-ofnullable-stream-java-challenge/soprano_challenge.png and /dev/null differ diff --git a/content/posts/2021/07/08/the-lifecycle-of-a-security-vulnerability/index.md b/content/posts/2021/07/08/the-lifecycle-of-a-security-vulnerability/index.md index 9165eb515..a27c2f30d 100644 --- a/content/posts/2021/07/08/the-lifecycle-of-a-security-vulnerability/index.md +++ b/content/posts/2021/07/08/the-lifecycle-of-a-security-vulnerability/index.md @@ -31,7 +31,7 @@ However, whichever of these two scenarios (intentional or unintentional) applies In the following, we assume that a security hole has been created and that it is now active in software. These can be executable programs or libraries that are integrated into other software projects as a dependency. > Here is the video on youtube for this post. -> [![The lifeline of a vulnerability - 4k](http://img.youtube.com/vi/2_b0KxUl4vs/mqdefault.jpg)](http://www.youtube.com/watch?v=2_b0KxUl4vs "The lifeline of a vulnerability - 4k") +> [![The lifeline of a vulnerability - 4k](mqdefault-63f97f58.jpg)](http://www.youtube.com/watch?v=2_b0KxUl4vs "The lifeline of a vulnerability - 4k") ## From Discovery to Publicly Available @@ -75,7 +75,7 @@ But let's take a step back and take a closer look at the situation. In most case I use the technique of mutation testing. This gives you more concrete test coverage than is usually the case with the conventional line or branch coverage. A complete description of this procedure is beyond the scope of this article. > However, if you want to learn more about mutation testing, visit the following URL, where the video explains the theoretical and practical part of the mutation test for Java and Kotlin. -> [![Video - Mutationtesting - english](http://img.youtube.com/vi/6Vej7YEOF8g/mqdefault.jpg)](http://www.youtube.com/watch?v=6Vej7YEOF8g "Video - Mutationtesting - english") +> [![Video - Mutationtesting - english](mqdefault-590ea734.jpg)](http://www.youtube.com/watch?v=6Vej7YEOF8g "Video - Mutationtesting - english") ## From Logical Central Point to Finding Vulnerabilities diff --git a/content/posts/2021/07/08/the-lifecycle-of-a-security-vulnerability/mqdefault-590ea734.jpg b/content/posts/2021/07/08/the-lifecycle-of-a-security-vulnerability/mqdefault-590ea734.jpg new file mode 100644 index 000000000..4599cb186 Binary files /dev/null and b/content/posts/2021/07/08/the-lifecycle-of-a-security-vulnerability/mqdefault-590ea734.jpg differ diff --git a/content/posts/2021/07/08/the-lifecycle-of-a-security-vulnerability/mqdefault-63f97f58.jpg b/content/posts/2021/07/08/the-lifecycle-of-a-security-vulnerability/mqdefault-63f97f58.jpg new file mode 100644 index 000000000..685a69538 Binary files /dev/null and b/content/posts/2021/07/08/the-lifecycle-of-a-security-vulnerability/mqdefault-63f97f58.jpg differ diff --git a/content/posts/2021/07/14/cvss-101-first-steps-with-common-vulnerability-scoring-system/index.md b/content/posts/2021/07/14/cvss-101-first-steps-with-common-vulnerability-scoring-system/index.md index 940c19e1f..e288d19f6 100644 --- a/content/posts/2021/07/14/cvss-101-first-steps-with-common-vulnerability-scoring-system/index.md +++ b/content/posts/2021/07/14/cvss-101-first-steps-with-common-vulnerability-scoring-system/index.md @@ -35,7 +35,7 @@ The basic idea behind CVSS is to provide a general classification of the severit ***What is the basic structure of this assessment?*** In principle, CVSS can be described so that the probability and the maximum possible damage are related using predefined factors. The basic formula for this is: **risk = probability of occurrence x damage** > If you want, you can check out my video on Youtube about CVSS as well. -> [![CVSS - explained - english](http://img.youtube.com/vi/CZrS_UFT37Y/mqdefault.jpg)](https://youtu.be/CZrS_UFT37Y "CVSS - explained - english - 4k") +> [![CVSS - explained - english](mqdefault-af379c71.jpg)](https://youtu.be/CZrS_UFT37Y "CVSS - explained - english - 4k") ### **The Basic Values From 0..10** diff --git a/content/posts/2021/07/14/cvss-101-first-steps-with-common-vulnerability-scoring-system/mqdefault-af379c71.jpg b/content/posts/2021/07/14/cvss-101-first-steps-with-common-vulnerability-scoring-system/mqdefault-af379c71.jpg new file mode 100644 index 000000000..43133bc30 Binary files /dev/null and b/content/posts/2021/07/14/cvss-101-first-steps-with-common-vulnerability-scoring-system/mqdefault-af379c71.jpg differ diff --git a/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/14772500-querycassandra-1024x487.jpg b/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/14772500-querycassandra-1024x487.jpg new file mode 100644 index 000000000..13bdf48c1 Binary files /dev/null and b/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/14772500-querycassandra-1024x487.jpg differ diff --git a/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/14772500-querycassandra-1024x487.png b/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/14772500-querycassandra-1024x487.png deleted file mode 100644 index f28003d36..000000000 Binary files a/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/14772500-querycassandra-1024x487.png and /dev/null differ diff --git a/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/14772514-queue.jpg b/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/14772514-queue.jpg new file mode 100644 index 000000000..7f0946522 Binary files /dev/null and b/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/14772514-queue.jpg differ diff --git a/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/14772514-queue.png b/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/14772514-queue.png deleted file mode 100644 index 998ab5974..000000000 Binary files a/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/14772514-queue.png and /dev/null differ diff --git a/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/index.md b/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/index.md index 66a455f07..df22e16a1 100644 --- a/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/index.md +++ b/content/posts/2021/07/15/best-practices-for-data-pipeline-error-handling-in-apache-nifi/index.md @@ -6,7 +6,7 @@ description: "Actionable strategies for error management modeling in Apache NiFi canonical: "https://dzone.com/articles/best-practices-for-data-pipeline-error-handling-in" authors: - "pieter-humphrey" -image: "14772514-queue.png" +image: "14772514-queue.jpg" categories: - "Apache Cassandra" - "Databases" @@ -85,7 +85,7 @@ To see how to do this analysis, we will consider four possible strategies: one e External sources are outside our control. Therefore, we neither know the root cause of the problem nor can we try to solve it. As a result, the best approach is to ask the source if it is back to normal or not. We will call this the retry approach. An example would be when our model receives information from a database or data API service located on the cloud, such as [DataStax Astra DB](https://dtsx.io/3wcjyor) (which is powered by Cassandra), and suddenly we face an interrupted Internet connection. A self-solving strategy could involve using a retry, such as it is shown in the figure below: -![](14772500-querycassandra-1024x487.png) +![](14772500-querycassandra-1024x487.jpg) *Simple retry in Apache NiFi.* @@ -106,7 +106,7 @@ Another tool complementing back pressure is "Back Pressure Prediction". This fun ![](14772503-back-pressure-prediction-1024x138.png) In order to monitor the queue, we must hover over the scroll line on the connector. We will see two important values: predicted queue and estimated time to back pressure. The first value gives the estimated percentage use of the queue and the second the predicted time to back pressure activation. The figure below shows an example where random files are generated and the queue reaches the object threshold of 10000. -![](14772514-queue.png) +![](14772514-queue.jpg) *Back pressure queue monitoring in Apache NiFi.* diff --git a/content/posts/2021/07/16/the-search-for-a-cloud-native-atabase/cncf-landscape-db_hu725d4d7b3d105a5db9f2db4c635f96d6_353693_800x0_resize_catmullrom_2.jpg b/content/posts/2021/07/16/the-search-for-a-cloud-native-atabase/cncf-landscape-db_hu725d4d7b3d105a5db9f2db4c635f96d6_353693_800x0_resize_catmullrom_2.jpg new file mode 100644 index 000000000..a0fb674ec Binary files /dev/null and b/content/posts/2021/07/16/the-search-for-a-cloud-native-atabase/cncf-landscape-db_hu725d4d7b3d105a5db9f2db4c635f96d6_353693_800x0_resize_catmullrom_2.jpg differ diff --git a/content/posts/2021/07/16/the-search-for-a-cloud-native-atabase/cncf-landscape-db_hu725d4d7b3d105a5db9f2db4c635f96d6_353693_800x0_resize_catmullrom_2.png b/content/posts/2021/07/16/the-search-for-a-cloud-native-atabase/cncf-landscape-db_hu725d4d7b3d105a5db9f2db4c635f96d6_353693_800x0_resize_catmullrom_2.png deleted file mode 100644 index 82891aefb..000000000 Binary files a/content/posts/2021/07/16/the-search-for-a-cloud-native-atabase/cncf-landscape-db_hu725d4d7b3d105a5db9f2db4c635f96d6_353693_800x0_resize_catmullrom_2.png and /dev/null differ diff --git a/content/posts/2021/07/16/the-search-for-a-cloud-native-atabase/index.md b/content/posts/2021/07/16/the-search-for-a-cloud-native-atabase/index.md index cce60d50d..08c4fe3b5 100644 --- a/content/posts/2021/07/16/the-search-for-a-cloud-native-atabase/index.md +++ b/content/posts/2021/07/16/the-search-for-a-cloud-native-atabase/index.md @@ -7,7 +7,7 @@ canonical: "https://k8ssandra.io/blog/articles/the-search-for-a-cloud-native-dat authors: - "cedrick-lunven" - "jeff-carpenter" -image: "cncf-landscape-db_hu725d4d7b3d105a5db9f2db4c635f96d6_353693_800x0_resize_catmullrom_2.png" +image: "cncf-landscape-db_hu725d4d7b3d105a5db9f2db4c635f96d6_353693_800x0_resize_catmullrom_2.jpg" categories: - "Apache Cassandra" - "Databases" @@ -31,7 +31,7 @@ Here's how the Cloud Native Computing Foundation (CNCF) [defines the term](https > These techniques enable loosely coupled systems that are resilient, manageable, and observable. Combined with robust automation, they allow engineers to make high-impact changes frequently and predictably with minimal toil." This is a rich definition, but it can be a challenge to use this to define what a cloud-native database is, as evidenced by the **Database** section of the CNCF Landscape Map: -![](cncf-landscape-db_hu725d4d7b3d105a5db9f2db4c635f96d6_353693_800x0_resize_catmullrom_2.png) +![](cncf-landscape-db_hu725d4d7b3d105a5db9f2db4c635f96d6_353693_800x0_resize_catmullrom_2.jpg) Databases are just a small portion of a crowded cloud computing landscape diff --git a/content/posts/2021/07/21/jedi-lambda-join-java-challenge/index.md b/content/posts/2021/07/21/jedi-lambda-join-java-challenge/index.md index b9f40cc1c..2668c8617 100644 --- a/content/posts/2021/07/21/jedi-lambda-join-java-challenge/index.md +++ b/content/posts/2021/07/21/jedi-lambda-join-java-challenge/index.md @@ -5,7 +5,7 @@ lastmod: "2021-08-23T12:17:12+00:00" description: "Are you ready for the next Java Challenge? Less introduction, more action, and master Java concepts by having fun!" authors: - "rafael-del-nero" -image: "lambda_join.png" +image: "lambda_join.jpg" categories: - "Tutorials" related_posts: diff --git a/content/posts/2021/07/21/jedi-lambda-join-java-challenge/lambda_join.jpg b/content/posts/2021/07/21/jedi-lambda-join-java-challenge/lambda_join.jpg new file mode 100644 index 000000000..9576e13b5 Binary files /dev/null and b/content/posts/2021/07/21/jedi-lambda-join-java-challenge/lambda_join.jpg differ diff --git a/content/posts/2021/07/21/jedi-lambda-join-java-challenge/lambda_join.png b/content/posts/2021/07/21/jedi-lambda-join-java-challenge/lambda_join.png deleted file mode 100644 index 2b75ade65..000000000 Binary files a/content/posts/2021/07/21/jedi-lambda-join-java-challenge/lambda_join.png and /dev/null differ diff --git a/content/posts/2021/07/22/book-review-seriously-good-software/Faella-SGS-HI-8fd9184e.jpeg b/content/posts/2021/07/22/book-review-seriously-good-software/Faella-SGS-HI-8fd9184e.jpeg new file mode 100644 index 000000000..ec50e2a57 Binary files /dev/null and b/content/posts/2021/07/22/book-review-seriously-good-software/Faella-SGS-HI-8fd9184e.jpeg differ diff --git a/content/posts/2021/07/22/book-review-seriously-good-software/faella-code-sample-df05a8b2.png b/content/posts/2021/07/22/book-review-seriously-good-software/faella-code-sample-df05a8b2.png new file mode 100644 index 000000000..d22d72f1f Binary files /dev/null and b/content/posts/2021/07/22/book-review-seriously-good-software/faella-code-sample-df05a8b2.png differ diff --git a/content/posts/2021/07/22/book-review-seriously-good-software/faella-image-sample-446f6927.png b/content/posts/2021/07/22/book-review-seriously-good-software/faella-image-sample-446f6927.png new file mode 100644 index 000000000..1b0e668e2 Binary files /dev/null and b/content/posts/2021/07/22/book-review-seriously-good-software/faella-image-sample-446f6927.png differ diff --git a/content/posts/2021/07/22/book-review-seriously-good-software/index.md b/content/posts/2021/07/22/book-review-seriously-good-software/index.md index 2547c16fd..26abd46f7 100644 --- a/content/posts/2021/07/22/book-review-seriously-good-software/index.md +++ b/content/posts/2021/07/22/book-review-seriously-good-software/index.md @@ -5,7 +5,7 @@ lastmod: "2021-09-04T07:45:39+00:00" description: "This is another book that I can warmly recommend to Java programmers who have learned to code and strive to code well!" authors: - "cay-horstmann" -image: "https://horstmann.com/unblog/2021-07-05/Faella-SGS-HI.jpeg" +image: "Faella-SGS-HI-8fd9184e.jpeg" categories: - "Book Review" - "Books" @@ -16,7 +16,7 @@ related_posts: frozen: true --- -![Cover](https://horstmann.com/unblog/2021-07-05/Faella-SGS-HI.jpeg) +![Cover](Faella-SGS-HI-8fd9184e.jpeg) I recently [reviewed the book "Java by Comparison"](/today/book-review-java-by-comparison/) by Simon Harrer, Jörg Lenhard, and Linus Dietz. That book is intended for programmers who know the basics of the Java language, perhaps from a university curriculum. The book teaches programmers to improve their Java language and library usage through seventy "before and after" examples, covering topics such as coding style, naming, exceptions, streams, and class design. @@ -63,7 +63,7 @@ In my review of "Java by Comparison", I wrote: "Here is one more thing I like. I I liked the annotated figures, rendered in a minimalistic style that reminded me of [Edward Tufte](//www.edwardtufte.com/tufte'). (OK, Tufte might have removed the borders around the nodes.) -![Image Sample](https://horstmann.com/unblog/2021-07-05/faella-image-sample.png) +![Image Sample](faella-image-sample-446f6927.png) And **I loved the code annotations**. Marco puts the emphasis where it belongs: on the annotations. @@ -75,7 +75,7 @@ Why do blogs do what they do? Because it's easy, not because it's good. You can' That's not what Marco does. Look at this sample. -![Code Sample](https://horstmann.com/unblog/2021-07-05/faella-code-sample.png) +![Code Sample](faella-code-sample-df05a8b2.png) Note how the annotations are *not in monospace*. They use a font that is easy to read (except they revert to monospace for actual code, as they should). Just like you write about code in the main text. diff --git a/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/image-2-1024x450.jpg b/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/image-2-1024x450.jpg new file mode 100644 index 000000000..44f53ae80 Binary files /dev/null and b/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/image-2-1024x450.jpg differ diff --git a/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/image-2-1024x450.png b/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/image-2-1024x450.png deleted file mode 100644 index 47455764b..000000000 Binary files a/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/image-2-1024x450.png and /dev/null differ diff --git a/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/index.md b/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/index.md index 28df5b124..17ceb20a6 100644 --- a/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/index.md +++ b/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/index.md @@ -6,7 +6,7 @@ description: "How we utilize off-the-shelf functionality and components to set u canonical: "https://www.datastax.com/blog/how-connect-stateful-workloads-across-kubernetes-clusters" authors: - "roman-chernobelskiy" -image: "multi-cluster-overlay-networking.png" +image: "multi-cluster-overlay-networking.jpg" categories: - "Apache Cassandra" - "Databases" @@ -38,7 +38,7 @@ So the idea of making our own virtual IPs and exposing them just to the relevant ## Lightweight overlay network to the rescue Overlay networks differ in their capabilities and implementations, but one thing that unites them is that they run on top of other networks. Each link connecting two nodes of an overlay network corresponds to a path of one or more links on the underlying network. While overlay networks usually serve traffic for multiple different apps, the overlay network described here will be single tenant and dedicated to one app. It will consist of two logical components: routing and transport. For routing, we need a way to route connections to a given stateful pod (virtual IP) that survives pod IP changes during pod restart. For transport, we'll need to communicate the source and destination virtual IP addresses across the connection and to secure the data stream. -![](image-2-1024x450.png) +![](image-2-1024x450.jpg) The basic premise behind routing is simple. First, we select a subnet for our overlay network, let's say [10.0.0.0/8](https://tailscale.com/kb/1015/100.x-addresses/). Then, we assign our app in each Kubernetes cluster an ordinal. So for example, app in cluster 1 is assigned ordinal 1, and app in cluster 2 is assigned ordinal 2. This ordinal becomes the second octet of the virtual IP, giving the app in cluster 1 a virtual subnet of 10.1.0.0/16, and the app in cluster 2 a virtual subnet of 10.2.0.0/16. diff --git a/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/multi-cluster-overlay-networking.jpg b/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/multi-cluster-overlay-networking.jpg new file mode 100644 index 000000000..ff2735a7f Binary files /dev/null and b/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/multi-cluster-overlay-networking.jpg differ diff --git a/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/multi-cluster-overlay-networking.png b/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/multi-cluster-overlay-networking.png deleted file mode 100644 index f80b59592..000000000 Binary files a/content/posts/2021/07/23/connect-stateful-workloads-across-kubernetes-clusters/multi-cluster-overlay-networking.png and /dev/null differ diff --git a/content/posts/2021/07/26/neo-stream-search-java-challenge/index.md b/content/posts/2021/07/26/neo-stream-search-java-challenge/index.md index c2fd7593a..379f64c15 100644 --- a/content/posts/2021/07/26/neo-stream-search-java-challenge/index.md +++ b/content/posts/2021/07/26/neo-stream-search-java-challenge/index.md @@ -5,7 +5,7 @@ lastmod: "2021-08-23T12:16:36+00:00" description: "In this challenge, we explore important key methods when we work with a Java Stream so that it becomes clear for you what they do." authors: - "rafael-del-nero" -image: "neo.png" +image: "neo.jpg" categories: - "Tutorials" related_posts: diff --git a/content/posts/2021/07/26/neo-stream-search-java-challenge/neo.jpg b/content/posts/2021/07/26/neo-stream-search-java-challenge/neo.jpg new file mode 100644 index 000000000..00a5c2a87 Binary files /dev/null and b/content/posts/2021/07/26/neo-stream-search-java-challenge/neo.jpg differ diff --git a/content/posts/2021/07/26/neo-stream-search-java-challenge/neo.png b/content/posts/2021/07/26/neo-stream-search-java-challenge/neo.png deleted file mode 100644 index 22321bdda..000000000 Binary files a/content/posts/2021/07/26/neo-stream-search-java-challenge/neo.png and /dev/null differ diff --git a/content/posts/2021/07/29/getting-started-with-snyk-for-secure-java-development/blog-secure-java-development-repo-1240x2-599df2c1.png b/content/posts/2021/07/29/getting-started-with-snyk-for-secure-java-development/blog-secure-java-development-repo-1240x2-599df2c1.png new file mode 100644 index 000000000..cba1550de Binary files /dev/null and b/content/posts/2021/07/29/getting-started-with-snyk-for-secure-java-development/blog-secure-java-development-repo-1240x2-599df2c1.png differ diff --git a/content/posts/2021/07/29/getting-started-with-snyk-for-secure-java-development/index.md b/content/posts/2021/07/29/getting-started-with-snyk-for-secure-java-development/index.md index d74cbd0e0..4341d6815 100644 --- a/content/posts/2021/07/29/getting-started-with-snyk-for-secure-java-development/index.md +++ b/content/posts/2021/07/29/getting-started-with-snyk-for-secure-java-development/index.md @@ -6,7 +6,7 @@ description: "Learn how to begin with Snyk for secure Java development so that canonical: "https://snyk.io/blog/snyk-for-secure-java-development/" authors: - "bmvermeer" -image: "https://res.cloudinary.com/snyk/images/w_1240,h_221,c_scale/f_auto,q_auto/v1/wordpress-sync/blog-secure-java-development-repo/blog-secure-java-development-repo-1240x221.png?_i=AA" +image: "blog-secure-java-development-repo-1240x2-599df2c1.png" categories: - "Security" - "Snyk" @@ -51,7 +51,7 @@ Next, you can connect your Git repository. If you connect your Java repository, The example below shows a pom file from a demo project that contains known security vulnerabilities. Every time Snyk finds a new issue, it will be visible in your dashboard, explaining the vulnerability and possible remediation advice. In addition, the get integration can also scan Dockerfiles and perform Snyk Code analyses. If you want more information about the Snyk Code analyses for Java applications with the Snyk Git integration, check out this [Solving Java security issues in my Spring MVC application](https://snyk.io/blog/java-code-analysis-solving-java-security-issues-in-spring-mvc-app/) blog post. -![Develop secure Java code with Snyk](https://res.cloudinary.com/snyk/images/w_1240,h_221,c_scale/f_auto,q_auto/v1/wordpress-sync/blog-secure-java-development-repo/blog-secure-java-development-repo-1240x221.png?_i=AA) +![Develop secure Java code with Snyk](blog-secure-java-development-repo-1240x2-599df2c1.png) ## Maven and Gradle plugins diff --git a/content/posts/2021/08/02/skps-definitive-primer-failures-pitfalls-and-disadvantages-of-microservices/14889462-skp-uber-microservices-depedenc-8e918f47.jpg b/content/posts/2021/08/02/skps-definitive-primer-failures-pitfalls-and-disadvantages-of-microservices/14889462-skp-uber-microservices-depedenc-8e918f47.jpg new file mode 100644 index 000000000..fa84f58d7 Binary files /dev/null and b/content/posts/2021/08/02/skps-definitive-primer-failures-pitfalls-and-disadvantages-of-microservices/14889462-skp-uber-microservices-depedenc-8e918f47.jpg differ diff --git a/content/posts/2021/08/02/skps-definitive-primer-failures-pitfalls-and-disadvantages-of-microservices/index.md b/content/posts/2021/08/02/skps-definitive-primer-failures-pitfalls-and-disadvantages-of-microservices/index.md index 870a7caa2..635f0fae6 100644 --- a/content/posts/2021/08/02/skps-definitive-primer-failures-pitfalls-and-disadvantages-of-microservices/index.md +++ b/content/posts/2021/08/02/skps-definitive-primer-failures-pitfalls-and-disadvantages-of-microservices/index.md @@ -61,7 +61,7 @@ The communication between External World and Microservices or within Microservic So, Once the Initial Part is Over - Even If the Microservices Strategy and Implementation Turns out to be a Success - It still means a Heavy Hit on the Pocket for Maintenance. Even though all of the Current Generation Organizations Rely on an External Cloud Provider, It still means more Expenditure on Hardware, 'Software', Cloud, DevOps Engineers. Also, the Total Cost of Ownership (TCO) of Such an Infrastructural Masterpiece is only bound to Increase as More Abstractions are added over Time - Also, the Maintenance itself could be a complicated process. -[![](https://1.bp.blogspot.com/-sQgs_D2r0gM/YNb_PUeOkYI/AAAAAAAA9dU/TcRqW71TP6wYIN78FBDsVLO4_qyzTmlwQCLcBGAsYHQ/w640-h350/skp_microservices_complexity_001.png)](https://1.bp.blogspot.com/-sQgs_D2r0gM/YNb_PUeOkYI/AAAAAAAA9dU/TcRqW71TP6wYIN78FBDsVLO4_qyzTmlwQCLcBGAsYHQ/w640-h350/skp_microservices_complexity_001.png) +[![](skp_microservices_complexity_001-9c1b0f81.png)](skp_microservices_complexity_001-9c1b0f81.png) **FIG. 1** : INDICATIVE COMPLEXITY OF MICROSERVICES ARCHITECTURE IN THE ENTERPRISE @@ -131,7 +131,7 @@ So, Once the Initial Part is Over - Even If the Microservices Strategy and Imple Let us take a look a Uber's Microservices Dependency Graph (Source : Online Presentation by an Uber Engineer - All Rights Reserved by Uber - Solely Used to Demostrate Complexity). It seems like an Outer Space Image from a Hubble Telescope! 🙂 -[![](https://dzone.com/storage/temp/14889462-skp-uber-microservices-depedency-graph-2021-compre.jpg)](https://dzone.com/storage/temp/14889462-skp-uber-microservices-depedency-graph-2021-compre.jpg) +[![](14889462-skp-uber-microservices-depedenc-8e918f47.jpg)](14889462-skp-uber-microservices-depedenc-8e918f47.jpg) **FIG. 2** : REAL-WORLD MICROSERVICES DEPENDENCY GRAPH FROM UBER ENGINEERING diff --git a/content/posts/2021/08/02/skps-definitive-primer-failures-pitfalls-and-disadvantages-of-microservices/skp_microservices_complexity_001-9c1b0f81.png b/content/posts/2021/08/02/skps-definitive-primer-failures-pitfalls-and-disadvantages-of-microservices/skp_microservices_complexity_001-9c1b0f81.png new file mode 100644 index 000000000..7c5659ce5 Binary files /dev/null and b/content/posts/2021/08/02/skps-definitive-primer-failures-pitfalls-and-disadvantages-of-microservices/skp_microservices_complexity_001-9c1b0f81.png differ diff --git a/content/posts/2021/08/05/sast-dast-iast-and-rasp/index.md b/content/posts/2021/08/05/sast-dast-iast-and-rasp/index.md index e6bc95c65..1572efca3 100644 --- a/content/posts/2021/08/05/sast-dast-iast-and-rasp/index.md +++ b/content/posts/2021/08/05/sast-dast-iast-and-rasp/index.md @@ -5,7 +5,7 @@ lastmod: "2021-08-05T08:29:47+00:00" description: "In this article, we're going to look at the differences between the various cybersecurity defence techniques!" authors: - "sven-ruppert" -image: "http://img.youtube.com/vi/sW7mTNVIUhE/mqdefault.jpg" +image: "mqdefault-ef018420.jpg" categories: - "DevOps" - "Security" @@ -29,7 +29,7 @@ What exactly happens now with the SAST procedure? SAST is available in two forms When using SAST, it makes a lot more sense to deal with all the other components first. Therefore, all binary files of the entire application environment are meant here. This also includes all elements that play a role in the development, such as the CI server and the other tools used. > Tip: You can see the Blogpost as Youtube Video here: -> [![DevSecOps - What is SAST DAST IAST and RASP - english - 4k](http://img.youtube.com/vi/sW7mTNVIUhE/mqdefault.jpg)](https://youtu.be/sW7mTNVIUhE "DevSecOps - What is SAST DAST IAST and RASP - english - 4k") +> [![DevSecOps - What is SAST DAST IAST and RASP - english - 4k](mqdefault-ef018420.jpg)](https://youtu.be/sW7mTNVIUhE "DevSecOps - What is SAST DAST IAST and RASP - english - 4k") **DAST: Dynamic Application Security Testing** diff --git a/content/posts/2021/08/05/sast-dast-iast-and-rasp/mqdefault-ef018420.jpg b/content/posts/2021/08/05/sast-dast-iast-and-rasp/mqdefault-ef018420.jpg new file mode 100644 index 000000000..aec9f7de8 Binary files /dev/null and b/content/posts/2021/08/05/sast-dast-iast-and-rasp/mqdefault-ef018420.jpg differ diff --git a/content/posts/2021/08/09/jdk-mission-control-8-1-0-released/image-4.jpg b/content/posts/2021/08/09/jdk-mission-control-8-1-0-released/image-4.jpg new file mode 100644 index 000000000..c95618ec5 Binary files /dev/null and b/content/posts/2021/08/09/jdk-mission-control-8-1-0-released/image-4.jpg differ diff --git a/content/posts/2021/08/09/jdk-mission-control-8-1-0-released/image-4.png b/content/posts/2021/08/09/jdk-mission-control-8-1-0-released/image-4.png deleted file mode 100644 index e9206a89e..000000000 Binary files a/content/posts/2021/08/09/jdk-mission-control-8-1-0-released/image-4.png and /dev/null differ diff --git a/content/posts/2021/08/09/jdk-mission-control-8-1-0-released/index.md b/content/posts/2021/08/09/jdk-mission-control-8-1-0-released/index.md index c67c3384e..172261b04 100644 --- a/content/posts/2021/08/09/jdk-mission-control-8-1-0-released/index.md +++ b/content/posts/2021/08/09/jdk-mission-control-8-1-0-released/index.md @@ -44,7 +44,7 @@ There are more than 80 fixes and improvements in this release. Check out the JMC **New Serializers Core Bundle** There is now a new core bundle making it easy to serialize flight recording data to DOT (Graphviz) and JSon. This bundle will be expanded upon in future versions. -![](image-4.png) +![](image-4.jpg) **Improved JFR parser performance** diff --git a/content/posts/2021/08/09/new-book-practical-vaadin/index.md b/content/posts/2021/08/09/new-book-practical-vaadin/index.md index ed2630697..8c89d96ab 100644 --- a/content/posts/2021/08/09/new-book-practical-vaadin/index.md +++ b/content/posts/2021/08/09/new-book-practical-vaadin/index.md @@ -5,7 +5,7 @@ lastmod: "2022-03-25T14:56:15+00:00" description: "Alejandro Duarte's new book shows how to implement web applications in Java using the open source Vaadin framework version 20 and later." authors: - "jonathan-gennick" -image: "practical-vaadin.png" +image: "practical-vaadin.jpg" categories: - "Book Announcement" - "Books" diff --git a/content/posts/2021/08/09/new-book-practical-vaadin/practical-vaadin.jpg b/content/posts/2021/08/09/new-book-practical-vaadin/practical-vaadin.jpg new file mode 100644 index 000000000..f2feabbaf Binary files /dev/null and b/content/posts/2021/08/09/new-book-practical-vaadin/practical-vaadin.jpg differ diff --git a/content/posts/2021/08/09/new-book-practical-vaadin/practical-vaadin.png b/content/posts/2021/08/09/new-book-practical-vaadin/practical-vaadin.png deleted file mode 100644 index 500f020d7..000000000 Binary files a/content/posts/2021/08/09/new-book-practical-vaadin/practical-vaadin.png and /dev/null differ diff --git a/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/AAUvwnhZCtF1ebTwYW849Uu3l8VdQj62T_eaLsRJ-7867e37f.jpg b/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/AAUvwnhZCtF1ebTwYW849Uu3l8VdQj62T_eaLsRJ-7867e37f.jpg new file mode 100644 index 000000000..059d1bd62 Binary files /dev/null and b/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/AAUvwnhZCtF1ebTwYW849Uu3l8VdQj62T_eaLsRJ-7867e37f.jpg differ diff --git a/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/AAUvwniR1nyALB7XJIAL49WrhFCMjf39ALwQiAbU-39df74d9.jpg b/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/AAUvwniR1nyALB7XJIAL49WrhFCMjf39ALwQiAbU-39df74d9.jpg new file mode 100644 index 000000000..8b1c1533b Binary files /dev/null and b/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/AAUvwniR1nyALB7XJIAL49WrhFCMjf39ALwQiAbU-39df74d9.jpg differ diff --git a/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/AAUvwnikcyASO4g2KHeCbCouznJ7oxIdBfUimaAV-6799bbc1.jpg b/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/AAUvwnikcyASO4g2KHeCbCouznJ7oxIdBfUimaAV-6799bbc1.jpg new file mode 100644 index 000000000..1950f0295 Binary files /dev/null and b/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/AAUvwnikcyASO4g2KHeCbCouznJ7oxIdBfUimaAV-6799bbc1.jpg differ diff --git a/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/index.md b/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/index.md index 6e401d074..682c34aad 100644 --- a/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/index.md +++ b/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/index.md @@ -5,7 +5,7 @@ lastmod: "2021-08-19T08:19:58+00:00" description: "New attack vectors are becoming more and more sophisticated and are directed more and more against the value chain in general!" authors: - "sven-ruppert" -image: "http://img.youtube.com/vi/ClYhATBlBl0/mqdefault.jpg" +image: "mqdefault-f6be976c.jpg" categories: - "DevOps" - "JFrog Artifactory" @@ -28,7 +28,7 @@ Let's start with the story that got all of this rolling and made sure that the g We're talking about the SolarWinds Hack, of course. What happened here, exactly, and what is more critical: What are the lessons learned from this incident? > This blogpost is available as video as well! -> [![Executive Order and the SolarWinds Hack - what das it mean for us? - english - 4k](http://img.youtube.com/vi/ClYhATBlBl0/mqdefault.jpg)](https://youtu.be/ClYhATBlBl0 "Executive Order and the SolarWinds Hack - what das it mean for us? - english - 4k") +> [![Executive Order and the SolarWinds Hack - what das it mean for us? - english - 4k](mqdefault-f6be976c.jpg)](https://youtu.be/ClYhATBlBl0 "Executive Order and the SolarWinds Hack - what das it mean for us? - english - 4k") It is essential to know that the SolarWinds company produces software that is used to manage network infrastructure. With the name "Orion Platform", this software helps manage and administer network components efficiently. @@ -126,12 +126,12 @@ Cheers Sven Youtube Channel - Outdoor Nerd - English -[![Youtube Channel English](https://yt3.ggpht.com/ytc/AAUvwniR1nyALB7XJIAL49WrhFCMjf39ALwQiAbUoOF1=s176-c-k-c0x00ffffff-no-rj)](https://bit.ly/Outdoor-Nerd "Youtube Channel - Outdoor Nerd") +[![Youtube Channel English](AAUvwniR1nyALB7XJIAL49WrhFCMjf39ALwQiAbU-39df74d9.jpg)](https://bit.ly/Outdoor-Nerd "Youtube Channel - Outdoor Nerd") Youtube Channel - Sven Ruppert - German -[![Youtube Channel German](https://yt3.ggpht.com/ytc/AAUvwnikcyASO4g2KHeCbCouznJ7oxIdBfUimaAVOC3CGFc=s176-c-k-c0x00ffffff-no-rj)](https://www.youtube.com/user/svenruppert "Youtube Channel - Sven Ruppert") +[![Youtube Channel German](AAUvwnikcyASO4g2KHeCbCouznJ7oxIdBfUimaAV-6799bbc1.jpg)](https://www.youtube.com/user/svenruppert "Youtube Channel - Sven Ruppert") Youtube Channel - Sven Ruppert - Outdoor -[![Youtube Channel German](https://yt3.ggpht.com/ytc/AAUvwnhZCtF1ebTwYW849Uu3l8VdQj62T_eaLsRJy6w2uA=s176-c-k-c0x00ffffff-no-rj)](https://www.youtube.com/channel/UCwFH8F7TNzY5Qi2K98ddNgw "Youtube Channel - Sven Ruppert private") +[![Youtube Channel German](AAUvwnhZCtF1ebTwYW849Uu3l8VdQj62T_eaLsRJ-7867e37f.jpg)](https://www.youtube.com/channel/UCwFH8F7TNzY5Qi2K98ddNgw "Youtube Channel - Sven Ruppert private") diff --git a/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/mqdefault-f6be976c.jpg b/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/mqdefault-f6be976c.jpg new file mode 100644 index 000000000..b9faab3e2 Binary files /dev/null and b/content/posts/2021/08/19/solarwinds-hack-and-the-executive-order-of-cybersecurity-what-does-this-mean-for-us/mqdefault-f6be976c.jpg differ diff --git a/content/posts/2021/08/20/deep-learning-in-java-for-drug-discovery/deepnetts.jpg b/content/posts/2021/08/20/deep-learning-in-java-for-drug-discovery/deepnetts.jpg new file mode 100644 index 000000000..8b45d1dca Binary files /dev/null and b/content/posts/2021/08/20/deep-learning-in-java-for-drug-discovery/deepnetts.jpg differ diff --git a/content/posts/2021/08/20/deep-learning-in-java-for-drug-discovery/deepnetts.png b/content/posts/2021/08/20/deep-learning-in-java-for-drug-discovery/deepnetts.png deleted file mode 100644 index 62e50eff5..000000000 Binary files a/content/posts/2021/08/20/deep-learning-in-java-for-drug-discovery/deepnetts.png and /dev/null differ diff --git a/content/posts/2021/08/20/deep-learning-in-java-for-drug-discovery/index.md b/content/posts/2021/08/20/deep-learning-in-java-for-drug-discovery/index.md index ef8504c32..f36d69bc5 100644 --- a/content/posts/2021/08/20/deep-learning-in-java-for-drug-discovery/index.md +++ b/content/posts/2021/08/20/deep-learning-in-java-for-drug-discovery/index.md @@ -7,7 +7,7 @@ canonical: "https://www.linkedin.com/pulse/deep-learning-drug-discovery-new-fron authors: - "oscar-bastidas" - "zoran-sevarac" -image: "deepnetts.png" +image: "deepnetts.jpg" categories: - "Deep Netts" - "Machine Learning" diff --git a/content/posts/2021/08/27/understanding-apache-maven-part-1-the-basics/index.md b/content/posts/2021/08/27/understanding-apache-maven-part-1-the-basics/index.md index 0c9c84757..3ad6ebd6b 100644 --- a/content/posts/2021/08/27/understanding-apache-maven-part-1-the-basics/index.md +++ b/content/posts/2021/08/27/understanding-apache-maven-part-1-the-basics/index.md @@ -85,6 +85,6 @@ Maven commands execute parts of its Project Object Model. A Project Object Model is *usually* described as an XML document. A POM description is NOT limited to XML. Other formats can be used to describe the Project Object Model, however, XML was the first format used. A picture to illustrate a typical maven execution: -![A pictorial overview of how maven interacts with a project's Project Object Model. Includes assembling, download of dependencies and plugins, execution of build lifecycles and an upload of build artifacts to either a local repository or to a maven repository on a network](https://cgunturme.files.wordpress.com/2020/05/maven.png?w=840) Maven – A pictorial overview +![A pictorial overview of how maven interacts with a project's Project Object Model. Includes assembling, download of dependencies and plugins, execution of build lifecycles and an upload of build artifacts to either a local repository or to a maven repository on a network](maven-58e6db6b.png) Maven – A pictorial overview The next article in this series will dig into details of a Project Object Model (POM). [Have fun with Apache Maven!](https://maven.apache.org/) diff --git a/content/posts/2021/08/27/understanding-apache-maven-part-1-the-basics/maven-58e6db6b.png b/content/posts/2021/08/27/understanding-apache-maven-part-1-the-basics/maven-58e6db6b.png new file mode 100644 index 000000000..42862b9a7 Binary files /dev/null and b/content/posts/2021/08/27/understanding-apache-maven-part-1-the-basics/maven-58e6db6b.png differ diff --git a/content/posts/2021/08/30/pi4j-v-2-released/index.md b/content/posts/2021/08/30/pi4j-v-2-released/index.md index a84cc790f..20586f0a0 100644 --- a/content/posts/2021/08/30/pi4j-v-2-released/index.md +++ b/content/posts/2021/08/30/pi4j-v-2-released/index.md @@ -38,7 +38,7 @@ Pi4J V.2 is a complete rewrite and **does not maintain API compatibility** with * Hardware PWM Support * Java 11 -![](https://raw.githubusercontent.com/Pi4J/pi4j-v2/master/assets/draw.io/pi4j-v2-architecture.jpg) P4J V.2 architecture diagram +![](pi4j-v2-architecture-1f6d8aff.jpg) P4J V.2 architecture diagram In addition to the features listed above, Pi4J version 2.0 also abandons the old WiringPi pin numbering scheme in favor of the more traditional and commonly used Broadcom pin numbering scheme. This pin numbering scheme has been a source of confusion for a number of years, especially with beginners and is somewhat cumbersome to maintain as new Raspberry Pi models are introduces with differing or added GPIO pins. Moving forward, Pi4J will only use the Broadcom (BCM) pin numbering scheme. diff --git a/content/posts/2021/08/30/pi4j-v-2-released/pi4j-v2-architecture-1f6d8aff.jpg b/content/posts/2021/08/30/pi4j-v-2-released/pi4j-v2-architecture-1f6d8aff.jpg new file mode 100644 index 000000000..be87a4db3 Binary files /dev/null and b/content/posts/2021/08/30/pi4j-v-2-released/pi4j-v2-architecture-1f6d8aff.jpg differ diff --git a/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image1-8acd6e83.png b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image1-8acd6e83.png new file mode 100644 index 000000000..6f0bfebf3 Binary files /dev/null and b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image1-8acd6e83.png differ diff --git a/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image10-e198b9c4.png b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image10-e198b9c4.png new file mode 100644 index 000000000..b3862be7b Binary files /dev/null and b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image10-e198b9c4.png differ diff --git a/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image11-379fd649.png b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image11-379fd649.png new file mode 100644 index 000000000..b65ec4b94 Binary files /dev/null and b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image11-379fd649.png differ diff --git a/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image2-5c4597d7.png b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image2-5c4597d7.png new file mode 100644 index 000000000..a348aa850 Binary files /dev/null and b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image2-5c4597d7.png differ diff --git a/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image3.jpg b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image3.jpg new file mode 100644 index 000000000..9d946e3e4 Binary files /dev/null and b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image3.jpg differ diff --git a/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image3.png b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image3.png deleted file mode 100644 index 265ffc348..000000000 Binary files a/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image3.png and /dev/null differ diff --git a/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image4-62fc91ef.png b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image4-62fc91ef.png new file mode 100644 index 000000000..f992ca790 Binary files /dev/null and b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image4-62fc91ef.png differ diff --git a/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image5-2537cca4.png b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image5-2537cca4.png new file mode 100644 index 000000000..335f6f71c Binary files /dev/null and b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image5-2537cca4.png differ diff --git a/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image6-7370ebb1.png b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image6-7370ebb1.png new file mode 100644 index 000000000..42b085ff8 Binary files /dev/null and b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image6-7370ebb1.png differ diff --git a/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image7-1024x310-302594e3.jpg b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image7-1024x310-302594e3.jpg new file mode 100644 index 000000000..355d58924 Binary files /dev/null and b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image7-1024x310-302594e3.jpg differ diff --git a/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image8-1024x601-8df389c2.jpg b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image8-1024x601-8df389c2.jpg new file mode 100644 index 000000000..ab63f5532 Binary files /dev/null and b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image8-1024x601-8df389c2.jpg differ diff --git a/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image9-b6807d67.png b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image9-b6807d67.png new file mode 100644 index 000000000..ac3fadb8a Binary files /dev/null and b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/image9-b6807d67.png differ diff --git a/content/posts/2021/08/30/tomcat-tomee-clustering-automation/index.md b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/index.md index 01583b04a..f12b65e34 100644 --- a/content/posts/2021/08/30/tomcat-tomee-clustering-automation/index.md +++ b/content/posts/2021/08/30/tomcat-tomee-clustering-automation/index.md @@ -5,7 +5,7 @@ lastmod: "2021-09-16T14:46:22+00:00" description: "Find out about Tomcat and TomEE auto-clustering in Jelastic PaaS, as well as how to get these scalable clusters up and running!" authors: - "tetiana-fydorenchyk" -image: "image3.png" +image: "image3.jpg" categories: - "Jakarta EE" - "Jelastic" @@ -14,7 +14,7 @@ related_posts: frozen: false --- -{{< img src="https://jelastic.com/blog/wp-content/uploads/2021/08/image11.png" class="alignleft" alt="Tomcat TomEE Automatic Clustering" >}} +{{< img src="image11-379fd649.png" class="alignleft" alt="Tomcat TomEE Automatic Clustering" >}} Apache [Tomcat](https://tomcat.apache.org/) is an open-source application server maintained by the Apache community. It is one of the most popular solutions for hosting Java applications due to its ease-of-use and lightweight yet versatile functionality. However, if you run the projects based on [Jakarta EE](https://jakarta.ee/) 8 (or higher), you may be interested to use [TomEE](https://tomee.apache.org/) server with built-in required enterprise technology that isn't found in Tomcat. @@ -35,20 +35,20 @@ Below, you can find out more about the implementation of Tomcat and TomEE auto-c There are multiple tutorials on how to set up Tomcat clusters, but the configuration is relatively complex and includes many tweaks, which makes it seem like a lot. However, with the Jelastic [Auto-Clustering](https://docs.jelastic.com/what-is-auto-clustering/) feature, we went further and automated the whole process, making it as simple as flipping a switch. 1. Log in to your Jelastic account and click **New Environment** at the top. -![Tomcat and TomEE environments](https://jelastic.com/blog/wp-content/uploads/2021/08/image6.png) +![Tomcat and TomEE environments](image6-7370ebb1.png) 2. In the open [topology wizard](https://docs.jelastic.com/setting-up-environment/), choose **Tomcat** or **TomEE** among **Java** application servers and turn on the **Auto-Clustering** switcher. Make any other necessary adjustments and click **Create**. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2021/08/image4.png" class="is-resized" alt="tomcat environment" width="695" height="433" >}} +{{< img src="image4-62fc91ef.png" class="is-resized" alt="tomcat environment" width="695" height="433" >}} 3. In a few minutes, your Tomcat cluster will appear within the dashboard. -![tomcat cluster topology](https://jelastic.com/blog/wp-content/uploads/2021/08/image10.png) +![tomcat cluster topology](image10-e198b9c4.png) ## Tomcat / TomEE Cluster Topology and Specifics The topology of the highly available Tomcat cluster is straightforward and efficient, without any unnecessary elements to complicate it or reduce performance. The default cluster topology looks like below: -{{< img src="https://jelastic.com/blog/wp-content/uploads/2021/08/image2.png" class="aligncenter is-resized" alt="tomee tomcat cluster topology" width="406" height="490" >}} +{{< img src="image2-5c4597d7.png" class="aligncenter is-resized" alt="tomee tomcat cluster topology" width="406" height="490" >}} Such topology ensures that performance and fault tolerance requirements are met. [**NGINX** load balancer](https://docs.jelastic.com/nginx-load-balancer/) in front of the cluster handles workload distribution. Also, it automatically registers any changes in the cluster, reacting to the compute nodes' addition, deletion, or failure. You can follow our [load balancing test](https://docs.jelastic.com/testing-load-balancing/) tutorial to get an evaluation of workload distribution. @@ -71,20 +71,20 @@ You can check and adjust it if necessary via the built-in [Configuration File Ma * The instance itself is added to the configuration as **LocalMember**. Other Tomcat nodes in the layer are added by their IPs and uniqueId, which are generated using the containers' IP addresses and IDs. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2021/08/image5.png" class="is-resized" alt="tomcat cluster configurations" width="757" height="492" >}} +{{< img src="image5-2537cca4.png" class="is-resized" alt="tomcat cluster configurations" width="757" height="492" >}} * The DeltaManager is used for replicating sessions. As a result, the session data is spread across all the layer nodes (from all to all). -{{< img src="https://jelastic.com/blog/wp-content/uploads/2021/08/image9.png" class="is-resized" alt="tomcat session replication" width="755" height="223" >}} +{{< img src="image9-b6807d67.png" class="is-resized" alt="tomcat session replication" width="755" height="223" >}} * [Static membership](https://tomcat.apache.org/tomcat-9.0-doc/config/cluster-interceptor.html#Static_Membership) is used for discovering the cluster peers - the whole and exact list of all the cluster members is listed in the ***server.xml*** on every node. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2021/08/image7-1024x310.png" class="is-resized" alt="tomcat cluster members" width="756" height="229" >}} +{{< img src="image7-1024x310-302594e3.jpg" class="is-resized" alt="tomcat cluster members" width="756" height="229" >}} * Interconnection is done through port *4004* using the TCP protocol - an appropriate rule is added to the [firewall](https://docs.jelastic.com/custom-firewall/) during the cluster configuration. * Also, in the ***/opt/tomcat/conf/context.xml*** configuration file, the *[org.apache.catalina.ha.context.ReplicatedContext](https://tomcat.apache.org/tomcat-9.0-doc/config/cluster.html)* class is used for the context implementation to provide replication. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2021/08/image1.png" class="is-resized" alt="tomcat server replication" width="760" height="232" >}} +{{< img src="image1-8acd6e83.png" class="is-resized" alt="tomcat server replication" width="760" height="232" >}} All these settings are done automatically during creation and do not require manual maintenance during the cluster lifecycle. @@ -94,7 +94,7 @@ It's evident that high availability is demanded almost for any application, so i 1. Go to **Settings \> Auto Horizontal Scaling** for your Tomcat / TomEE cluster environment. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2021/08/image8-1024x601.png" class="is-resized" alt="tomcat horizontal scaling" width="759" height="445" >}} +{{< img src="image8-1024x601-8df389c2.jpg" class="is-resized" alt="tomcat horizontal scaling" width="759" height="445" >}} 2. Set up scaling triggers for the required resources (RAM, CPU, Network, Disk). diff --git a/content/posts/2021/09/03/understanding-apache-maven-part-2-pom-hierarchy/index.md b/content/posts/2021/09/03/understanding-apache-maven-part-2-pom-hierarchy/index.md index fdfdf4702..f4610aacf 100644 --- a/content/posts/2021/09/03/understanding-apache-maven-part-2-pom-hierarchy/index.md +++ b/content/posts/2021/09/03/understanding-apache-maven-part-2-pom-hierarchy/index.md @@ -6,7 +6,7 @@ description: "Following on from the first article covering the Maven basics, the canonical: "https://cguntur.me/2020/05/24/understanding-apache-maven-part-2/" authors: - "c-guntur" -image: "https://cgunturme.files.wordpress.com/2020/05/maveneffectivepom.png?w=1024" +image: "maveneffectivepom-5c2ea620.png" categories: - "Maven" related_posts: @@ -52,7 +52,7 @@ An effective POM is: ### How does Maven assemble the effective POM? -![A set of boxes representing the maven internal defaults -> maven super pom -> maven global settings -> maven user settings -> Parent/bill-of-material poms -> project pom that finally results in an effective POM.](https://cgunturme.files.wordpress.com/2020/05/maveneffectivepom.png?w=1024) +![A set of boxes representing the maven internal defaults -> maven super pom -> maven global settings -> maven user settings -> Parent/bill-of-material poms -> project pom that finally results in an effective POM.](maveneffectivepom-5c2ea620.png) Maven *assembles* its effective POM by traversing the layers that act as building blocks. Each layer used has the ability to override or enrich the content of what will become an **effective POM**. Maven internal defaults and the super POM are built-in to the maven installation, so ideally not subject to customization. The layers below, the global settings and user settings are, as their name suggests, inclined towards hosting and overriding any settings for maven. The parent, bill-of-material and project POM files are where maven instructions can be customized. Default values from above layers are utilized if no customization is made. diff --git a/content/posts/2021/09/03/understanding-apache-maven-part-2-pom-hierarchy/maveneffectivepom-5c2ea620.png b/content/posts/2021/09/03/understanding-apache-maven-part-2-pom-hierarchy/maveneffectivepom-5c2ea620.png new file mode 100644 index 000000000..0e4fc71b6 Binary files /dev/null and b/content/posts/2021/09/03/understanding-apache-maven-part-2-pom-hierarchy/maveneffectivepom-5c2ea620.png differ diff --git a/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/7KpvEn1-f55720c6.gif b/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/7KpvEn1-f55720c6.gif new file mode 100644 index 000000000..5efd66b78 Binary files /dev/null and b/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/7KpvEn1-f55720c6.gif differ diff --git a/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/AZaR0LP-dffec787.gif b/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/AZaR0LP-dffec787.gif new file mode 100644 index 000000000..76d7c222a Binary files /dev/null and b/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/AZaR0LP-dffec787.gif differ diff --git a/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/R0mdaId-c5de449a.png b/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/R0mdaId-c5de449a.png new file mode 100644 index 000000000..f967ae456 Binary files /dev/null and b/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/R0mdaId-c5de449a.png differ diff --git a/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/cxs080wnnykflkmsfo9p-3462e69b.jpg b/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/cxs080wnnykflkmsfo9p-3462e69b.jpg new file mode 100644 index 000000000..45735ae8b Binary files /dev/null and b/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/cxs080wnnykflkmsfo9p-3462e69b.jpg differ diff --git a/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/index.md b/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/index.md index e7783ddf3..3126ef785 100644 --- a/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/index.md +++ b/content/posts/2021/09/07/demystifying-memory-management-in-modern-programming-languages/index.md @@ -6,7 +6,7 @@ description: "Let's demystify the concepts behind memory management, taking a de canonical: "https://deepu.tech/memory-management-in-programming/" authors: - "deepu-sasidharan" -image: "https://i.imgur.com/R0mdaId.png" +image: "R0mdaId-c5de449a.png" categories: - "Java Core" related_posts: @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![Cover](https://i.imgur.com/R0mdaId.png "Cover") +![Cover](R0mdaId-c5de449a.png "Cover") In this multi-part series, I aim to demystify the concepts behind memory management and take a deeper look at memory management in some of the modern programming languages. @@ -51,7 +51,7 @@ The stack is used for **static memory allocation** and as the name suggests it i * This is where you would encounter **stack overflow errors** as the size of the stack is limited compared to the Heap. * There is a **limit on the size** of value that can be stored on the Stack for most languages. -![stack in JavaScript](https://i.imgur.com/7KpvEn1.gif) +![stack in JavaScript](7KpvEn1-f55720c6.gif) Stack used in JavaScript, objects are stored in Heap and referenced when needed. [Here](https://youtu.be/95_CAUC9nvE) is a video of the same. @@ -93,7 +93,7 @@ Automatic management of heap memory by freeing unused memory allocations. GC is **JVM (Java/Scala/Groovy/Kotlin)** , **JavaScript** , **C#** , **Golang** , **OCaml** , and **Ruby** are some of the languages that use Garbage collection for memory management by default. -![Mark & sweep GC](https://i.imgur.com/AZaR0LP.gif) +![Mark & sweep GC](AZaR0LP-dffec787.gif) * **Mark \& Sweep GC** : Also known as Tracing GC. Its generally a two-phase algorithm that first marks objects that are still being referenced as "alive" and in the next phase frees the memory of objects that are not alive. **JVM** , **C#** , **Ruby** , **JavaScript** , and **Golang** employ this approach for example. In JVM there are different GC algorithms to choose from while JavaScript engines like V8 use a Mark \& Sweep GC along with Reference counting GC to complement it. This kind of GC is also available for C \& C++ as an [external library](https://en.wikipedia.org/wiki/Boehm_garbage_collector). * **Reference counting GC** : In this approach, every object gets a reference count which is incremented or decremented as references to it change and garbage collection is done when the count becomes zero. It's not very preferred as it cannot handle cyclic references. **PHP** , **Perl** , and **Python**, for example, uses this type of GC with workarounds to overcome cyclic references. This type of GC can be enabled for C++ as well. @@ -114,7 +114,7 @@ It combines RAII with an ownership model, any value must have a variable as its It is used by [**Rust**](https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html), in my research I couldn't find any other language using this exact mechanism. -![Ownership in Rust](https://thepracticaldev.s3.amazonaws.com/i/cxs080wnnykflkmsfo9p.png) +![Ownership in Rust](cxs080wnnykflkmsfo9p-3462e69b.jpg) We have just scratched the surface of memory management. diff --git a/content/posts/2021/09/09/eight-debugging-tips-for-intellijidea-users-you-never-knew-existed/Debugging-tips_comp.jpg b/content/posts/2021/09/09/eight-debugging-tips-for-intellijidea-users-you-never-knew-existed/Debugging-tips_comp.jpg new file mode 100644 index 000000000..b117134eb Binary files /dev/null and b/content/posts/2021/09/09/eight-debugging-tips-for-intellijidea-users-you-never-knew-existed/Debugging-tips_comp.jpg differ diff --git a/content/posts/2021/09/09/eight-debugging-tips-for-intellijidea-users-you-never-knew-existed/Debugging-tips_comp.png b/content/posts/2021/09/09/eight-debugging-tips-for-intellijidea-users-you-never-knew-existed/Debugging-tips_comp.png deleted file mode 100644 index a362be70b..000000000 Binary files a/content/posts/2021/09/09/eight-debugging-tips-for-intellijidea-users-you-never-knew-existed/Debugging-tips_comp.png and /dev/null differ diff --git a/content/posts/2021/09/09/eight-debugging-tips-for-intellijidea-users-you-never-knew-existed/index.md b/content/posts/2021/09/09/eight-debugging-tips-for-intellijidea-users-you-never-knew-existed/index.md index 9222b61b9..fd101ad01 100644 --- a/content/posts/2021/09/09/eight-debugging-tips-for-intellijidea-users-you-never-knew-existed/index.md +++ b/content/posts/2021/09/09/eight-debugging-tips-for-intellijidea-users-you-never-knew-existed/index.md @@ -7,7 +7,7 @@ canonical: "https://lightrun.com/blog/eight-debugging-tips-for-intellijidea-user authors: - "noga-badhav" - "shai-almog" -image: "Debugging-tips_comp.png" +image: "Debugging-tips_comp.jpg" categories: - "IntelliJ IDEA" - "Tutorials" diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/Java17_blog_Blog_1280x720.jpg b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/Java17_blog_Blog_1280x720.jpg new file mode 100644 index 000000000..3f37a2a6f Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/Java17_blog_Blog_1280x720.jpg differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/Java17_blog_Blog_1280x720.png b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/Java17_blog_Blog_1280x720.png deleted file mode 100644 index cd55e7e36..000000000 Binary files a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/Java17_blog_Blog_1280x720.png and /dev/null differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/index.md b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/index.md index ba51880b5..89ea8a8cd 100644 --- a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/index.md +++ b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/index.md @@ -6,7 +6,7 @@ description: "In this article, I will limit the coverage of Java 17 to its langu canonical: "https://blog.jetbrains.com/idea/2021/09/java-17-and-intellij-idea/" authors: - "mala-gupta" -image: "Java17_blog_Blog_1280x720.png" +image: "Java17_blog_Blog_1280x720.jpg" categories: - "IntelliJ IDEA" - "JEPs" @@ -30,7 +30,7 @@ In this article, I will limit the coverage of Java 17 to its language features * **Pattern matching for switch statements** . Pattern matching for switch is introduced as a [preview feature](https://openjdk.java.net/jeps/12). As the name suggests, it adds patterns to the case labels in the switch statements *and* switch expressions. The type of the *selector expression* that can be used with a switch is expanded to any reference value. Also, case labels are no longer limited to constant values. It also helps replace if-else statement chains with switch, improving code readability. Let's start with pattern matching. -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/Java17_blog_Blog_1280x720.png) +![](Java17_blog_Blog_1280x720.jpg) Before we dive into pattern matching for switch, let's ensure we have the basic IntelliJ IDEA configuration set up. @@ -39,15 +39,15 @@ Before we dive into pattern matching for switch, let's ensure we have the basic Basic support for Java 17 is available in [IntelliJ IDEA 2021.2.1](https://blog.jetbrains.com/idea/2021/08/intellij-idea-2021-2-1/). More support is on the way in future IntelliJ IDEA releases. To use pattern matching for switch with Java 17, go to *ProjectSettings \| Project* , set the *Project SDK* to 17 and set *Project language level* to '*17 (Preview) - Pattern matching for switch*': -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-img1.png) +![](java17-img1-b43409f2.png) You can use any version of the JDK that has already been downloaded on your system, or download another version by clicking on '*Edit* ' and then selecting '*Add SDK \>* ', followed by '*Download JDK…*'. You can choose the JDK version to download from a list of vendors. On the modules tab, ensure the same language level is selected for the modules - *17 (Preview) - Pattern matching for switch*: -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-img2.png) +![](java17-img2-14a696a4.png) Once you select this, you might see the following pop-up which informs you that IntelliJ IDEA might discontinue the support for the Java preview language features in its next versions. Since a preview feature is not permanent (yet), and it is possible that it could change (or even be dropped) in a future Java release. -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-img3.png) +![](java17-img3-95384406.png) Ok, now we are ready to start with the Java 17 language features. @@ -90,12 +90,12 @@ void outputValueInUppercase(Object obj) { ``` In IntelliJ IDEA, you can invoke context-sensitive actions on the variable s (by using Alt+Enter or by clicking the light bulb icon) and selecting *Replace 's' with pattern variable* to use pattern matching for instanceof: -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-1.gif) +![](java17-1-9d24984d.gif) The scope of the pattern variable (a local variable) is limited to the `if`-block because it makes no sense to be able to access the pattern variable if the test fails. The simplicity of pattern matching of instanceof might be deceptive. If you are thinking it doesn't matter much since it only removes one line of code, think again. Removal of just one line of code can open up a number of possibilities in which you can modify your code. For example, aside from using pattern matching for instanceof, the following code merges `if` statements, introduces a pattern variable, and replaces a for loop with `Collection.removeIf()`: -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-2.gif) +![](java17-2-c3872a8c.webp) Now, let me brief you on the enhancements to the switch statement with the switch expressions (covered in detail [here](https://blog.jetbrains.com/idea/2019/02/java-12-and-intellij-idea), with Java 12, and [here](https://blog.jetbrains.com/idea/2019/11/java-13-and-intellij-idea/) with changes in Java 13). As I mentioned before, if you are already familiar with switch expressions, please feel free to jump to the section 'Welcome to pattern matching for switch'. @@ -133,7 +133,7 @@ public class Planet { ``` Let's see how switch expressions can help. The following gif demonstrates some of the benefits of switch expressions such as concise code, improved code semantics, no redundant break statements, exhaustive iteration, and more: -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-3.gif) +![](java17-3-8c636578.webp) With a basic understanding of pattern matching, pattern matching for instanceof, and switch expressions, let's look at what pattern matching is and why you need it? @@ -197,7 +197,7 @@ public class MyEarth { ``` Let's look at how we can use switch expressions and IntelliJ IDEA to make this code more concise: -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-4.gif) +![](java17-4-757733ff.webp) Here's the final (concise) code for reference: @@ -219,10 +219,10 @@ The power of this construct lies in how often it helps to reduce the cognitive c ### **Reducing cognitive complexity with pattern matching for switch** An if-else statement chain *seems* complex to read and understand – each condition should be *carefully* read together with its then-and-else code blocks. If we consider the if statement chain from the preceding section, it can be represented roughly as follows: -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-img4.png) +![](java17-img4-a009ddb2.png) Now let me represent the switch construct from the preceding section: -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-img5.png) +![](java17-img5-477031a4.png) Even by looking at both these images, the switch logic (though similar) looks simpler to read and understand. An if statement chain *seems* to represent a *long* , *complex* path, in which the next turn *seems* to be unknown. But this isn't the case with the switch construct. @@ -237,12 +237,12 @@ One approach has been to add a `@NotNull` annotation to the variable accepted by Of course, if you do not explicitly check for null values and the selector expression is null, it throws a `NullPointerExpression`. For backward compatibility, `null` selector expression won't match the default label. Now, you can define null as one of the valid case labels – so that you can define what to do if the selector expression is null. -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-5.gif) +![](java17-5-5971849a.gif) ### **Does IntelliJ IDEA convert your if-statement to a switch expression or a switch statement?** In the preceding example, the if-else construct was converted to a switch expression. However, if you'd have selected this conversion, *before* using pattern matching for instanceof, you would have got a switch statement, as shown in the following gif: -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-6.gif) +![](java17-6-5b920d1e.gif) Since the code block for if-else in the original code snippet defined multiple lines of code, it made sense to convert it to a switch statement rather than a switch expression. @@ -253,7 +253,7 @@ This brings us to another interesting question – what is the relation between A switch is classified as a statement or an expression depending on whether it returns a value or not. If it returns a value, it is a switch expression, otherwise a statement. Switch can also use either a colon or an arrow syntax. Interestingly, the switch style (statement or expression) and arrow/colon syntax are orthogonally related, as shown in the following image: -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-img6.png) +![](java17-img6-65957ef9.png) The preceding matrix is not just limited or specific to switch statements or expressions that define a pattern in their case labels. It applies to switch statements and expressions that define constants too. @@ -279,7 +279,7 @@ Pattern variables are local variables, which are casted and initialized when a t ### **When do missing break statements in a switch statement become a compilation error?** In the following example, the pattern variable `d` is limited to the case label `Discrimination`. When patterns, instead of constants, are used in case labels for switch statements or expressions, missing `break` statements is a compilation error because it can result in a default fall-through to a case label that did not pass the test: -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-7-1.gif) +![](java17-7-1-449e6d3b.gif) ### **Guarded patterns – conditions that follow test patterns** @@ -363,12 +363,12 @@ So far, the necessity of parenthesized patterns is very low. It's only to distin What happens if the types being checked in switch case labels have an inheritance relationship? You should check for the most specific case, prior to checking for the general type. Failing to do so would be a compilation error – as shown in the following image, when the code in method `getDamageForDifferentPollutionTypes` compares its method parameter `obj` with class `AirPollution` and `Pollution` (class `AirPollution` extends `Pollution`). -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-img7.png) +![](java17-img7-5835c7c1.png) An interesting observation is that with a similar logic it isn't a compilation error for an if-else statement. However, in such cases, IntelliJ IDEA would not offer you the option to convert it to a switch. You get the option, when you remove checking a superclass before its subclass, or, perhaps checking for unrelated types: -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-8.gif) +![](java17-8-a0834340.webp) ### **Should you care about handling all possible values for the selector expression in switch?** @@ -508,7 +508,7 @@ It can be time-consuming to look for if-else constructs in your code and check i With this inspection, you can convert *most* of the if-statements to switch. I stated 'most' of the if-statements and not 'all', for a reason. As demonstrated using a lot of examples in the preceding section, you'll notice that at times IntelliJ IDEA won't offer you an option to convert an if-else statement to switch, or it might not convert it the way you have assumed it would. This is due to missing adherence to the multiple rules we talked about in this blog. To run the inspection 'if can be replaced with switch', you can use the feature – Run inspection by name, using the shortcut Ctrl+Alt+Shift+I or ⌥⇧⌘I. Enter the inspection name, followed by selecting the scope and other options. The Problems Tool window will show you where you can apply this inspection. You can choose to apply or ignore the suggested changes as you browse the list in the Problems View Window. -![](https://blog.jetbrains.com/wp-content/uploads/2021/09/java17-9.gif) +![](java17-9-4944cd40.webp) We have talked a lot about the pattern matching for switch. Now let's cover sealed classes and interfaces. Added as a standard language feature in Java 17, they haven't changed from Java 16. diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-1-9d24984d.gif b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-1-9d24984d.gif new file mode 100644 index 000000000..e73fa374a Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-1-9d24984d.gif differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-2-c3872a8c.webp b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-2-c3872a8c.webp new file mode 100644 index 000000000..c7cb65252 Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-2-c3872a8c.webp differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-3-8c636578.webp b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-3-8c636578.webp new file mode 100644 index 000000000..a15b1ea8b Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-3-8c636578.webp differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-4-757733ff.webp b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-4-757733ff.webp new file mode 100644 index 000000000..e3d06bad4 Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-4-757733ff.webp differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-5-5971849a.gif b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-5-5971849a.gif new file mode 100644 index 000000000..50fabeff6 Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-5-5971849a.gif differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-6-5b920d1e.gif b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-6-5b920d1e.gif new file mode 100644 index 000000000..c5f716911 Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-6-5b920d1e.gif differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-7-1-449e6d3b.gif b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-7-1-449e6d3b.gif new file mode 100644 index 000000000..2ba528d83 Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-7-1-449e6d3b.gif differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-8-a0834340.webp b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-8-a0834340.webp new file mode 100644 index 000000000..1e5c1d642 Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-8-a0834340.webp differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-9-4944cd40.webp b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-9-4944cd40.webp new file mode 100644 index 000000000..fcbba1b26 Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-9-4944cd40.webp differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img1-b43409f2.png b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img1-b43409f2.png new file mode 100644 index 000000000..e704b5d66 Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img1-b43409f2.png differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img2-14a696a4.png b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img2-14a696a4.png new file mode 100644 index 000000000..2dcb1350b Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img2-14a696a4.png differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img3-95384406.png b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img3-95384406.png new file mode 100644 index 000000000..a7de14ab4 Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img3-95384406.png differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img4-a009ddb2.png b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img4-a009ddb2.png new file mode 100644 index 000000000..a0a66afc5 Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img4-a009ddb2.png differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img5-477031a4.png b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img5-477031a4.png new file mode 100644 index 000000000..0baa25d01 Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img5-477031a4.png differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img6-65957ef9.png b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img6-65957ef9.png new file mode 100644 index 000000000..c5facdec3 Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img6-65957ef9.png differ diff --git a/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img7-5835c7c1.png b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img7-5835c7c1.png new file mode 100644 index 000000000..af91e9d27 Binary files /dev/null and b/content/posts/2021/09/14/getting-started-with-java-17-and-intellij-idea/java17-img7-5835c7c1.png differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/add-project-to-the-maven-node-a007525c.png b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/add-project-to-the-maven-node-a007525c.png new file mode 100644 index 000000000..8425e7586 Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/add-project-to-the-maven-node-a007525c.png differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/index.md b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/index.md index 7de5bf312..5f6ba6f1b 100644 --- a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/index.md +++ b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/index.md @@ -19,13 +19,13 @@ frozen: false [Thorntail](https://thorntail.io/), originally [WildFly Swarm](https://wildfly-swarm.io/), is most suitable for packaging applications as *JAR* , *WAR,* or *EAR* files. The most important value is in the functional agility the Thorntail provides. You can start with the stripped down version of Thorntail, adding the required parts and application code on top. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/09/jvm-microservice.png" class="aligncenter is-resized" alt="microservices" width="329" height="411" >}} +{{< img src="jvm-microservice-8f10b230.png" class="aligncenter is-resized" alt="microservices" width="329" height="411" >}} Below we will describe how to build and deploy Thorntail based applications using Fat, Thin and Skinny approaches. The application will be packaged in the Jar/War format automatically with the help of [Builder add-ons](https://github.com/jelastic-jps/thorntail) prepared by Jelastic. The topology will consist of Maven build node and JVM containers for running microservices. ## Thorntail Fat Jar Builder Installation -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/09/instal-thorntail-fat-jar-builder-e1536655546281.png" class="aligncenter is-resized" alt="wildfly swarm" width="524" height="350" >}} +{{< img src="instal-thorntail-fat-jar-builder-e153665-61cc1da9.jpg" class="aligncenter is-resized" alt="wildfly swarm" width="524" height="350" >}} To get started, log in to Jelastic dashboard, find the *Thorntail Fat* *Jar Builder* in the **Marketplace** and click **Install**. @@ -33,72 +33,72 @@ Or you can import *Thorntail Fat* [JPS](https://docs.jelastic.com/jps/) manifest -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/09/thorntail-fat-jps-manifest-e1536657417543.png" class="aligncenter is-resized" alt="maven java" width="525" height="377" >}} +{{< img src="thorntail-fat-jps-manifest-e153665741754-bb1bdb9d.png" class="aligncenter is-resized" alt="maven java" width="525" height="377" >}} To do that, open the **Import** window, paste the link and confirm installation by clicking **Import** button in the opened window. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/09/install-fat-jar-package-e1536655468391.png" class="aligncenter is-resized" alt="jar war file" width="461" height="381" >}} +{{< img src="install-fat-jar-package-e1536655468391-c9fe2d84.jpg" class="aligncenter is-resized" alt="jar war file" width="461" height="381" >}} If required, change installation settings such as environment name or GitHub repository link to a custom *Thorntail Fat* project. Then press **Install** *.* -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/09/open-fat-jar-builder-in-browser-e1536655748988.png" class="aligncenter is-resized" alt="jar war file" width="486" height="247" >}} +{{< img src="open-fat-jar-builder-in-browser-e1536655-8cfbabe9.png" class="aligncenter is-resized" alt="jar war file" width="486" height="247" >}} When the installation and building of the project are completed, a corresponding message appears. You still need to wait a few minutes for deploy to be finished (feel free to track the process in *Tasks* panel). In the default implementation, it is done under **api/greeting**context. -![wildfly swarm plugin](https://jelastic.com/blog/wp-content/uploads/2018/09/wildfly-swarm-fat-jar-greeting.png) +![wildfly swarm plugin](wildfly-swarm-fat-jar-greeting-34221fbc.png) Afterward, you can make sure, that application is up and running by pressing **Open in browser** button. ## Thorntail Skinny Jar Builder Installation -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/09/instal-thorntail-skinny-jar-builder.png" class="aligncenter is-resized" alt="build jar" width="599" height="401" >}} +{{< img src="instal-thorntail-skinny-jar-builder-a64541d3.png" class="aligncenter is-resized" alt="build jar" width="599" height="401" >}} Find the *Thorntail (WildFly Swarm) Skinny* *Jar Builder* in the **Marketplace** and click **Install**. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/09/thorntail-skinny-jps-manifest.png" class="aligncenter is-resized" alt="microservice application" width="525" height="322" >}} +{{< img src="thorntail-skinny-jps-manifest-eeb4873c.png" class="aligncenter is-resized" alt="microservice application" width="525" height="322" >}} Or import *Thorntail (WildFly Swarm) Skinny* JPS manifest using GitHub link: -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/09/install-skinny-jar-package.png" class="aligncenter is-resized" alt="build jar" width="525" height="456" >}} +{{< img src="install-skinny-jar-package-d413f91f.png" class="aligncenter is-resized" alt="build jar" width="525" height="456" >}} If required, change installation settings such as environment name or GitHub repository link to a custom *Thorntail Skinny* project*.* Then press **Install** *.* -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/09/open-skinny-jar-builder-in-browser.png" class="aligncenter is-resized" alt="wildfly swarm" width="403" height="224" >}} +{{< img src="open-skinny-jar-builder-in-browser-168f173c.png" class="aligncenter is-resized" alt="wildfly swarm" width="403" height="224" >}} When the installation and building of the project are completed, a corresponding message appears. You still need to wait a few minutes for deploy to be finished (feel free to track the process in *Tasks* panel). In the default implementation, it is done under **api/greeting**context. -![build jar](https://jelastic.com/blog/wp-content/uploads/2018/09/wildfly-swarm-skinny-jar-greeting.png) +![build jar](wildfly-swarm-skinny-jar-greeting-b1225ba5.png) Afterward, you can make sure, that application is up and running by pressing **Open in browser** button. ## Thorntail Thin War Builder Installation -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/09/instal-thorntail-thin-jar-builder.png" class="aligncenter is-resized" alt="thin jar" width="597" height="397" >}} +{{< img src="instal-thorntail-thin-jar-builder-9eead1f8.png" class="aligncenter is-resized" alt="thin jar" width="597" height="397" >}} Find the *Thorntail (WildFly Swarm) Thin* *War Builder* in the **Marketplace** and click **Install**. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/09/thorntail-thin-jps-manifest-e1536657454702.png" class="aligncenter is-resized" alt="build web application" width="525" height="326" >}} +{{< img src="thorntail-thin-jps-manifest-e15366574547-4d32e401.jpg" class="aligncenter is-resized" alt="build web application" width="525" height="326" >}} Or you can import *Thorntail(WildFly Swarm) Thin* JPS manifest using GitHub link: -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/09/install-thin-war-package.png" class="aligncenter is-resized" alt="thin jar" width="534" height="443" >}} +{{< img src="install-thin-war-package-7f74b9c1.png" class="aligncenter is-resized" alt="thin jar" width="534" height="443" >}} If required, change installation settings such as environment name or GitHub repository link to a custom *Thorntail Thin* project*.* Then press **Install** *.* -![maven app](https://jelastic.com/blog/wp-content/uploads/2018/09/open-thin-war-builder-in-browser.png) +![maven app](open-thin-war-builder-in-browser-5e4c7c0d.png) When the installation and building of the project are completed, a corresponding message appears. You still need to wait a few minutes for deploy to be finished (feel free to track the process in *Tasks* panel). In the default implementation, it is done under **api/greeting**context. -![build war](https://jelastic.com/blog/wp-content/uploads/2018/09/wildfly-swarm-thin-war-greeting.png) +![build war](wildfly-swarm-thin-war-greeting-bfb5a932.png) Afterward, you can make sure, that application is up and running by pressing **Open in browser** button. ## Multiple Thorntail Projects with Microservices -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/09/multiple-thorntail-projects-with-microservices.png" class="aligncenter is-resized" alt="thorntail wildfly swarm" width="683" height="341" >}} +{{< img src="multiple-thorntail-projects-with-microse-98dd4126.png" class="aligncenter is-resized" alt="thorntail wildfly swarm" width="683" height="341" >}} You can use just created *Maven* node for building extra projects and deploying them to different environments to get a set of distributed microservices. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/09/separate-environment-with-java-engine.png" class="aligncenter is-resized" alt="thorntail wildfly swarm" width="732" height="454" >}} +{{< img src="separate-environment-with-java-engine-03b6620c.jpg" class="aligncenter is-resized" alt="thorntail wildfly swarm" width="732" height="454" >}} First of all, create a separate environment with *Java Engine*. -![maven java](https://jelastic.com/blog/wp-content/uploads/2018/09/add-project-to-the-maven-node.png) +![maven java](add-project-to-the-maven-node-a007525c.png) Then click **Add Project** next to the *Maven* node in the initial environment. diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/instal-thorntail-fat-jar-builder-e153665-61cc1da9.jpg b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/instal-thorntail-fat-jar-builder-e153665-61cc1da9.jpg new file mode 100644 index 000000000..bb54c811b Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/instal-thorntail-fat-jar-builder-e153665-61cc1da9.jpg differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/instal-thorntail-skinny-jar-builder-a64541d3.png b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/instal-thorntail-skinny-jar-builder-a64541d3.png new file mode 100644 index 000000000..57b10875d Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/instal-thorntail-skinny-jar-builder-a64541d3.png differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/instal-thorntail-thin-jar-builder-9eead1f8.png b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/instal-thorntail-thin-jar-builder-9eead1f8.png new file mode 100644 index 000000000..f0f43287b Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/instal-thorntail-thin-jar-builder-9eead1f8.png differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/install-fat-jar-package-e1536655468391-c9fe2d84.jpg b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/install-fat-jar-package-e1536655468391-c9fe2d84.jpg new file mode 100644 index 000000000..4d8f685d9 Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/install-fat-jar-package-e1536655468391-c9fe2d84.jpg differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/install-skinny-jar-package-d413f91f.png b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/install-skinny-jar-package-d413f91f.png new file mode 100644 index 000000000..c58066b78 Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/install-skinny-jar-package-d413f91f.png differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/install-thin-war-package-7f74b9c1.png b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/install-thin-war-package-7f74b9c1.png new file mode 100644 index 000000000..e7a6119cf Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/install-thin-war-package-7f74b9c1.png differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/jvm-microservice-8f10b230.png b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/jvm-microservice-8f10b230.png new file mode 100644 index 000000000..514324941 Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/jvm-microservice-8f10b230.png differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/multiple-thorntail-projects-with-microse-98dd4126.png b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/multiple-thorntail-projects-with-microse-98dd4126.png new file mode 100644 index 000000000..b8301cb0a Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/multiple-thorntail-projects-with-microse-98dd4126.png differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/open-fat-jar-builder-in-browser-e1536655-8cfbabe9.png b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/open-fat-jar-builder-in-browser-e1536655-8cfbabe9.png new file mode 100644 index 000000000..fd99dfb5b Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/open-fat-jar-builder-in-browser-e1536655-8cfbabe9.png differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/open-skinny-jar-builder-in-browser-168f173c.png b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/open-skinny-jar-builder-in-browser-168f173c.png new file mode 100644 index 000000000..8020c12fa Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/open-skinny-jar-builder-in-browser-168f173c.png differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/open-thin-war-builder-in-browser-5e4c7c0d.png b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/open-thin-war-builder-in-browser-5e4c7c0d.png new file mode 100644 index 000000000..33a8822ea Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/open-thin-war-builder-in-browser-5e4c7c0d.png differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/separate-environment-with-java-engine-03b6620c.jpg b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/separate-environment-with-java-engine-03b6620c.jpg new file mode 100644 index 000000000..d868cf4a2 Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/separate-environment-with-java-engine-03b6620c.jpg differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/thorntail-fat-jps-manifest-e153665741754-bb1bdb9d.png b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/thorntail-fat-jps-manifest-e153665741754-bb1bdb9d.png new file mode 100644 index 000000000..15101d972 Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/thorntail-fat-jps-manifest-e153665741754-bb1bdb9d.png differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/thorntail-skinny-jps-manifest-eeb4873c.png b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/thorntail-skinny-jps-manifest-eeb4873c.png new file mode 100644 index 000000000..4ae94468c Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/thorntail-skinny-jps-manifest-eeb4873c.png differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/thorntail-thin-jps-manifest-e15366574547-4d32e401.jpg b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/thorntail-thin-jps-manifest-e15366574547-4d32e401.jpg new file mode 100644 index 000000000..796726296 Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/thorntail-thin-jps-manifest-e15366574547-4d32e401.jpg differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/wildfly-swarm-fat-jar-greeting-34221fbc.png b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/wildfly-swarm-fat-jar-greeting-34221fbc.png new file mode 100644 index 000000000..cf3621ab7 Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/wildfly-swarm-fat-jar-greeting-34221fbc.png differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/wildfly-swarm-skinny-jar-greeting-b1225ba5.png b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/wildfly-swarm-skinny-jar-greeting-b1225ba5.png new file mode 100644 index 000000000..46a42061e Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/wildfly-swarm-skinny-jar-greeting-b1225ba5.png differ diff --git a/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/wildfly-swarm-thin-war-greeting-bfb5a932.png b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/wildfly-swarm-thin-war-greeting-bfb5a932.png new file mode 100644 index 000000000..6535a7884 Binary files /dev/null and b/content/posts/2021/09/22/thorntail-fat-thin-skinny-java-microservices/wildfly-swarm-thin-war-greeting-bfb5a932.png differ diff --git a/content/posts/2021/09/28/the-debugger-checklist-part-ii/87OTJS1zH-389e8cd6.png b/content/posts/2021/09/28/the-debugger-checklist-part-ii/87OTJS1zH-389e8cd6.png new file mode 100644 index 000000000..8af36eaa6 Binary files /dev/null and b/content/posts/2021/09/28/the-debugger-checklist-part-ii/87OTJS1zH-389e8cd6.png differ diff --git a/content/posts/2021/09/28/the-debugger-checklist-part-ii/CQNO-Z1Ef-00a44ac4.png b/content/posts/2021/09/28/the-debugger-checklist-part-ii/CQNO-Z1Ef-00a44ac4.png new file mode 100644 index 000000000..9d00bb874 Binary files /dev/null and b/content/posts/2021/09/28/the-debugger-checklist-part-ii/CQNO-Z1Ef-00a44ac4.png differ diff --git a/content/posts/2021/09/28/the-debugger-checklist-part-ii/IrVcETgk5-58c3d0f7.jpeg b/content/posts/2021/09/28/the-debugger-checklist-part-ii/IrVcETgk5-58c3d0f7.jpeg new file mode 100644 index 000000000..f10e68009 Binary files /dev/null and b/content/posts/2021/09/28/the-debugger-checklist-part-ii/IrVcETgk5-58c3d0f7.jpeg differ diff --git a/content/posts/2021/09/28/the-debugger-checklist-part-ii/index.md b/content/posts/2021/09/28/the-debugger-checklist-part-ii/index.md index 4b4e74040..93e6a6481 100644 --- a/content/posts/2021/09/28/the-debugger-checklist-part-ii/index.md +++ b/content/posts/2021/09/28/the-debugger-checklist-part-ii/index.md @@ -44,7 +44,7 @@ I'll try to get into more of these sorts of tricks in a future "tips and tricks" ### The Simplest Assumptions -![If something doesn't make sense. One of your assumptions has to wrong, because if something doesn't make sense then it can't be real. But what if the faulty assumption is that it's real. - House](https://cdn.hashnode.com/res/hashnode/image/upload/v1632369682209/IrVcETgk5.jpeg) +![If something doesn't make sense. One of your assumptions has to wrong, because if something doesn't make sense then it can't be real. But what if the faulty assumption is that it's real. - House](IrVcETgk5-58c3d0f7.jpeg) (image source: ) @@ -85,7 +85,7 @@ Assuming you can, try overriding it within your breakpoint by setting a value of If this isn't helping, try identifying specific fields that might be problematic. Most debuggers will let you place a breakpoint on the field in order to watch modifications to said field… I used that feature a couple of times while consulting and people were always surprised you can do that... -![Field Breakpoint](https://cdn.hashnode.com/res/hashnode/image/upload/v1632370150204/87OTJS1zH.png) +![Field Breakpoint](87OTJS1zH-389e8cd6.png) In IntelliJ the icon looks different for a field breakpoint. But it's a breakpoint like any other, you can apply a condition to it and see the stack etc. @@ -103,7 +103,7 @@ You can also get a thread dump during a breakpoint, that's a feature of pretty m Specifically in IntelliJ/IDEA I recommend right clicking the debug tab and enabling the thread view. Then enabling thread groups by right clicking within the tab and selecting `Customize Thread View` like this: -![Customize Thread View in IntelliJ/IDEA](https://cdn.hashnode.com/res/hashnode/image/upload/v1632370285245/CQNO-Z1Ef.png) +![Customize Thread View in IntelliJ/IDEA](CQNO-Z1Ef-00a44ac4.png) It provides a much "cleaner" view of the threads as a hierarchy instead of the default look in IntelliJ which is better geared towards single thread debugging. diff --git a/content/posts/2021/10/01/understanding-apache-maven-part-3-maven-coordinates-pom-inheritance/index.md b/content/posts/2021/10/01/understanding-apache-maven-part-3-maven-coordinates-pom-inheritance/index.md index 7bd7fb3d3..4949afb1f 100644 --- a/content/posts/2021/10/01/understanding-apache-maven-part-3-maven-coordinates-pom-inheritance/index.md +++ b/content/posts/2021/10/01/understanding-apache-maven-part-3-maven-coordinates-pom-inheritance/index.md @@ -6,7 +6,7 @@ description: "An explanation of dependency coordinates and \"distinguishers\" as canonical: "https://cguntur.me/2020/05/26/understanding-apache-maven-part-3/" authors: - "c-guntur" -image: "https://cgunturme.files.wordpress.com/2020/05/mavenhierarchies.png?w=1024" +image: "mavenhierarchies-8c37200a.png" categories: - "Maven" related_posts: @@ -88,7 +88,7 @@ A combination of GAV coordinates and distinguishers can be used to locate the ex ## POM Hierarchies This section describes the hierarchy in Maven POMs. -![](https://cgunturme.files.wordpress.com/2020/05/mavenhierarchies.png?w=1024) +![](mavenhierarchies-8c37200a.png) ### Parent POM diff --git a/content/posts/2021/10/01/understanding-apache-maven-part-3-maven-coordinates-pom-inheritance/mavenhierarchies-8c37200a.png b/content/posts/2021/10/01/understanding-apache-maven-part-3-maven-coordinates-pom-inheritance/mavenhierarchies-8c37200a.png new file mode 100644 index 000000000..59a84f809 Binary files /dev/null and b/content/posts/2021/10/01/understanding-apache-maven-part-3-maven-coordinates-pom-inheritance/mavenhierarchies-8c37200a.png differ diff --git a/content/posts/2021/10/04/book-review-quarkus-for-spring-developers/FEvZPayj2pPNSZjXu6QMGef4AEQnnLT04_UGZ_rT-a8e9081b.jpg b/content/posts/2021/10/04/book-review-quarkus-for-spring-developers/FEvZPayj2pPNSZjXu6QMGef4AEQnnLT04_UGZ_rT-a8e9081b.jpg new file mode 100644 index 000000000..295a4fb14 Binary files /dev/null and b/content/posts/2021/10/04/book-review-quarkus-for-spring-developers/FEvZPayj2pPNSZjXu6QMGef4AEQnnLT04_UGZ_rT-a8e9081b.jpg differ diff --git a/content/posts/2021/10/04/book-review-quarkus-for-spring-developers/index.md b/content/posts/2021/10/04/book-review-quarkus-for-spring-developers/index.md index 2b5ec753f..c33a122e0 100644 --- a/content/posts/2021/10/04/book-review-quarkus-for-spring-developers/index.md +++ b/content/posts/2021/10/04/book-review-quarkus-for-spring-developers/index.md @@ -38,7 +38,7 @@ The book provides many annotated and numbered examples of how common development Where applicable, the authors make side-by-side tables that can steer developers towards where to look for certain capabilities: -![](https://lh6.googleusercontent.com/FEvZPayj2pPNSZjXu6QMGef4AEQnnLT04_UGZ_rTVSpsD0MMxZb8zFnHkpbEvzUkKwgNX6VFd_Uxy6qcETCJfPU53kNXl-4cPjyVmvQtKT8YBvcYNtzm2X98Mamc10FxX_iMl784=s0) +![](FEvZPayj2pPNSZjXu6QMGef4AEQnnLT04_UGZ_rT-a8e9081b.jpg) The book additionally explains how developers can use [an optional automated migration tool](https://developers.redhat.com/products/mta/overview) that analyzes existing Spring applications, using analysis techniques that narrow down specifically which Quarkus features can help in which components. @@ -56,7 +56,7 @@ The chapter articulates the way that Quarkus' support for reactive programming s Chapter 5 on Event Driven Services discusses the role of libraries like Spring Event Handling (with **@ServiceActivator)** compared against Quarkus Event Handler (with **@ConsumeEvent**). -![](https://lh3.googleusercontent.com/vyTdejqa7k2ElQKEvjm6iVZCDrnTx4QzcLR8DbVaFqqn3SX_R3-kplx4abGh3ZqCmptzD8pASEDIPvuDKv5KnFZhP6LGZZ8DDCuZyt1TEa2YNXpcv4DuMLa24kuPZEvPlBv2Dh6H=s0) +![](vyTdejqa7k2ElQKEvjm6iVZCDrnTx4QzcLR8DbVa-5f09bbec.jpg) ## Focus on Details and Testing diff --git a/content/posts/2021/10/04/book-review-quarkus-for-spring-developers/vyTdejqa7k2ElQKEvjm6iVZCDrnTx4QzcLR8DbVa-5f09bbec.jpg b/content/posts/2021/10/04/book-review-quarkus-for-spring-developers/vyTdejqa7k2ElQKEvjm6iVZCDrnTx4QzcLR8DbVa-5f09bbec.jpg new file mode 100644 index 000000000..15b73d00e Binary files /dev/null and b/content/posts/2021/10/04/book-review-quarkus-for-spring-developers/vyTdejqa7k2ElQKEvjm6iVZCDrnTx4QzcLR8DbVa-5f09bbec.jpg differ diff --git a/content/posts/2021/10/05/understanding-stack-traces-and-debugging-them-further/W16VFVW_0r-e8271247.png b/content/posts/2021/10/05/understanding-stack-traces-and-debugging-them-further/W16VFVW_0r-e8271247.png new file mode 100644 index 000000000..9bd59aa6c Binary files /dev/null and b/content/posts/2021/10/05/understanding-stack-traces-and-debugging-them-further/W16VFVW_0r-e8271247.png differ diff --git a/content/posts/2021/10/05/understanding-stack-traces-and-debugging-them-further/index.md b/content/posts/2021/10/05/understanding-stack-traces-and-debugging-them-further/index.md index 703837dcb..eb5088768 100644 --- a/content/posts/2021/10/05/understanding-stack-traces-and-debugging-them-further/index.md +++ b/content/posts/2021/10/05/understanding-stack-traces-and-debugging-them-further/index.md @@ -42,11 +42,11 @@ That `NullPointerException` probably happened due to a null in the list. Assumin This isn't hard to find out, let's assume that the List is of the `ArrayList` type, in that case just open the `ArrayList` class (which you can do with Control-O in IntelliJ) and place a conditional breakpoint on the `add()` method. You can test if the value is null and that will stop at a breakpoint if someone tries to add null to the list. -![Check for null condition](https://cdn.hashnode.com/res/hashnode/image/upload/v1632981604570/sDVYkrmcU.png) +![Check for null condition](sDVYkrmcU-2a053627.png) Now this won't catch all the cases of `null` sneaking into the list. It can do so via the stream API, via `addAll()` and a couple of other methods. The nice thing is that we can grab pretty much any one of those methods: -![Grabbing addAll Calls](https://cdn.hashnode.com/res/hashnode/image/upload/v1632982095589/nDT6BmG5m.png) +![Grabbing addAll Calls](nDT6BmG5m-a0068cf6.jpg) Since `addAll()` accepts a `Collection` we can use the standard `contains()` method to check if we have a `null` element in the `Collection` and if so stop. @@ -58,7 +58,7 @@ So we press continue and the breakpoint hits again and again and again. Each tim So there are several ways around this problem. The most ideal one is to avoid that specific list. If you have a way of recognizing that list e.g. a global instance or the first element might be a specific value you can simply augment the original conditional breakpoint e.g. in this case we assume the first element in the `null` is OK list is 77 in which case this condition will workaround the problem: -![Hacking the Exception](https://cdn.hashnode.com/res/hashnode/image/upload/v1632982223058/W16VFVW_0r.png) +![Hacking the Exception](W16VFVW_0r-e8271247.png) This isn't ideal but it works around the problem assuming it's localized enough. diff --git a/content/posts/2021/10/05/understanding-stack-traces-and-debugging-them-further/nDT6BmG5m-a0068cf6.jpg b/content/posts/2021/10/05/understanding-stack-traces-and-debugging-them-further/nDT6BmG5m-a0068cf6.jpg new file mode 100644 index 000000000..d32e74e71 Binary files /dev/null and b/content/posts/2021/10/05/understanding-stack-traces-and-debugging-them-further/nDT6BmG5m-a0068cf6.jpg differ diff --git a/content/posts/2021/10/05/understanding-stack-traces-and-debugging-them-further/sDVYkrmcU-2a053627.png b/content/posts/2021/10/05/understanding-stack-traces-and-debugging-them-further/sDVYkrmcU-2a053627.png new file mode 100644 index 000000000..72f00bf1d Binary files /dev/null and b/content/posts/2021/10/05/understanding-stack-traces-and-debugging-them-further/sDVYkrmcU-2a053627.png differ diff --git a/content/posts/2021/10/08/understanding-apache-maven-part-4-maven-lifecycle/index.md b/content/posts/2021/10/08/understanding-apache-maven-part-4-maven-lifecycle/index.md index 8d0038d90..bb1442ae5 100644 --- a/content/posts/2021/10/08/understanding-apache-maven-part-4-maven-lifecycle/index.md +++ b/content/posts/2021/10/08/understanding-apache-maven-part-4-maven-lifecycle/index.md @@ -6,7 +6,7 @@ description: "In Part 4 of the series, a walkthrough of the Apache Maven lifecyc canonical: "https://cguntur.me/2020/05/29/understanding-apache-maven-part-4/" authors: - "c-guntur" -image: "https://cgunturme.files.wordpress.com/2020/05/mavenlifecycles.png?w=1024" +image: "mavenlifecycles-a6d7fafd.png" categories: - "Maven" related_posts: @@ -35,7 +35,7 @@ Lifecycles in Maven comprise of **phases**. Each standard lifecycle is made up o **Phases are sequentially executed**. Invoking a phase **implies all prior phases in that lifecycle are executed**. -![A tree structure of the standard lifecycles and phases in each.](https://cgunturme.files.wordpress.com/2020/05/mavenlifecycles.png?w=1024) Maven standard lifecycles and their respective phases +![A tree structure of the standard lifecycles and phases in each.](mavenlifecycles-a6d7fafd.png) Maven standard lifecycles and their respective phases ## Exploring phases @@ -158,6 +158,6 @@ Convention standards for plugin prefixes: ## Something Something – Personal Learning Here is a **very crude and unscientific pictorial** of the my understanding of lifecycles, phases, goals and plugins. This is not meant to be accurate in terms of either human lifecycles or in explaining maven's lifecycles. This picture is absolutely a personal means of illustrating how I went about learning these concepts. -![Possibly inaccurate analogy of a young human lifecycle with phases such as terrible twos and adoloscence, with goals associated with each and soe external influences as plugins.](https://cgunturme.files.wordpress.com/2020/05/mavenhumananalogy.png?w=1024) Highly unscientific, possibly inaccurate lifecycle of a young human from Age 0 to Age 18. Time ranges also not distributed proportionally. +![Possibly inaccurate analogy of a young human lifecycle with phases such as terrible twos and adoloscence, with goals associated with each and soe external influences as plugins.](mavenhumananalogy-90d44713.png) Highly unscientific, possibly inaccurate lifecycle of a young human from Age 0 to Age 18. Time ranges also not distributed proportionally. That's a wrap on this article. Have fun with Maven! diff --git a/content/posts/2021/10/08/understanding-apache-maven-part-4-maven-lifecycle/mavenhumananalogy-90d44713.png b/content/posts/2021/10/08/understanding-apache-maven-part-4-maven-lifecycle/mavenhumananalogy-90d44713.png new file mode 100644 index 000000000..d2ebed69f Binary files /dev/null and b/content/posts/2021/10/08/understanding-apache-maven-part-4-maven-lifecycle/mavenhumananalogy-90d44713.png differ diff --git a/content/posts/2021/10/08/understanding-apache-maven-part-4-maven-lifecycle/mavenlifecycles-a6d7fafd.png b/content/posts/2021/10/08/understanding-apache-maven-part-4-maven-lifecycle/mavenlifecycles-a6d7fafd.png new file mode 100644 index 000000000..b6a0f9725 Binary files /dev/null and b/content/posts/2021/10/08/understanding-apache-maven-part-4-maven-lifecycle/mavenlifecycles-a6d7fafd.png differ diff --git a/content/posts/2021/10/13/getting-started-with-jakarta-ee-9-jakarta-ee-9-1/index.md b/content/posts/2021/10/13/getting-started-with-jakarta-ee-9-jakarta-ee-9-1/index.md index a5638a9a7..73faaec2d 100644 --- a/content/posts/2021/10/13/getting-started-with-jakarta-ee-9-jakarta-ee-9-1/index.md +++ b/content/posts/2021/10/13/getting-started-with-jakarta-ee-9-jakarta-ee-9-1/index.md @@ -7,7 +7,7 @@ canonical: "https://blog.payara.fish/getting-started-with-jakarta-ee-9-jakarta-e authors: - "jadon-ortlepp" - "rudy-de-busscher" -image: "jakarta-ee-9.1.png" +image: "jakarta-ee-9.1.jpg" categories: - "Jakarta EE" related_posts: diff --git a/content/posts/2021/10/13/getting-started-with-jakarta-ee-9-jakarta-ee-9-1/jakarta-ee-9.1.jpg b/content/posts/2021/10/13/getting-started-with-jakarta-ee-9-jakarta-ee-9-1/jakarta-ee-9.1.jpg new file mode 100644 index 000000000..a211a062c Binary files /dev/null and b/content/posts/2021/10/13/getting-started-with-jakarta-ee-9-jakarta-ee-9-1/jakarta-ee-9.1.jpg differ diff --git a/content/posts/2021/10/13/getting-started-with-jakarta-ee-9-jakarta-ee-9-1/jakarta-ee-9.1.png b/content/posts/2021/10/13/getting-started-with-jakarta-ee-9-jakarta-ee-9-1/jakarta-ee-9.1.png deleted file mode 100644 index 046502a17..000000000 Binary files a/content/posts/2021/10/13/getting-started-with-jakarta-ee-9-jakarta-ee-9-1/jakarta-ee-9.1.png and /dev/null differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/01-415x1024-37302437.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/01-415x1024-37302437.png new file mode 100644 index 000000000..22ec3b8bb Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/01-415x1024-37302437.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/2-clones-ef6edb60.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/2-clones-ef6edb60.png new file mode 100644 index 000000000..dcd0b8bc0 Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/2-clones-ef6edb60.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/GlassFish-and-Payara-clustering-e10299b3.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/GlassFish-and-Payara-clustering-e10299b3.png new file mode 100644 index 000000000..a823a27b2 Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/GlassFish-and-Payara-clustering-e10299b3.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/cloning-6610f32c.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/cloning-6610f32c.png new file mode 100644 index 000000000..29cc26eeb Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/cloning-6610f32c.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/clusterjsp-app1-fa173804.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/clusterjsp-app1-fa173804.png new file mode 100644 index 000000000..da979e560 Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/clusterjsp-app1-fa173804.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/gf-properties1-1024x515-d8084537.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/gf-properties1-1024x515-d8084537.png new file mode 100644 index 000000000..53c4da7ae Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/gf-properties1-1024x515-d8084537.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/glassfish-admin-gms1-ac07c4f5.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/glassfish-admin-gms1-ac07c4f5.png new file mode 100644 index 000000000..7d53f95c9 Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/glassfish-admin-gms1-ac07c4f5.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/glassfish-and-payara-wizard-topology-102-2e38fd2b.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/glassfish-and-payara-wizard-topology-102-2e38fd2b.png new file mode 100644 index 000000000..afccfad66 Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/glassfish-and-payara-wizard-topology-102-2e38fd2b.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/glassfish-cluster1-1f1d375e.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/glassfish-cluster1-1f1d375e.png new file mode 100644 index 000000000..563e01ee6 Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/glassfish-cluster1-1f1d375e.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/glassfish-oib-a57e11b2.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/glassfish-oib-a57e11b2.png new file mode 100644 index 000000000..49f61a8bd Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/glassfish-oib-a57e11b2.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/index.md b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/index.md index e1b1a783a..c61e6498c 100644 --- a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/index.md +++ b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/index.md @@ -19,7 +19,7 @@ related_posts: frozen: false --- -{{< img src="https://jelastic.com/blog/wp-content/uploads/2021/09/GlassFish-and-Payara-clustering.png" class="alignleft is-resized" width="400" height="216" >}} +{{< img src="GlassFish-and-Payara-clustering-e10299b3.png" class="alignleft is-resized" width="400" height="216" >}} Ensuring trouble-proof 24/7 service delivery is among one of the most discussed areas in cloud hosting for the last few years. And the very obvious and commonly used solution here is building a clustered infrastructure for your project. @@ -34,11 +34,11 @@ So, the article below describes how the Glassfish and Payara auto-clustering wor In the most general sense, any "clusterized solution" can be defined as a set of interconnected instances that run the same stack and operate the same data. In other words, this means that the corresponding server should be [horizontally scaled](https://docs.jelastic.com/app-server-scaling) and share user sessions. Starting with the Jelastic 5.5.3 version, a new **Auto-Clustering** feature is introduced allowing to enable clusterization of the GlassFish and Payara instances directly within the topology wizard: -![auto clustering in cloud](https://jelastic.com/blog/wp-content/uploads/2021/09/glassfish-cluster1.png) +![auto clustering in cloud](glassfish-cluster1-1f1d375e.png) Choose either *GlassFish* or *Payara* application server on the **Java** tab of the wizard. Then, in the central part, locate and enable the appropriate ***Auto-Clustering*** switcher. Configure the remaining settings up to your need including [horizontal scaling](https://docs.jelastic.com/horizontal-scaling) to get a reliable solution from the start. -{{< img src="https://jelastic.com/blog/wp-content/uploads/2021/09/01-415x1024.png" class="aligncenter is-resized" width="179" height="442" >}} +{{< img src="01-415x1024-37302437.png" class="aligncenter is-resized" width="179" height="442" >}} **Tip:** The ***Auto-Clustering*** feature is also available for some other software templates (e.g. [*MySQL*](https://jelastic.com/blog/mysql-mariadb-database-auto-clustering-cloud-hosting/), [*MariaDB*](https://jelastic.com/blog/mysql-mariadb-database-auto-clustering-cloud-hosting/)*,* [PostgreSQL](https://jelastic.com/blog/postgresql-auto-clustering-master-slave-replication/), [Tomcat/TomEE](https://jelastic.com/blog/tomcat-tomee-clustering-automation/), [WildFly](https://jelastic.com/blog/wildfly-managed-domain-automatic-clustering-scaling/), [Shared Storage](https://docs.jelastic.com/shared-storage-container/), [MongoDB](https://jelastic.com/blog/mongodb-auto-clustering/) and [*Couchbase*](https://docs.jelastic.com/auto-clustering/#couchbase)). @@ -51,7 +51,7 @@ For production, clustering is virtually a mandatory option to ensure your applic * administration server is linked to all workers within the application server layer with the *DAS* alias hostname, which can be used by workers for further interaction * to enable proper nodes connectivity and control, the system automatically generates an SSH keypair for DAS node and places it within a [volume](https://docs.jelastic.com/docker-volumes), mounted to all the rest of cluster instances -{{< img src="https://jelastic.com/blog/wp-content/uploads/2018/11/glassfish-and-payara-wizard-topology-1024x445.png" class="is-resized" alt="auto clustering topology" width="828" height="360" >}} +{{< img src="glassfish-and-payara-wizard-topology-102-2e38fd2b.png" class="is-resized" alt="auto clustering topology" width="828" height="360" >}} ## Session Replication Implementation @@ -62,10 +62,10 @@ Together with automatically configured sticky sessions mechanism on the [load ba ### GlassFish Session Replication with GMS Within the GlassFish cluster, session replication is powered by the Group Management Service ([**GMS**](https://docs.oracle.com/cd/E19879-01/821-0182/gjfnl/index.html)) – a built-in application server component that ensures failover protection, in-memory replication, transaction and timer services for cluster instances. -![glassfish session replication](https://jelastic.com/blog/wp-content/uploads/2021/09/glassfish-admin-gms1.png) +![glassfish session replication](glassfish-admin-gms1-ac07c4f5.png) GMS uses [**TCP** without multicast](https://docs.oracle.com/cd/E26576_01/doc.312/e24934/clusters.htm#GSHAG485) to detect cluster instances. When a new node is joining a GlassFish cluster, the system re-detects all running workers and DAS node - such [auto discovery](https://docs.oracle.com/cd/E26576_01/doc.312/e24934/clusters.htm#CHDIGFCG) mechanism is applied by means of the **GMS_DISCOVERY_URI_LIST** property being set to the ***generate***value. -![glassfish cluster properties](https://jelastic.com/blog/wp-content/uploads/2021/09/gf-properties1-1024x515.png) +![glassfish cluster properties](gf-properties1-1024x515-d8084537.png) ### Payara Session Replication with Hazelcast @@ -74,36 +74,36 @@ Session replication inside the Payara cluster is based on Hazelcast, which has a To allow session replication, you must first enable web container availability. This allows managed web container properties such as sessions to be used across multiple instances with the same configuration. In Payara Server 4, you had to enable Hazelcast and manually configure accessibility. This is all set by default in current Payara 5. If you have changed any configuration, make sure the accessibility service is enabled and the save type is "hazelcast" on the web container's accessibility page. -![payara cluster hazelcast](https://jelastic.com/blog/wp-content/uploads/2021/09/payara-hazelcast1.png) +![payara cluster hazelcast](payara-hazelcast1-c07a4fad.png) To manage Hazelcast settings, access the Administration Console and refer to the [Domain Data grid configuration page](https://docs.payara.fish/enterprise/docs/documentation/payara-server/hazelcast/configuration.html). Payara's Domain Data Grid feature is based on the Hazelcast library. It provides the required functionality for the deployment group (clustering functionality), caching functionality, single CDI cluster object and data storage monitoring in Payara. -![payara hazelcast configuration](https://jelastic.com/blog/wp-content/uploads/2021/09/payara-hazelcast-configuration.png) +![payara hazelcast configuration](payara-hazelcast-configuration-a3750a92.png) ## Deploy Example Application for HA Testing Now, let's check the high availability of such automatically composed cluster with the example of scaled GlassFish server. To make sure of its fault tolerance, we'll deploy a dedicated testing application, which enables to add some custom session data and to view the detailed information on a server this session is handled by. This way, stopping particular cluster instances allows ascertaining that the already running user sessions will continue being processed even in case the corresponding server fails. So, let's see it in practice. 1. Click **Open in browser**next to your environment to access the application server start page. -![glassfish cluster application](https://jelastic.com/blog/wp-content/uploads/2021/09/glassfish-oib.png) +![glassfish cluster application](glassfish-oib-a57e11b2.png) Within the opened page, select the **go to the Administration Console** reference and log in with credentials, delivered to you via email upon the environment creation. 2. Switch to the **Applications** section and upload [clusterjsp.ear](https://github.com/jelastic-jps/glassfish/blob/master/glassfish-cluster/test-app/clusterjsp.ear?raw=true) application to the **Packaged File to Be Uploaded to the Server** location. -![glassfish cluster deploy](https://jelastic.com/blog/wp-content/uploads/2021/09/clusterjsp-app1.png) +![glassfish cluster deploy](clusterjsp-app1-fa173804.png) 3. Check to have the **Availability** enabled and set up ***cluster1*** as the application target, then click **OK** to proceed. -![glassfish payara targets](https://jelastic.com/blog/wp-content/uploads/2021/09/targets1.png) +![glassfish payara targets](targets1-a76dcaf0.png) 4. Now, open environment in browser and append ***/clusterjsp*** to the URL. -![glassfish payara ha](https://jelastic.com/blog/wp-content/uploads/2021/09/jsp-sample-page1.png) +![glassfish payara ha](jsp-sample-page1-9931c4a7.png) Provide any custom *Name* and *Value* for your own session attribute and click on **Add Session Data**. 5. Switch back to the admin panel and navigate to the **Clusters \> cluster1 \> Instances** tab. Here, select and **Stop**the instance your session is running on (its hostname is circled in the image above). -![glassfish cluster test](https://jelastic.com/blog/wp-content/uploads/2021/09/instance-stop1.png) +![glassfish cluster test](instance-stop1-cfd952c8.png) 6. Return to our application and **Reload Page**with the appropriate button. -![glassfish cluster success](https://jelastic.com/blog/wp-content/uploads/2021/09/instance2.png) +![glassfish cluster success](instance2-853a9921.png) As you can see, despite of the session being handled by another instance, our custom attribute is still output. @@ -112,20 +112,20 @@ As you can see, despite of the session being handled by another instance, our cu * *Web Container Availability* * *EJB Container Availability* -![glassfish replication settings](https://jelastic.com/blog/wp-content/uploads/2021/09/web-container-availability1.png) +![glassfish replication settings](web-container-availability1-0feb1a2a.png) ## Cloning Cluster for A/B Testing When releasing new application version or just applying some essential adjustments, it's a good practice to check how the newly implemented changes could affect the service work and your users' appeal. The Jelastic PaaS allows you to accomplish such testing 'on-fly' (i.e. without service downtime and implicitly for your customers) with the **Clone Environment** option. -![glassfish cluster cloning](https://jelastic.com/blog/wp-content/uploads/2021/09/cloning.png) +![glassfish cluster cloning](cloning-6610f32c.png) As a result, a ready-to-work cluster copy will be created, with all the required modifications being already applied. To be more precise, this means that a cloned DAS node operates with the appropriate cloned workers, which are already listed within its admin panel, and all applications from the original environment are deployed to the cloned one as well. Thus, the only thing that remains for you to do is to recheck your app's code \& custom server configurations for the hardcoded IPs/domains and fix them accordingly, if any. -![glassfish clusters](https://jelastic.com/blog/wp-content/uploads/2021/09/2-clones.png) +![glassfish clusters](2-clones-ef6edb60.png) This way, you can apply the implied changes to your environment copy without affecting the actual production one. Subsequently, you can also evaluate productivity and effectiveness of the modified application version comparing to the currently original one, i.e. to perform so-called *A/B Testing* . At Jelastic PaaS, this can be implemented with a special supplementary [Traffic Distributor](https://docs.jelastic.com/traffic-distributor) add-on. -![glassfish traffic distributor](https://jelastic.com/blog/wp-content/uploads/2017/10/paas-traffic-distributor-add-on.png) +![glassfish traffic distributor](paas-traffic-distributor-add-on-5556271b.png) Being placed in front of a pair of environments with the *Sticky Sessions* mode chosen, it provides smart routing of the incoming requests according to the stated backends weight. For more details on a proper TD configuration in this case, refer to the dedicated [A/B Testing](https://docs.jelastic.com/ab-testing) guideline. diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/instance-stop1-cfd952c8.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/instance-stop1-cfd952c8.png new file mode 100644 index 000000000..36f064e65 Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/instance-stop1-cfd952c8.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/instance2-853a9921.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/instance2-853a9921.png new file mode 100644 index 000000000..11e20935e Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/instance2-853a9921.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/jsp-sample-page1-9931c4a7.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/jsp-sample-page1-9931c4a7.png new file mode 100644 index 000000000..292c560b9 Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/jsp-sample-page1-9931c4a7.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/paas-traffic-distributor-add-on-5556271b.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/paas-traffic-distributor-add-on-5556271b.png new file mode 100644 index 000000000..4d77aadd3 Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/paas-traffic-distributor-add-on-5556271b.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/payara-hazelcast-configuration-a3750a92.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/payara-hazelcast-configuration-a3750a92.png new file mode 100644 index 000000000..6a7337590 Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/payara-hazelcast-configuration-a3750a92.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/payara-hazelcast1-c07a4fad.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/payara-hazelcast1-c07a4fad.png new file mode 100644 index 000000000..64150995a Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/payara-hazelcast1-c07a4fad.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/targets1-a76dcaf0.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/targets1-a76dcaf0.png new file mode 100644 index 000000000..faf0d42a8 Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/targets1-a76dcaf0.png differ diff --git a/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/web-container-availability1-0feb1a2a.png b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/web-container-availability1-0feb1a2a.png new file mode 100644 index 000000000..32787c635 Binary files /dev/null and b/content/posts/2021/10/13/glassfish-payara-auto-clustering-jakarta-ee/web-container-availability1-0feb1a2a.png differ diff --git a/content/posts/2021/10/15/javafx-templates-for-desktop-applications/app-b9a95407.png b/content/posts/2021/10/15/javafx-templates-for-desktop-applications/app-b9a95407.png new file mode 100644 index 000000000..9def391e2 Binary files /dev/null and b/content/posts/2021/10/15/javafx-templates-for-desktop-applications/app-b9a95407.png differ diff --git a/content/posts/2021/10/15/javafx-templates-for-desktop-applications/index.md b/content/posts/2021/10/15/javafx-templates-for-desktop-applications/index.md index 458936839..d0aae6d9f 100644 --- a/content/posts/2021/10/15/javafx-templates-for-desktop-applications/index.md +++ b/content/posts/2021/10/15/javafx-templates-for-desktop-applications/index.md @@ -63,7 +63,7 @@ The `ci.yml` file will build the native packages for each platform on GitHub aft The project in this repository uses a multi-module Maven setup with a parent module containing three child modules. One of these child modules is the "main" module as it contains the main class. This module also contains the build scripts and its target directory will contain the results of the build. The JavaFX application consists of a single-window displaying three labels. The first one shows the currently configured locale and the other two labels get imported from module 1 and module 2 respectively. -{{< img src="https://github.com/dlemmermann/JPackageScriptFX/raw/master/app.png" class="is-resized" alt="alt text" width="216" height="216" caption="The second template application" >}} +{{< img src="app-b9a95407.png" class="is-resized" alt="alt text" width="216" height="216" caption="The second template application" >}} The platform-specific versions are created with Maven and this whole process is very well and detailed explained [in the README file of the GitHub project](https://github.com/dlemmermann/JPackageScriptFX/blob/master/README.md). diff --git a/content/posts/2021/10/20/psa-the-risks-of-remote-jdwp-debugging/ChPfwGtMr-f9ca1351.jpeg b/content/posts/2021/10/20/psa-the-risks-of-remote-jdwp-debugging/ChPfwGtMr-f9ca1351.jpeg new file mode 100644 index 000000000..bd6e0ce37 Binary files /dev/null and b/content/posts/2021/10/20/psa-the-risks-of-remote-jdwp-debugging/ChPfwGtMr-f9ca1351.jpeg differ diff --git a/content/posts/2021/10/20/psa-the-risks-of-remote-jdwp-debugging/LJZGiwg5X-9029460e.jpeg b/content/posts/2021/10/20/psa-the-risks-of-remote-jdwp-debugging/LJZGiwg5X-9029460e.jpeg new file mode 100644 index 000000000..aead18689 Binary files /dev/null and b/content/posts/2021/10/20/psa-the-risks-of-remote-jdwp-debugging/LJZGiwg5X-9029460e.jpeg differ diff --git a/content/posts/2021/10/20/psa-the-risks-of-remote-jdwp-debugging/index.md b/content/posts/2021/10/20/psa-the-risks-of-remote-jdwp-debugging/index.md index 997a45baf..6b9a1646c 100644 --- a/content/posts/2021/10/20/psa-the-risks-of-remote-jdwp-debugging/index.md +++ b/content/posts/2021/10/20/psa-the-risks-of-remote-jdwp-debugging/index.md @@ -27,7 +27,7 @@ That's INSANE! Even internally it's a HUGE risk with [60% of breaches originating from inside the organization](https://www.idwatchdog.com/insider-threats-and-data-breaches/). Well... -![drew-scream.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1634113444886/ChPfwGtMr.jpeg) +![drew-scream.jpg](ChPfwGtMr-f9ca1351.jpeg) This isn't just a security risk, that could essentially give every hacker the "keys" to your server and full access to your server code… It's also a serious stability hazard that could easily crash your production servers. @@ -71,7 +71,7 @@ The problem is that even unintentional actions can demolish a server. A simple c ## Information Sifting -![office-space.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1634113633044/LJZGiwg5X.jpeg) +![office-space.jpg](LJZGiwg5X-9029460e.jpeg) In the cult classic office space the heroes sift pennies from transactions. Big organizations block a lot of this access and rightly so. diff --git a/content/posts/2021/10/22/understanding-apache-maven-part-5-dependencies-in-maven/index.md b/content/posts/2021/10/22/understanding-apache-maven-part-5-dependencies-in-maven/index.md index f25ce2723..0ff023701 100644 --- a/content/posts/2021/10/22/understanding-apache-maven-part-5-dependencies-in-maven/index.md +++ b/content/posts/2021/10/22/understanding-apache-maven-part-5-dependencies-in-maven/index.md @@ -6,7 +6,7 @@ description: "In this, part 5 of the series on Apache Maven, a walkthrough of th canonical: "https://cguntur.me/2020/06/03/understanding-apache-maven-part-5/" authors: - "c-guntur" -image: "https://cgunturme.files.wordpress.com/2020/06/mavendependencygraph.png?w=1024" +image: "mavendependencygraph-62214412.png" categories: - "Maven" related_posts: @@ -108,7 +108,7 @@ An anecdotal example of depending on a ***metrics*** library: The current projec ### A graphical representation -![A graphical representation of a dependency tree showing different depths of transitive dependencies as well as possible exclusions and non-inclusion via an optional attribute on a sample transitive.](https://cgunturme.files.wordpress.com/2020/06/mavendependencygraph.png?w=1024) Basic dependency graph example +![A graphical representation of a dependency tree showing different depths of transitive dependencies as well as possible exclusions and non-inclusion via an optional attribute on a sample transitive.](mavendependencygraph-62214412.png) Basic dependency graph example ## How to view the dependency tree @@ -150,7 +150,7 @@ POM **P1** has a few dependencies listed below **(** with dummy **Group** , **Ar * Dependency D4 (G4:A4:V4) `->` **Dx (Gx:Ax:V1.5.0)**. Maven creates a dependency tree during its ***effective POM*** generation that is illustrated below: -![Graphical representation of determining a transitive dependency to be nearest in depth and first in resolution.](https://cgunturme.files.wordpress.com/2020/06/maventransitiveresolution.png?w=1024) +![Graphical representation of determining a transitive dependency to be nearest in depth and first in resolution.](maventransitiveresolution-19192dc0.png) the above example shows V1.2.0 of Dx as the transitive dependency of choice since it is ***nearest in depth and first in resolution in this dependency tree***. diff --git a/content/posts/2021/10/22/understanding-apache-maven-part-5-dependencies-in-maven/mavendependencygraph-62214412.png b/content/posts/2021/10/22/understanding-apache-maven-part-5-dependencies-in-maven/mavendependencygraph-62214412.png new file mode 100644 index 000000000..ad919736f Binary files /dev/null and b/content/posts/2021/10/22/understanding-apache-maven-part-5-dependencies-in-maven/mavendependencygraph-62214412.png differ diff --git a/content/posts/2021/10/22/understanding-apache-maven-part-5-dependencies-in-maven/maventransitiveresolution-19192dc0.png b/content/posts/2021/10/22/understanding-apache-maven-part-5-dependencies-in-maven/maventransitiveresolution-19192dc0.png new file mode 100644 index 000000000..b31b0dbb6 Binary files /dev/null and b/content/posts/2021/10/22/understanding-apache-maven-part-5-dependencies-in-maven/maventransitiveresolution-19192dc0.png differ diff --git a/content/posts/2021/10/23/git-archeology/annotate_previous.jpg b/content/posts/2021/10/23/git-archeology/annotate_previous.jpg new file mode 100644 index 000000000..5e63c62b0 Binary files /dev/null and b/content/posts/2021/10/23/git-archeology/annotate_previous.jpg differ diff --git a/content/posts/2021/10/23/git-archeology/annotate_previous.png b/content/posts/2021/10/23/git-archeology/annotate_previous.png deleted file mode 100644 index d963be790..000000000 Binary files a/content/posts/2021/10/23/git-archeology/annotate_previous.png and /dev/null differ diff --git a/content/posts/2021/10/23/git-archeology/github_prior.jpg b/content/posts/2021/10/23/git-archeology/github_prior.jpg new file mode 100644 index 000000000..f1fe23329 Binary files /dev/null and b/content/posts/2021/10/23/git-archeology/github_prior.jpg differ diff --git a/content/posts/2021/10/23/git-archeology/github_prior.png b/content/posts/2021/10/23/git-archeology/github_prior.png deleted file mode 100644 index 80d8ccad1..000000000 Binary files a/content/posts/2021/10/23/git-archeology/github_prior.png and /dev/null differ diff --git a/content/posts/2021/10/23/git-archeology/index.md b/content/posts/2021/10/23/git-archeology/index.md index 33d0d34fa..7504e7298 100644 --- a/content/posts/2021/10/23/git-archeology/index.md +++ b/content/posts/2021/10/23/git-archeology/index.md @@ -51,11 +51,11 @@ Usually, this allows to hide some of the more trivial commits but requires `git` Luckily, this can also easily be achieved by the various editors by moving backward commit-wise. Looking at the history on GitHub, you can use the "View blame prior to this change" feature: -![GitHub prior commits](github_prior.png) +![GitHub prior commits](github_prior.jpg) Similarly, IntelliJ-based IDEs allow you to do the same using "Annotate Previous Revision": -![IntelliJ Annotate Previous Commit](annotate_previous.png) +![IntelliJ Annotate Previous Commit](annotate_previous.jpg) In case you're using Visual Studio Code, the excellent "GitLense" extension offers similar commands: diff --git a/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/3Ynut12B6-94bf4e6f.jpg b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/3Ynut12B6-94bf4e6f.jpg new file mode 100644 index 000000000..57287e9bd Binary files /dev/null and b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/3Ynut12B6-94bf4e6f.jpg differ diff --git a/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/8jHNnemXB-bb9ad404.jpg b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/8jHNnemXB-bb9ad404.jpg new file mode 100644 index 000000000..97136fda3 Binary files /dev/null and b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/8jHNnemXB-bb9ad404.jpg differ diff --git a/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/Thl0eRQkk-0387b30f.jpg b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/Thl0eRQkk-0387b30f.jpg new file mode 100644 index 000000000..bc75eabcf Binary files /dev/null and b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/Thl0eRQkk-0387b30f.jpg differ diff --git a/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/VKGY3QpPI-d4eba484.jpg b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/VKGY3QpPI-d4eba484.jpg new file mode 100644 index 000000000..9d4196ba5 Binary files /dev/null and b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/VKGY3QpPI-d4eba484.jpg differ diff --git a/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/Z4hmrkhLZ-d6eea4f8.png b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/Z4hmrkhLZ-d6eea4f8.png new file mode 100644 index 000000000..c48f34a83 Binary files /dev/null and b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/Z4hmrkhLZ-d6eea4f8.png differ diff --git a/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/ZgYwCDMR9-ff9f43d4.png b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/ZgYwCDMR9-ff9f43d4.png new file mode 100644 index 000000000..3d410c9fb Binary files /dev/null and b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/ZgYwCDMR9-ff9f43d4.png differ diff --git a/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/aZkAgUrSe-1c60cea0.jpg b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/aZkAgUrSe-1c60cea0.jpg new file mode 100644 index 000000000..4ed6a3f6f Binary files /dev/null and b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/aZkAgUrSe-1c60cea0.jpg differ diff --git a/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/index.md b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/index.md index 984485d4f..e7df3b487 100644 --- a/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/index.md +++ b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/index.md @@ -67,13 +67,13 @@ Download the appropriate source file and add it as the main source file in a new First we need to debug the app. In IDEs from JetBrains, we just right click the executable file and select debug as such: -![Screen Shot 2021-10-19 at 15.16.43.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1634756719807/8jHNnemXB.png) +![Screen Shot 2021-10-19 at 15.16.43.png](8jHNnemXB-bb9ad404.jpg) Please notice you might need to wait for the IDE to finish scanning and indexing the files so it will show the appropriate debug action. The same is true for VSCode. Select the debug view on the left of the IDE and click the "Run and Debug" button. -![Screen Shot 2021-10-19 at 16.27.39.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1634756764983/VKGY3QpPI.png) +![Screen Shot 2021-10-19 at 16.27.39.png](VKGY3QpPI-d4eba484.jpg) You will be prompted with an environment to use, pick Node.js to continue. @@ -81,10 +81,10 @@ Once you start debugging you can set a breakpoint by clicking once on the "gutte ## Running -![Running on JetBrains IntelliJ/IDEA](https://cdn.hashnode.com/res/hashnode/image/upload/v1634756909711/3Ynut12B6.png) +![Running on JetBrains IntelliJ/IDEA](3Ynut12B6-94bf4e6f.jpg) **Running on JetBrains IntelliJ/IDEA** -![Running on VSCode](https://cdn.hashnode.com/res/hashnode/image/upload/v1634756974344/r-c89Vbb6.png) +![Running on VSCode](r-c89Vbb6-e6d34b90.jpg) **Running on VSCode** We place a breakpoint on line in the file. Notice that the Java file is more elaborate than the other Prime Main files: @@ -100,27 +100,27 @@ On the bottom right (for JetBrains) or the top left for VSCode, you can see the We can change the values of variables using the "Set Value" feature: -![Setting Value in JetBrains](https://cdn.hashnode.com/res/hashnode/image/upload/v1634757073584/Thl0eRQkk.png) +![Setting Value in JetBrains](Thl0eRQkk-0387b30f.jpg) **Setting Value in JetBrains** -![Setting Value in VSCode](https://cdn.hashnode.com/res/hashnode/image/upload/v1634757271261/Z4hmrkhLZ.png) +![Setting Value in VSCode](Z4hmrkhLZ-d6eea4f8.png) **Setting Value in VSCode** This is extremely helpful for debugging edge cases. Just set the variable to the value you're having trouble with and reproduce the issue. A nice JetBrains feature lets you view a value differently e.g. as hex, binary etc.: -![Screen Shot 2021-10-19 at 16.18.44.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1634757331027/tXxN9mt5p.png) +![Screen Shot 2021-10-19 at 16.18.44.png](tXxN9mt5p-d2ede3d2.jpg) Finally we can right click on the breakpoint to edit it. We can set a condition for the breakpoint which will make execution stop only if the condition is met: -![Conditional Breakpoint in JetBrains on IntelliJ/IDEA](https://cdn.hashnode.com/res/hashnode/image/upload/v1634757365298/aZkAgUrSe.png) +![Conditional Breakpoint in JetBrains on IntelliJ/IDEA](aZkAgUrSe-1c60cea0.jpg) **Conditional Breakpoint in JetBrains on IntelliJ/IDEA** -![Conditional Breakpoint is added via Edit Breakpoint in VSCode](https://cdn.hashnode.com/res/hashnode/image/upload/v1634757413237/ylJ4nUfvk.png) +![Conditional Breakpoint is added via Edit Breakpoint in VSCode](ylJ4nUfvk-10f2ace5.png) **Conditional Breakpoint is added via Edit Breakpoint in VSCode** -![Conditional Breakpoint Editing in VSCode](https://cdn.hashnode.com/res/hashnode/image/upload/v1634757443176/ZgYwCDMR9.png) +![Conditional Breakpoint Editing in VSCode](ZgYwCDMR9-ff9f43d4.png) **Conditional Breakpoint Editing in VSCode** Since the Java code is a bit different I used `primesToTest[0] == 2` which will always be true. You can try setting it to 3 which will take a long while and you can see that it will only stop at that point. diff --git a/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/r-c89Vbb6-e6d34b90.jpg b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/r-c89Vbb6-e6d34b90.jpg new file mode 100644 index 000000000..0c2bda2c3 Binary files /dev/null and b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/r-c89Vbb6-e6d34b90.jpg differ diff --git a/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/tXxN9mt5p-d2ede3d2.jpg b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/tXxN9mt5p-d2ede3d2.jpg new file mode 100644 index 000000000..3e6b83fde Binary files /dev/null and b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/tXxN9mt5p-d2ede3d2.jpg differ diff --git a/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/ylJ4nUfvk-10f2ace5.png b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/ylJ4nUfvk-10f2ace5.png new file mode 100644 index 000000000..b11596517 Binary files /dev/null and b/content/posts/2021/10/27/debugging-tutorial-1-introduction-conditional-breakpoints-set-value/ylJ4nUfvk-10f2ace5.png differ diff --git a/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/9pE63Es-2e5efa3b.jpg b/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/9pE63Es-2e5efa3b.jpg new file mode 100644 index 000000000..c5a219993 Binary files /dev/null and b/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/9pE63Es-2e5efa3b.jpg differ diff --git a/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/KOcCE7t-169e5eab.png b/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/KOcCE7t-169e5eab.png new file mode 100644 index 000000000..c7464b2f4 Binary files /dev/null and b/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/KOcCE7t-169e5eab.png differ diff --git a/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/KmKpZfO-6c0e7723.jpg b/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/KmKpZfO-6c0e7723.jpg new file mode 100644 index 000000000..4ee291b90 Binary files /dev/null and b/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/KmKpZfO-6c0e7723.jpg differ diff --git a/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/index.md b/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/index.md index 686b65326..cefac0e39 100644 --- a/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/index.md +++ b/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/index.md @@ -21,13 +21,13 @@ SKP's Agile Cheatsheet is a three part series of articles focused on daily agile **Affinity Diagram.**An affinity diagram is a method used to organize many ideas into groups with common themes or relationships. Affinity diagrams are tools for analysing large amounts of data and discovering relationships that allow a design direction to be established based on the associations. \[Type – Brainstorming, Agile Process, Sprint Retrospective\] -![](https://i.imgur.com/KOcCE7t.png) +![](KOcCE7t-169e5eab.png) **Fig.1**: Real-World Affinity Diagram (Affinity Mapping) from a Sprint Retrospective (kbp.media) **Agile C4Model.** C4 Model documents the architecture of a software system, by showing multiple points of view that explain the decomposition of a system into containers and components, the relationship between these elements, and, where appropriate, the relation with its users. The viewpoints are organized according to their hierarchical level: Context Diagrams, Container Diagrams, Component Diagrams, Code Diagrams. \[Type – Agile Modelling, Agile Architecture, System Design\] -![](https://imgur.com/ju06Cnr.jpg) +![](ju06Cnr-5e4d91b7.jpg) **Fig.2**: Hierarchical C4 Model for Viewpoints of a Software System (c4model.com) @@ -39,13 +39,13 @@ SKP's Agile Cheatsheet is a three part series of articles focused on daily agile **Burn Down Charts** . The team displays, somewhere on a wall of the project room, a large graph relating the quantity of work remaining (on the vertical axis) and the time elapsed since the start of the project (on the horizontal, showing future as well as past). This constitutes an "Information Radiator", provided it is updated regularly. Two variants exist, depending on whether the amount graphed is for the work remaining in the iteration ("Sprint Burndown") or more commonly the entire project ("Product Burndown"). \[Type – Agile Project Management\] -![](https://imgur.com/r7weLIB.jpg) +![](r7weLIB-3775d037.jpg) **Fig.3**: Burn Down vs. Burn Up Charts (publications.axelos.com) **Capacity**. Capacity is how much availability the team has for the sprint. This may vary based on team members being on vacation, ill, etc. The team should consider capacity in determining how many product backlog items to plan for a sprint. \[Type – Agile Project Management / Agile Estimation\] -![](https://imgur.com/9pE63Es.jpg) +![](9pE63Es-2e5efa3b.jpg) **Fig.4**: Typical Capacity Calculation (targetprocess.com) @@ -59,7 +59,7 @@ SKP's Agile Cheatsheet is a three part series of articles focused on daily agile **Cumulative Flow Diagram**. The Cumulative Flow Diagram (also known as CFD) is one of the most advanced Kanban and Agile analytics charts. It provides a concise visualization of the three most important metrics of your flow: Cycle Time, Throughput, Work in Progress. Its main purpose is to show you how stable your flow is and help you understand where you need to focus on making your process more predictable. It gives you quantitative and qualitative insight into past and existing problems and can visualize massive amounts of data. \[Type – Agile Project Management\] -![](https://imgur.com/qyOgC5w.jpg) +![](qyOgC5w-4f14c250.jpg) **Fig.5**: Typical Cumulative Flow Diagram in Agile (kanbanize.com) @@ -73,7 +73,7 @@ SKP's Agile Cheatsheet is a three part series of articles focused on daily agile **Earned Value Management** . Earned Value Management (EVM) is a project management technique that measures the technical performance, cost and schedule of a project against planned objectives. The result is a simple set of metrics that provides early warnings of performance issues, allowing for timely and appropriate adjustments. EVM also improves the definition of project scope and provides valuable metrics for communicating progress to stakeholders. To implement EVM, you need to measure some basic metrics like a valuation of planned work, called planned value (PV). Agile EVM is a lightweight and easy to use adaptation of the traditional Earned Value Management technique which provides the benefits of traditional Earned Value Management for Scrum. \[Type – Agile Project Management / Agile Analysis\] -![](https://imgur.com/KmKpZfO.jpg) +![](KmKpZfO-6c0e7723.jpg) **Fig.6**: Typical S-Curve showing EV, AC, PV, SV, CV in Agile (mpug.com) More coming soon! diff --git a/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/ju06Cnr-5e4d91b7.jpg b/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/ju06Cnr-5e4d91b7.jpg new file mode 100644 index 000000000..8cb2a2eab Binary files /dev/null and b/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/ju06Cnr-5e4d91b7.jpg differ diff --git a/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/qyOgC5w-4f14c250.jpg b/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/qyOgC5w-4f14c250.jpg new file mode 100644 index 000000000..79c92d8d7 Binary files /dev/null and b/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/qyOgC5w-4f14c250.jpg differ diff --git a/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/r7weLIB-3775d037.jpg b/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/r7weLIB-3775d037.jpg new file mode 100644 index 000000000..c9a285628 Binary files /dev/null and b/content/posts/2021/10/28/skps-agile-cheatsheet-part-01/r7weLIB-3775d037.jpg differ diff --git a/content/posts/2021/10/29/understanding-apache-maven-part-6-pom-reference/index.md b/content/posts/2021/10/29/understanding-apache-maven-part-6-pom-reference/index.md index 6f11f036b..7923aabc6 100644 --- a/content/posts/2021/10/29/understanding-apache-maven-part-6-pom-reference/index.md +++ b/content/posts/2021/10/29/understanding-apache-maven-part-6-pom-reference/index.md @@ -5,7 +5,7 @@ lastmod: "2021-10-29T08:22:31+00:00" description: "Not meant as a full dissection of the Apache Maven pom.xml, this article will go through some of its common portions." authors: - "c-guntur" -image: "https://cgunturme.files.wordpress.com/2020/06/mavenpomproject.png?w=1024" +image: "mavenpomproject-78cc1ede.png" categories: - "Maven" related_posts: @@ -26,7 +26,7 @@ With the assumption that the above linked content has been read *and bookmarked ## The `project` -![POM Contents. The dark background elements have complex structures while the light background are simple elements. Build and Profiles have additional diagrams](https://cgunturme.files.wordpress.com/2020/06/mavenpomproject.png?w=1024) POM contents. The dark background elements have complex structures while the light background is for simple elements. Build and Profiles have additional diagrams +![POM Contents. The dark background elements have complex structures while the light background are simple elements. Build and Profiles have additional diagrams](mavenpomproject-78cc1ede.png) POM contents. The dark background elements have complex structures while the light background is for simple elements. Build and Profiles have additional diagrams This is the root element of a POM (Project Object Model). All convention overrides of a maven project are listed under the `project` element in the XML. A parent is identified by its coordinates (**groupId** , **artifactId** and **version** ) and an optional **relativePath** . The **relativePath** by convention expects a parent to exist one directory above. This relativePath value can be overridden to point to relative alternate locations (such as same directory) or an empty value, to ignore searching locally and only search in configured repositories. @@ -129,7 +129,7 @@ Link: > **toolchains.xml** **excerpt** : > **pom.xml excerpt** : > (The configuration in the pom `maven-toolchains-plugin` looks for an AdoptOpenJDK Hotspot Java 11) -![Three different means of configuring Maven: Environment variables, .mvn Config files and XML configurations](https://cgunturme.files.wordpress.com/2020/06/mavenconfiguration.png?w=1024) Three different means of configuring Maven: environment variables, Maven config files, and XML configurations. +![Three different means of configuring Maven: Environment variables, .mvn Config files and XML configurations](mavenconfiguration-a4181173.png) Three different means of configuring Maven: environment variables, Maven config files, and XML configurations. That's a wrap on configuring Maven! diff --git a/content/posts/2021/11/05/understanding-apache-maven-part-7-configuring-apache-maven/mavenconfiguration-a4181173.png b/content/posts/2021/11/05/understanding-apache-maven-part-7-configuring-apache-maven/mavenconfiguration-a4181173.png new file mode 100644 index 000000000..a47e6293a Binary files /dev/null and b/content/posts/2021/11/05/understanding-apache-maven-part-7-configuring-apache-maven/mavenconfiguration-a4181173.png differ diff --git a/content/posts/2021/11/12/understanding-apache-maven-part-8-maven-plugins/index.md b/content/posts/2021/11/12/understanding-apache-maven-part-8-maven-plugins/index.md index daf0ca23c..d5ef2066d 100644 --- a/content/posts/2021/11/12/understanding-apache-maven-part-8-maven-plugins/index.md +++ b/content/posts/2021/11/12/understanding-apache-maven-part-8-maven-plugins/index.md @@ -5,7 +5,7 @@ lastmod: "2021-11-20T11:36:10+00:00" description: "Maven is a plugin-execution framework: plugins are an assembly of goals, code written as MOJOs (Maven’s plain Old Java Objects)." authors: - "c-guntur" -image: "https://cgunturme.files.wordpress.com/2020/07/mavenplugins.png?w=1024" +image: "mavenplugins-13f5b8fd.png" categories: - "Maven" related_posts: @@ -29,7 +29,7 @@ A quick recap: ## What are plugins? Maven is a plugin-execution framework. Plugins are an assembly of goals, code written as MOJOs (*Maven's plain Old Java Objects, Modern MOJOs are not restricted to being written in Java*). Goals have names and can be bound to phases. A MOJO declares its goal name and optionally, a phase association, which binds the class to a part of a lifecycle. -![Image displays a plugin-lifecycle relationship. Plugins define goals. Goals can be bound to phases. Goals from multiple plugins can be bound to a single phase.](https://cgunturme.files.wordpress.com/2020/07/mavenplugins.png?w=1024) Plugins define goals. Goals can be bound to phases. Goals from multiple plugins can be bound to a single phase. +![Image displays a plugin-lifecycle relationship. Plugins define goals. Goals can be bound to phases. Goals from multiple plugins can be bound to a single phase.](mavenplugins-13f5b8fd.png) Plugins define goals. Goals can be bound to phases. Goals from multiple plugins can be bound to a single phase. A plugin is typically a `.jar` file which contains the MOJO classes and a `META-INF/maven/plugins.xml`. This `plugins.xml` is generated as a part of the maven execution of the plugin code. @@ -92,7 +92,7 @@ The **dependencies** is a complex element and contains a set of **dependency** e ### Configuration The **configuration** is a complex element which allows for a free-form DOM configuration used by the plugin. The configuration specifics are typically listed (*and recommended, in case of custom plugins*) in the Usage page for a given plugin. -![](https://cgunturme.files.wordpress.com/2020/07/mavenpomplugins-1.png?w=1024) A visual of the plugin element +![](mavenpomplugins-1-6d5482ba.png) A visual of the plugin element ## Plugin Inheritance diff --git a/content/posts/2021/11/12/understanding-apache-maven-part-8-maven-plugins/mavenplugins-13f5b8fd.png b/content/posts/2021/11/12/understanding-apache-maven-part-8-maven-plugins/mavenplugins-13f5b8fd.png new file mode 100644 index 000000000..cd67dd4fe Binary files /dev/null and b/content/posts/2021/11/12/understanding-apache-maven-part-8-maven-plugins/mavenplugins-13f5b8fd.png differ diff --git a/content/posts/2021/11/12/understanding-apache-maven-part-8-maven-plugins/mavenpomplugins-1-6d5482ba.png b/content/posts/2021/11/12/understanding-apache-maven-part-8-maven-plugins/mavenpomplugins-1-6d5482ba.png new file mode 100644 index 000000000..e90a30d09 Binary files /dev/null and b/content/posts/2021/11/12/understanding-apache-maven-part-8-maven-plugins/mavenpomplugins-1-6d5482ba.png differ diff --git a/content/posts/2021/11/15/github-actions-with-java-part-2/JDKVersions-built.jpg b/content/posts/2021/11/15/github-actions-with-java-part-2/JDKVersions-built.jpg new file mode 100644 index 000000000..74ea1bfd3 Binary files /dev/null and b/content/posts/2021/11/15/github-actions-with-java-part-2/JDKVersions-built.jpg differ diff --git a/content/posts/2021/11/15/github-actions-with-java-part-2/JDKVersions-built.png b/content/posts/2021/11/15/github-actions-with-java-part-2/JDKVersions-built.png deleted file mode 100644 index f0eaa89d9..000000000 Binary files a/content/posts/2021/11/15/github-actions-with-java-part-2/JDKVersions-built.png and /dev/null differ diff --git a/content/posts/2021/11/15/github-actions-with-java-part-2/index.md b/content/posts/2021/11/15/github-actions-with-java-part-2/index.md index d022117a8..912268a69 100644 --- a/content/posts/2021/11/15/github-actions-with-java-part-2/index.md +++ b/content/posts/2021/11/15/github-actions-with-java-part-2/index.md @@ -103,7 +103,7 @@ After, the changes have been committed let's validate to see the workflow jobs h ![succesfully job run](Successful-Job-run.png) Next, click on the `Create a workflow using a JDK distribution` workflow to see the JDK versions built on. As shown in the following: -![JDK versions build on](JDKVersions-built.png) +![JDK versions build on](JDKVersions-built.jpg) ### Step 6 Success! diff --git a/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/1_Tr3xvq9hSvqoK3LHNaib6g-4-700x433.jpg b/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/1_Tr3xvq9hSvqoK3LHNaib6g-4-700x433.jpg new file mode 100644 index 000000000..6204fc1da Binary files /dev/null and b/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/1_Tr3xvq9hSvqoK3LHNaib6g-4-700x433.jpg differ diff --git a/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/1_Tr3xvq9hSvqoK3LHNaib6g-4-700x433.png b/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/1_Tr3xvq9hSvqoK3LHNaib6g-4-700x433.png deleted file mode 100644 index 8b2c3a4ca..000000000 Binary files a/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/1_Tr3xvq9hSvqoK3LHNaib6g-4-700x433.png and /dev/null differ diff --git a/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/1_Tr3xvq9hSvqoK3LHNaib6g-445x510.jpg b/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/1_Tr3xvq9hSvqoK3LHNaib6g-445x510.jpg new file mode 100644 index 000000000..89d115a78 Binary files /dev/null and b/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/1_Tr3xvq9hSvqoK3LHNaib6g-445x510.jpg differ diff --git a/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/1_Tr3xvq9hSvqoK3LHNaib6g-445x510.png b/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/1_Tr3xvq9hSvqoK3LHNaib6g-445x510.png deleted file mode 100644 index 34ceabdf7..000000000 Binary files a/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/1_Tr3xvq9hSvqoK3LHNaib6g-445x510.png and /dev/null differ diff --git a/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/index.md b/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/index.md index 801278a7d..1f20aa49e 100644 --- a/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/index.md +++ b/content/posts/2021/11/17/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/index.md @@ -36,7 +36,7 @@ FetchType.LAZY . Our old code for the entity was below: -![Domain model with fetch type EAGER](1_Tr3xvq9hSvqoK3LHNaib6g-445x510.png) +![Domain model with fetch type EAGER](1_Tr3xvq9hSvqoK3LHNaib6g-445x510.jpg) After using FetchType.LAZY our new code will be like below: ![Domain model with fetch type LAZY](1_Tr3xvq9hSvqoK3LHNaib6g-1-441x510.png) @@ -70,7 +70,7 @@ Notice that here we have only used the attributes owner and locations in our @Na **Calling the named entity graph:** To call this named entity graph in our query, we have added the following additional lines (line 96, 97 and 101) in our existing code. -![Calling the named entity graph](1_Tr3xvq9hSvqoK3LHNaib6g-4-700x433.png) +![Calling the named entity graph](1_Tr3xvq9hSvqoK3LHNaib6g-4-700x433.jpg) ## **Using Spring Data JPA Provided @EntityGraph Annotation** diff --git a/content/posts/2021/11/17/skps-agile-cheatsheet-part-03/21lrmib-b9748417.jpg b/content/posts/2021/11/17/skps-agile-cheatsheet-part-03/21lrmib-b9748417.jpg new file mode 100644 index 000000000..904394d53 Binary files /dev/null and b/content/posts/2021/11/17/skps-agile-cheatsheet-part-03/21lrmib-b9748417.jpg differ diff --git a/content/posts/2021/11/17/skps-agile-cheatsheet-part-03/EuY0kkk-9cc4f652.jpg b/content/posts/2021/11/17/skps-agile-cheatsheet-part-03/EuY0kkk-9cc4f652.jpg new file mode 100644 index 000000000..ef232497a Binary files /dev/null and b/content/posts/2021/11/17/skps-agile-cheatsheet-part-03/EuY0kkk-9cc4f652.jpg differ diff --git a/content/posts/2021/11/17/skps-agile-cheatsheet-part-03/LGzevOM-a56ab03b.jpg b/content/posts/2021/11/17/skps-agile-cheatsheet-part-03/LGzevOM-a56ab03b.jpg new file mode 100644 index 000000000..c4489fcde Binary files /dev/null and b/content/posts/2021/11/17/skps-agile-cheatsheet-part-03/LGzevOM-a56ab03b.jpg differ diff --git a/content/posts/2021/11/17/skps-agile-cheatsheet-part-03/index.md b/content/posts/2021/11/17/skps-agile-cheatsheet-part-03/index.md index 9740f3a82..c69d35167 100644 --- a/content/posts/2021/11/17/skps-agile-cheatsheet-part-03/index.md +++ b/content/posts/2021/11/17/skps-agile-cheatsheet-part-03/index.md @@ -17,7 +17,7 @@ frozen: false SKP's Agile Cheatsheet is a three part series of articles focused on daily agile terminology, ideal to be printed out and pinned up near your workstation. Part 1 is available [here](https://foojay.io/today/skps-agile-cheatsheet-part-01 "Here") and part 2 [here](https://foojay.io/today/skps-agile-cheatsheet-part-02 "Here")while the PDF cheatsheet is [here](https://rebrand.ly/skp-agile-cheat-sheet-all "Here"). -![](https://imgur.com/LGzevOM.jpg) +![](LGzevOM-a56ab03b.jpg) **Release Train**. The Agile Release Train (ART) is a long-lived team of Agile teams, which, along with other stakeholders, incrementally develops, delivers, and where applicable operates, one or more solutions in a value stream. \[Type – Agile Product Management\] @@ -27,7 +27,7 @@ SKP's Agile Cheatsheet is a three part series of articles focused on daily agile **Satisfaction Histogram.** Use this activity to set the stage and/or gather data in an iteration retrospective. Highlight how satisfied team members are with a focus area. Provide a visual picture of status in a particular area to help the team have deeper discussions and analysis. Acknowledge differences in perspective among team members. \[Type – Agile Project Management\] -![](https://imgur.com/EuY0kkk.jpg) +![](EuY0kkk-9cc4f652.jpg) **Scaled Agile Framework (SAFe)**. The Scaled Agile Framework® (SAFe®) is a system for implementing Agile, Lean, and DevOps practices at scale. The Scaled Agile Framework is the most popular framework for leading enterprises because it works: it's trusted, customizable, and sustainable. (Credits to www.scaledagile.com) \[Type – Scaled Agile Framework / Large Scale Agile\] @@ -35,7 +35,7 @@ SKP's Agile Cheatsheet is a three part series of articles focused on daily agile **Scrum.** Scrum is a process framework used to manage product development and other knowledge work. \[Type – Agile Project Management / Agile Development\] -![](https://imgur.com/21lrmib.jpg) +![](21lrmib-b9748417.jpg) **Scrum Master** . The scrum master is responsible for ensuring the team lives agile values and principles and follows the practices that the team agreed they would use. \[Type – Agile Project Management / Agile Developlment\] diff --git a/content/posts/2021/11/20/understanding-apache-maven-part-9-versions-in-maven/index.md b/content/posts/2021/11/20/understanding-apache-maven-part-9-versions-in-maven/index.md index 21513efe9..916fb215c 100644 --- a/content/posts/2021/11/20/understanding-apache-maven-part-9-versions-in-maven/index.md +++ b/content/posts/2021/11/20/understanding-apache-maven-part-9-versions-in-maven/index.md @@ -6,7 +6,7 @@ description: "Maven uses the version as a coordinate in identifying an artifac canonical: "https://cguntur.me/2020/07/05/understanding-apache-maven-part-9/" authors: - "c-guntur" -image: "https://cgunturme.files.wordpress.com/2020/07/mavenversionstrategy.png?w=1024" +image: "mavenversionstrategy-f93e0aaa.png" categories: - "Maven" related_posts: @@ -57,7 +57,7 @@ Link to the goals page for the `maven-release-plugin`: }} +{{< img src="client-api-700x415.jpg" class="aligncenter size-medium" alt="Micronaut Client API class diagram" width="700" height="415" >}} The usage is straightforward: @@ -116,7 +116,7 @@ fun characters( It's not possible to use Kotlin's string interpolation as these parameters are optional. Fortunately, Micronaut provides an `UriBuilder` abstraction, which follows the Builder pattern principles. -{{< img src="uribuilder-api-700x455.png" class="aligncenter size-medium" alt="Micronaut URI Builder class diagram" width="700" height="455" >}} +{{< img src="uribuilder-api-700x455.jpg" class="aligncenter size-medium" alt="Micronaut URI Builder class diagram" width="700" height="455" >}} We can use it like this: diff --git a/content/posts/2021/11/22/native-image-micronaut/uribuilder-api-700x455.jpg b/content/posts/2021/11/22/native-image-micronaut/uribuilder-api-700x455.jpg new file mode 100644 index 000000000..f9188e8eb Binary files /dev/null and b/content/posts/2021/11/22/native-image-micronaut/uribuilder-api-700x455.jpg differ diff --git a/content/posts/2021/11/22/native-image-micronaut/uribuilder-api-700x455.png b/content/posts/2021/11/22/native-image-micronaut/uribuilder-api-700x455.png deleted file mode 100644 index ab61c9657..000000000 Binary files a/content/posts/2021/11/22/native-image-micronaut/uribuilder-api-700x455.png and /dev/null differ diff --git a/content/posts/2021/11/26/junit-5-introduction/dukejunit5-70c1f16e.png b/content/posts/2021/11/26/junit-5-introduction/dukejunit5-70c1f16e.png new file mode 100644 index 000000000..274250b40 Binary files /dev/null and b/content/posts/2021/11/26/junit-5-introduction/dukejunit5-70c1f16e.png differ diff --git a/content/posts/2021/11/26/junit-5-introduction/index.md b/content/posts/2021/11/26/junit-5-introduction/index.md index 9738b0242..3f3c83e86 100644 --- a/content/posts/2021/11/26/junit-5-introduction/index.md +++ b/content/posts/2021/11/26/junit-5-introduction/index.md @@ -6,7 +6,7 @@ description: "Many of us have been used to JUnit 4 as a formidable unit testing canonical: "https://cguntur.me/2019/07/07/using-junit5-part-1/" authors: - "c-guntur" -image: "https://cgunturme.files.wordpress.com/2019/07/dukejunit5.png" +image: "dukejunit5-70c1f16e.png" categories: - "Testing" related_posts: @@ -23,7 +23,7 @@ Nothing stresses repeatability more than unit tests. Code Katas thus, in many ca Many of us have been long used to JUnit 4 as a formidable unit testing framework. This article is not going to be a comparison between JUnit 4 and JUnit 5, but you will notice some differences as italicized text. Let us explore JUnit 5 as it was used for a recent code kata, that is, this is how I learnt using JUnit 5 ! -![JUnit5 Logo](https://cgunturme.files.wordpress.com/2019/07/dukejunit5.png "JUnit5") +![JUnit5 Logo](dukejunit5-70c1f16e.png "JUnit5") ## JUnit 5 dependencies diff --git a/content/posts/2021/11/30/developer-productivity-masterclass-interview-with-leonid-blouvshtein/devprodmaster-700x227.jpg b/content/posts/2021/11/30/developer-productivity-masterclass-interview-with-leonid-blouvshtein/devprodmaster-700x227.jpg new file mode 100644 index 000000000..b731222b1 Binary files /dev/null and b/content/posts/2021/11/30/developer-productivity-masterclass-interview-with-leonid-blouvshtein/devprodmaster-700x227.jpg differ diff --git a/content/posts/2021/11/30/developer-productivity-masterclass-interview-with-leonid-blouvshtein/devprodmaster-700x227.png b/content/posts/2021/11/30/developer-productivity-masterclass-interview-with-leonid-blouvshtein/devprodmaster-700x227.png deleted file mode 100644 index 62b2aca30..000000000 Binary files a/content/posts/2021/11/30/developer-productivity-masterclass-interview-with-leonid-blouvshtein/devprodmaster-700x227.png and /dev/null differ diff --git a/content/posts/2021/11/30/developer-productivity-masterclass-interview-with-leonid-blouvshtein/index.md b/content/posts/2021/11/30/developer-productivity-masterclass-interview-with-leonid-blouvshtein/index.md index 535f1f0dd..f18ce188f 100644 --- a/content/posts/2021/11/30/developer-productivity-masterclass-interview-with-leonid-blouvshtein/index.md +++ b/content/posts/2021/11/30/developer-productivity-masterclass-interview-with-leonid-blouvshtein/index.md @@ -23,7 +23,7 @@ frozen: true [ -{{< img src="devprodmaster-700x227.png" class="size-medium" width="700" height="227" >}} +{{< img src="devprodmaster-700x227.jpg" class="size-medium" width="700" height="227" >}} ](https://www.linkedin.com/events/developerproductivitymasterclas6870717107772907520/) diff --git a/content/posts/2021/12/09/adelphi-apache-cassandra-testing-goes-cloud-native/adelphi-apache-cassandra-testing-goes-cloud-native.jpg b/content/posts/2021/12/09/adelphi-apache-cassandra-testing-goes-cloud-native/adelphi-apache-cassandra-testing-goes-cloud-native.jpg new file mode 100644 index 000000000..4d0caaa55 Binary files /dev/null and b/content/posts/2021/12/09/adelphi-apache-cassandra-testing-goes-cloud-native/adelphi-apache-cassandra-testing-goes-cloud-native.jpg differ diff --git a/content/posts/2021/12/09/adelphi-apache-cassandra-testing-goes-cloud-native/adelphi-apache-cassandra-testing-goes-cloud-native.png b/content/posts/2021/12/09/adelphi-apache-cassandra-testing-goes-cloud-native/adelphi-apache-cassandra-testing-goes-cloud-native.png deleted file mode 100644 index 9b4156971..000000000 Binary files a/content/posts/2021/12/09/adelphi-apache-cassandra-testing-goes-cloud-native/adelphi-apache-cassandra-testing-goes-cloud-native.png and /dev/null differ diff --git a/content/posts/2021/12/09/adelphi-apache-cassandra-testing-goes-cloud-native/index.md b/content/posts/2021/12/09/adelphi-apache-cassandra-testing-goes-cloud-native/index.md index ea2034093..faf761f3f 100644 --- a/content/posts/2021/12/09/adelphi-apache-cassandra-testing-goes-cloud-native/index.md +++ b/content/posts/2021/12/09/adelphi-apache-cassandra-testing-goes-cloud-native/index.md @@ -6,7 +6,7 @@ description: "Adelphi is an open-source QA tool for Apache Cassandra, packaged canonical: "https://www.datastax.com/blog/adelphi-apache-cassandratm-testing-goes-cloud-native" authors: - "gianluca-righetto" -image: "adelphi-apache-cassandra-testing-goes-cloud-native.png" +image: "adelphi-apache-cassandra-testing-goes-cloud-native.jpg" categories: - "Apache Cassandra" - "Databases" diff --git a/content/posts/2021/12/10/junit-5-display-names/index.md b/content/posts/2021/12/10/junit-5-display-names/index.md index f0f1ce265..c5956b528 100644 --- a/content/posts/2021/12/10/junit-5-display-names/index.md +++ b/content/posts/2021/12/10/junit-5-display-names/index.md @@ -5,7 +5,7 @@ lastmod: "2022-06-01T20:12:43+00:00" description: "Continue with the JUnit 5 series on how to customize test classes and test method names to produce more meaningful output." authors: - "c-guntur" -image: "https://cgunturme.files.wordpress.com/2019/07/junitnodisplayname.png?w=840" +image: "junitnodisplayname-b3e91507.png" categories: - "Testing" related_posts: @@ -24,14 +24,14 @@ Below, we will cover some customization of names for tests. First, a justificati ## Why Customize Names? When test class with a few test methods is run with JUnit, the output produced lists the name of the class and a status of execution for each method. The name of the class is used as the top level identifier: -![JUnitNoDisplayName](https://cgunturme.files.wordpress.com/2019/07/junitnodisplayname.png?w=840) +![JUnitNoDisplayName](junitnodisplayname-b3e91507.png) As is visible from the image above, a JUnit test was run on a class STestSolution3PeriodsAndDurations. This has four test methods that were tested and they all verify something. All tests passed. However, one really has to peer into the names of all the tests to understand what they executed. For instance, the second test verifies creation of a Period using fluent methods. This was inferred and hopefully most developers name their test methods to convey meaningful intent to anyone who looks at the result. Let's compare that to the next image: -![JUnitWithDisplayName](https://cgunturme.files.wordpress.com/2019/07/junitwithdisplayname-1.png?w=840) +![JUnitWithDisplayName](junitwithdisplayname-1-234836fe.png) Clearly the latter image communicates a lot better about what was tested and what the intent was. The test class is replaced with a meaningful text of what the overall theme for all test methods enclosed was : "**Periods (days, months, years) and Durations (hours, minutes, seconds)**". Also individual test methods had proper space-separated words rather than a camel-cased name. diff --git a/content/posts/2021/12/10/junit-5-display-names/junitnodisplayname-b3e91507.png b/content/posts/2021/12/10/junit-5-display-names/junitnodisplayname-b3e91507.png new file mode 100644 index 000000000..38151a59b Binary files /dev/null and b/content/posts/2021/12/10/junit-5-display-names/junitnodisplayname-b3e91507.png differ diff --git a/content/posts/2021/12/10/junit-5-display-names/junitwithdisplayname-1-234836fe.png b/content/posts/2021/12/10/junit-5-display-names/junitwithdisplayname-1-234836fe.png new file mode 100644 index 000000000..d8ce1fd82 Binary files /dev/null and b/content/posts/2021/12/10/junit-5-display-names/junitwithdisplayname-1-234836fe.png differ diff --git a/content/posts/2021/12/13/log4j-cve/index.md b/content/posts/2021/12/13/log4j-cve/index.md index b380329ac..1ef967d56 100644 --- a/content/posts/2021/12/13/log4j-cve/index.md +++ b/content/posts/2021/12/13/log4j-cve/index.md @@ -99,6 +99,6 @@ There's also [Java Serialization Filtering](https://docs.oracle.com/en/java/java {{< img src="image-950x1024.png" alt="" width="436" height="469" >}} - {{< img src="kryptos-1024x1000.png" alt="" width="438" height="428" >}} + {{< img src="kryptos-1024x1000.jpg" alt="" width="438" height="428" >}} {{< img src="checking-1024x802.png" alt="" width="440" height="345" >}} diff --git a/content/posts/2021/12/13/log4j-cve/kryptos-1024x1000.jpg b/content/posts/2021/12/13/log4j-cve/kryptos-1024x1000.jpg new file mode 100644 index 000000000..f1c509f6d Binary files /dev/null and b/content/posts/2021/12/13/log4j-cve/kryptos-1024x1000.jpg differ diff --git a/content/posts/2021/12/13/log4j-cve/kryptos-1024x1000.png b/content/posts/2021/12/13/log4j-cve/kryptos-1024x1000.png deleted file mode 100644 index a6bfd6c57..000000000 Binary files a/content/posts/2021/12/13/log4j-cve/kryptos-1024x1000.png and /dev/null differ diff --git a/content/posts/2021/12/15/log4shell-leak4j/index.md b/content/posts/2021/12/15/log4shell-leak4j/index.md index 83421fb4c..b9b27e456 100644 --- a/content/posts/2021/12/15/log4shell-leak4j/index.md +++ b/content/posts/2021/12/15/log4shell-leak4j/index.md @@ -6,7 +6,7 @@ description: "Over the last couple of days (and nights) I’ve been studying the canonical: "https://www.royvanrijn.com/blog/2021/12/log4j2-rce-problem/" authors: - "roy-van-rijn" -image: "https://www.royvanrijn.com/images/leak4j1.png" +image: "leak4j1-db2f246e.jpg" categories: - "Security" related_posts: @@ -28,7 +28,7 @@ The payload can be delivered in a LOT of ways, as long as it gets in a log state After writing some code (a malicious embedded LDAP server) I was able to reproduce the RCE ("Remote Code Execution") attack on even the most basic project. Here is an example: a simple REST endpoint in a Spring Boot starter project with a single line of logging -![Leak4J](https://www.royvanrijn.com/images/leak4j1.png) +![Leak4J](leak4j1-db2f246e.jpg) As you can see it downloads and executes a classfile I'm serving from the malicious LDAP server (running seperately) printing a message. @@ -83,7 +83,7 @@ I've seen suggestions online that 'newer' Java versions are not affected, but th It might be *slightly* harder/safer on a newer Java version, but it's definitely **NOT** a fix. To show this I've taken the latest version of Java 8 (1.8.311) and I'm using the log4j2 deserialization to craft something that opens the Calculator on my MacBook using other classes known to the vulnerable target: -![Leak4J with latest Java](https://www.royvanrijn.com/images/leak4j2.png) +![Leak4J with latest Java](leak4j2-bc22e1d1.jpg) Again: The payload is still being deserialized, on the latest Java version. diff --git a/content/posts/2021/12/15/log4shell-leak4j/leak4j1-db2f246e.jpg b/content/posts/2021/12/15/log4shell-leak4j/leak4j1-db2f246e.jpg new file mode 100644 index 000000000..81bd31d94 Binary files /dev/null and b/content/posts/2021/12/15/log4shell-leak4j/leak4j1-db2f246e.jpg differ diff --git a/content/posts/2021/12/15/log4shell-leak4j/leak4j2-bc22e1d1.jpg b/content/posts/2021/12/15/log4shell-leak4j/leak4j2-bc22e1d1.jpg new file mode 100644 index 000000000..2cecff6a1 Binary files /dev/null and b/content/posts/2021/12/15/log4shell-leak4j/leak4j2-bc22e1d1.jpg differ diff --git a/content/posts/2021/12/17/build-a-status-dashboard-using-spring-boot-and-astra-db/db-setup-1024x582.jpg b/content/posts/2021/12/17/build-a-status-dashboard-using-spring-boot-and-astra-db/db-setup-1024x582.jpg new file mode 100644 index 000000000..272a876c1 Binary files /dev/null and b/content/posts/2021/12/17/build-a-status-dashboard-using-spring-boot-and-astra-db/db-setup-1024x582.jpg differ diff --git a/content/posts/2021/12/17/build-a-status-dashboard-using-spring-boot-and-astra-db/db-setup-1024x582.png b/content/posts/2021/12/17/build-a-status-dashboard-using-spring-boot-and-astra-db/db-setup-1024x582.png deleted file mode 100644 index e740e4172..000000000 Binary files a/content/posts/2021/12/17/build-a-status-dashboard-using-spring-boot-and-astra-db/db-setup-1024x582.png and /dev/null differ diff --git a/content/posts/2021/12/17/build-a-status-dashboard-using-spring-boot-and-astra-db/index.md b/content/posts/2021/12/17/build-a-status-dashboard-using-spring-boot-and-astra-db/index.md index b292a92b7..dee658462 100644 --- a/content/posts/2021/12/17/build-a-status-dashboard-using-spring-boot-and-astra-db/index.md +++ b/content/posts/2021/12/17/build-a-status-dashboard-using-spring-boot-and-astra-db/index.md @@ -84,7 +84,7 @@ This article is focused on the *statuses* collection, and accessing it using the ## **How to Set Up DataStax Astra** Before we can start our application, we need a store for our data. We are going to use the Cassandra offering from DataStax Astra. **To get started, we need to [register a free account with Astra](https://astra.dev/3BJ1lmW) and create a new database.** This needs to be given a reasonable name for both the database and the keyspace within: -![](db-setup-1024x582.png) +![](db-setup-1024x582.jpg) (Note – screens are accurate at the time of publication but might have changed since) diff --git a/content/posts/2021/12/17/what-is-gitops-what-are-its-benefits/index.md b/content/posts/2021/12/17/what-is-gitops-what-are-its-benefits/index.md index 9752bd0e0..0cdde9c83 100644 --- a/content/posts/2021/12/17/what-is-gitops-what-are-its-benefits/index.md +++ b/content/posts/2021/12/17/what-is-gitops-what-are-its-benefits/index.md @@ -6,7 +6,7 @@ description: "Let's understand what GitOps is and its benefits and learn how Arg canonical: "https://ashishtechmill.com/what-is-gitops-and-what-are-its-benefits" authors: - "yrashish" -image: "https://cdn.hashnode.com/res/hashnode/image/upload/v1636304168731/qHmKbqm_y.jpeg" +image: "qHmKbqm_y-72a1bef0.jpeg" categories: - "Books" - "DevOps" @@ -18,7 +18,7 @@ frozen: false The following article is an excerpt from my book **Effortless Cloud-Native App Development Using Skaffold** from Packt Publishing. -![B17385_Mockup Cover_High Res.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1636304168731/qHmKbqm_y.jpeg) +![B17385_Mockup Cover_High Res.jpg](qHmKbqm_y-72a1bef0.jpeg) It is available for order from [Amazon.com](https://www.amazon.com/Effortless-Cloud-Native-Development-using-Skaffold/dp/1801077118) and directly from [Packt](https://www.packtpub.com/product/effortless-cloud-native-apps-development-using-skaffold/9781801077118). This excerpt comes from chapter 9: Creating a Production-Ready CI/CD Pipeline with Skaffold: diff --git a/content/posts/2021/12/17/what-is-gitops-what-are-its-benefits/qHmKbqm_y-72a1bef0.jpeg b/content/posts/2021/12/17/what-is-gitops-what-are-its-benefits/qHmKbqm_y-72a1bef0.jpeg new file mode 100644 index 000000000..b35caf224 Binary files /dev/null and b/content/posts/2021/12/17/what-is-gitops-what-are-its-benefits/qHmKbqm_y-72a1bef0.jpeg differ diff --git a/content/posts/2021/12/20/jdkmon-17-0-18-released/Vulnerabilities-found-1e936394.png b/content/posts/2021/12/20/jdkmon-17-0-18-released/Vulnerabilities-found-1e936394.png new file mode 100644 index 000000000..805884bb3 Binary files /dev/null and b/content/posts/2021/12/20/jdkmon-17-0-18-released/Vulnerabilities-found-1e936394.png differ diff --git a/content/posts/2021/12/20/jdkmon-17-0-18-released/Vulnerability-c84d23ab.jpg b/content/posts/2021/12/20/jdkmon-17-0-18-released/Vulnerability-c84d23ab.jpg new file mode 100644 index 000000000..b48cba494 Binary files /dev/null and b/content/posts/2021/12/20/jdkmon-17-0-18-released/Vulnerability-c84d23ab.jpg differ diff --git a/content/posts/2021/12/20/jdkmon-17-0-18-released/index.md b/content/posts/2021/12/20/jdkmon-17-0-18-released/index.md index f3c9e887b..5b72a3aad 100644 --- a/content/posts/2021/12/20/jdkmon-17-0-18-released/index.md +++ b/content/posts/2021/12/20/jdkmon-17-0-18-released/index.md @@ -66,10 +66,10 @@ JDKMon will check for all version numbers of the OpenJDK distributions it finds There is NO guarantee that the distribution you use is affected but at least you will be aware that there might be a CVE (Common Vulnerability and Exposure). The yellow circle in the screenshot below indicates that there are known vulnerabilities for OpenJDK 16.0.1. -![](https://i.ibb.co/LZkshY8/Vulnerability.png) +![](Vulnerability-c84d23ab.jpg) When you click on the yellow circle another window will pop up which shows you the related CVE's. -![](https://i.ibb.co/wr7yCkr/Vulnerabilities-found.png) +![](Vulnerabilities-found-1e936394.png) The CVE entries in that window are links that when clicked will open the clicked CVE in your standard browser with a more detailed description. diff --git a/content/posts/2022/01/03/the-state-of-pattern-matching-in-java-17/M6xKDas-2e32f482.jpeg b/content/posts/2022/01/03/the-state-of-pattern-matching-in-java-17/M6xKDas-2e32f482.jpeg new file mode 100644 index 000000000..293f66946 Binary files /dev/null and b/content/posts/2022/01/03/the-state-of-pattern-matching-in-java-17/M6xKDas-2e32f482.jpeg differ diff --git a/content/posts/2022/01/03/the-state-of-pattern-matching-in-java-17/index.md b/content/posts/2022/01/03/the-state-of-pattern-matching-in-java-17/index.md index 2304ac47a..2e3cd6f98 100644 --- a/content/posts/2022/01/03/the-state-of-pattern-matching-in-java-17/index.md +++ b/content/posts/2022/01/03/the-state-of-pattern-matching-in-java-17/index.md @@ -6,7 +6,7 @@ description: "Pattern matching is a language feature where you can test for a sp canonical: "https://deepu.tech/state-of-pattern-matching-java/" authors: - "deepu-sasidharan" -image: "https://i.imgur.com/M6xKDas.jpeg" +image: "M6xKDas-2e32f482.jpeg" categories: - "Java Core" related_posts: @@ -26,7 +26,7 @@ Pattern matching can be classified into two types. * **Sequence patterns**: pattern matching on character sequence or strings. Also known as our beloved Regular Expressions 😉 — I still wish I could write RegEx without cursing and looking up the syntax. * **Tree patterns**: testing for patterns on a data structure. This is what we are going to talk about today. -![regex meme](https://i.imgur.com/M6xKDas.jpeg) +![regex meme](M6xKDas-2e32f482.jpeg) ## Why Pattern Matching? diff --git a/content/posts/2022/01/04/different-approaches-to-building-stateful-microservices-in-the-cloud-native-world/12-factor-app-65cd2a07.jpg b/content/posts/2022/01/04/different-approaches-to-building-stateful-microservices-in-the-cloud-native-world/12-factor-app-65cd2a07.jpg new file mode 100644 index 000000000..5797b8820 Binary files /dev/null and b/content/posts/2022/01/04/different-approaches-to-building-stateful-microservices-in-the-cloud-native-world/12-factor-app-65cd2a07.jpg differ diff --git a/content/posts/2022/01/04/different-approaches-to-building-stateful-microservices-in-the-cloud-native-world/Prototype-Design-SAGA-demo-50d1adc4.jpg b/content/posts/2022/01/04/different-approaches-to-building-stateful-microservices-in-the-cloud-native-world/Prototype-Design-SAGA-demo-50d1adc4.jpg new file mode 100644 index 000000000..7c5cc31b8 Binary files /dev/null and b/content/posts/2022/01/04/different-approaches-to-building-stateful-microservices-in-the-cloud-native-world/Prototype-Design-SAGA-demo-50d1adc4.jpg differ diff --git a/content/posts/2022/01/04/different-approaches-to-building-stateful-microservices-in-the-cloud-native-world/index.md b/content/posts/2022/01/04/different-approaches-to-building-stateful-microservices-in-the-cloud-native-world/index.md index 58251015a..d54e3df96 100644 --- a/content/posts/2022/01/04/different-approaches-to-building-stateful-microservices-in-the-cloud-native-world/index.md +++ b/content/posts/2022/01/04/different-approaches-to-building-stateful-microservices-in-the-cloud-native-world/index.md @@ -6,7 +6,7 @@ description: "How can systems be able to manage and track the flow of data in a canonical: "https://www.javaadvent.com/2021/12/different-approaches-to-building-stateful-microservices-in-the-cloud-native-world.html" authors: - "mgrygles" -image: "https://www.javaadvent.com/content/uploads/2021/11/pexels-photo-164170.jpeg" +image: "pexels-photo-164170-7a0a6049.jpeg" categories: - "Cloud" - "Kubernetes" @@ -19,7 +19,7 @@ related_posts: frozen: false --- -![Snow-capped mountains and landscape with clouds](https://www.javaadvent.com/content/uploads/2021/11/pexels-photo-164170.jpeg)Cloud Native computing is all about working with stateless data and serverless systems. But we all live in a stateful world, in which data flows through systems interconnected with one another through complex networks. +![Snow-capped mountains and landscape with clouds](pexels-photo-164170-7a0a6049.jpeg)Cloud Native computing is all about working with stateless data and serverless systems. But we all live in a stateful world, in which data flows through systems interconnected with one another through complex networks. So how can systems be able to manage and track the flow of data in a coherent fashion and in a stateless world? @@ -91,7 +91,7 @@ JSON Web Token (JWT) offers a compact and self-contained way to securely transmi The [12-Factor App methodology](https://12factor.net/) from Heroku provides a set of guidelines for designing cloud native systems. -![undefined](https://www.javaadvent.com/content/uploads/2021/12/12-factor-app.png) +![undefined](12-factor-app-65cd2a07.jpg) As we can see, #6 and #9 epitomize the need for highly efficient and very lightweight, stateless processes. @@ -169,7 +169,7 @@ This form of the pattern uses an event-driven approach, in which the local trans *An simplified example design of an order processing system illustrating the concept of the choreography pattern:* -![undefined](https://www.javaadvent.com/content/uploads/2021/12/Prototype-Design-SAGA-demo.png) +![undefined](Prototype-Design-SAGA-demo-50d1adc4.jpg) * *An order gets generated when Kafka publishes an event to the topic, of which the Order microservice is a listener.* * *Upon creating the order entry into the database, the Order microservice generates an OrderCreated event of which the InventoryCheck and the CreditCheck microservices are the subscribers.* diff --git a/content/posts/2022/01/04/different-approaches-to-building-stateful-microservices-in-the-cloud-native-world/pexels-photo-164170-7a0a6049.jpeg b/content/posts/2022/01/04/different-approaches-to-building-stateful-microservices-in-the-cloud-native-world/pexels-photo-164170-7a0a6049.jpeg new file mode 100644 index 000000000..f04c114b9 Binary files /dev/null and b/content/posts/2022/01/04/different-approaches-to-building-stateful-microservices-in-the-cloud-native-world/pexels-photo-164170-7a0a6049.jpeg differ diff --git a/content/posts/2022/01/06/requirements-for-running-k8ssandra-for-development/docker-resources-1536x885-1.jpg b/content/posts/2022/01/06/requirements-for-running-k8ssandra-for-development/docker-resources-1536x885-1.jpg new file mode 100644 index 000000000..6b5f8ccf8 Binary files /dev/null and b/content/posts/2022/01/06/requirements-for-running-k8ssandra-for-development/docker-resources-1536x885-1.jpg differ diff --git a/content/posts/2022/01/06/requirements-for-running-k8ssandra-for-development/docker-resources-1536x885-1.png b/content/posts/2022/01/06/requirements-for-running-k8ssandra-for-development/docker-resources-1536x885-1.png deleted file mode 100644 index 20b22a7ae..000000000 Binary files a/content/posts/2022/01/06/requirements-for-running-k8ssandra-for-development/docker-resources-1536x885-1.png and /dev/null differ diff --git a/content/posts/2022/01/06/requirements-for-running-k8ssandra-for-development/index.md b/content/posts/2022/01/06/requirements-for-running-k8ssandra-for-development/index.md index 1be188f42..5f0e2f32e 100644 --- a/content/posts/2022/01/06/requirements-for-running-k8ssandra-for-development/index.md +++ b/content/posts/2022/01/06/requirements-for-running-k8ssandra-for-development/index.md @@ -6,7 +6,7 @@ description: "Learn how to configure K8ssandra for your development machine, and canonical: "https://k8ssandra.io/blog/articles/requirements-for-running-k8ssandra-for-development/" authors: - "alexander-dejanovski" -image: "docker-resources-1536x885-1.png" +image: "docker-resources-1536x885-1.jpg" categories: - "Apache Cassandra" - "Databases" diff --git a/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/1-COJ7cW5Hs9S0AbJv48FNiw-29994fae.jpg b/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/1-COJ7cW5Hs9S0AbJv48FNiw-29994fae.jpg new file mode 100644 index 000000000..eb657eaed Binary files /dev/null and b/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/1-COJ7cW5Hs9S0AbJv48FNiw-29994fae.jpg differ diff --git a/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/1-JjPtgol4Q0STKymKJdoTRg-3023c0ab.png b/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/1-JjPtgol4Q0STKymKJdoTRg-3023c0ab.png new file mode 100644 index 000000000..d8075a990 Binary files /dev/null and b/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/1-JjPtgol4Q0STKymKJdoTRg-3023c0ab.png differ diff --git a/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/1-RmDxQ1MX-_b-sO6z9SFjhw-cf86186d.jpg b/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/1-RmDxQ1MX-_b-sO6z9SFjhw-cf86186d.jpg new file mode 100644 index 000000000..009af644c Binary files /dev/null and b/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/1-RmDxQ1MX-_b-sO6z9SFjhw-cf86186d.jpg differ diff --git a/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/1-bU9AqwnDP7rv8Rvi_3Dh8w-204b2f8b.png b/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/1-bU9AqwnDP7rv8Rvi_3Dh8w-204b2f8b.png new file mode 100644 index 000000000..5d211c409 Binary files /dev/null and b/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/1-bU9AqwnDP7rv8Rvi_3Dh8w-204b2f8b.png differ diff --git a/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/1-ch1rdvwiz4slOBij7uuLnQ-7f6b6fe5.png b/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/1-ch1rdvwiz4slOBij7uuLnQ-7f6b6fe5.png new file mode 100644 index 000000000..7759e0de5 Binary files /dev/null and b/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/1-ch1rdvwiz4slOBij7uuLnQ-7f6b6fe5.png differ diff --git a/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/index.md b/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/index.md index 3b445becf..6a51e282e 100644 --- a/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/index.md +++ b/content/posts/2022/01/12/monitoring-spring-boot-applications-part-1/index.md @@ -94,24 +94,24 @@ Here is a summary of those commands: `Plugins` \> `javafx` and run the Maven goal: `javafx:run`. -![](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/02/run-javafx.gif) +![](run-javafx-84576e28.gif) #### More Visual Studio Code sample projects for JavaFX @@ -67,7 +67,7 @@ AWT is another framework that is popular among Java GUI application development. To enable the code completion for AWT, you can open the Command Palette (Ctrl+Shift+P) and then select the command Java: Help Center. Go to the Student section and select Enable AWT Development. Please note that this action will update a setting at the workspace level, so please make sure a workspace is opened in Visual Studio Code. Here is a demo of this feature: -![](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/02/enableawt-1.gif) +![](enableawt-1-f3abfa14.gif) After the setting is enabled, code completion will work on AWT applications! You can use [this basic sample code](https://code.visualstudio.com/docs/java/java-gui#_develop-awt-applications) to test your AWT on Visual Studio Code. @@ -85,11 +85,11 @@ In addition to unit testing and GUI applications, we are also seeing that Gradle This feature will help you to bootstrap a simple Gradle project with just a few steps. To use this feature, simply bring up the command palette (Ctrl+Shift+P), then run the "Java: Create Java Project", and select "Gradle" from the list. Currently this workflow supports both Groovy and Kotlin as your Domain Specific Language (DSL). -[![Create gradle project](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/02/gradle.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/02/gradle.png) +[![Create gradle project](gradle-17bcbaa8.png)](gradle-17bcbaa8.png) You can also click the "Create Java Project" button to use this feature. -[![Create Java Project](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/02/createjavaproject.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/02/createjavaproject.png) +[![Create Java Project](createjavaproject-18241329.png)](createjavaproject-18241329.png) Note that you will need to install the [Gradle for Java extension](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-gradle) to use this feature. To use all the new features mentioned above, please download the latest version of [Extension Pack for Java.](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) diff --git a/content/posts/2022/02/22/java-on-visual-studio-code-update-february-2022/run-javafx-84576e28.gif b/content/posts/2022/02/22/java-on-visual-studio-code-update-february-2022/run-javafx-84576e28.gif new file mode 100644 index 000000000..00e346b3c Binary files /dev/null and b/content/posts/2022/02/22/java-on-visual-studio-code-update-february-2022/run-javafx-84576e28.gif differ diff --git a/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/Ajtf6FNyK-46a8defe.jpg b/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/Ajtf6FNyK-46a8defe.jpg new file mode 100644 index 000000000..164c94f5f Binary files /dev/null and b/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/Ajtf6FNyK-46a8defe.jpg differ diff --git a/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/H9UUmLn9w-71220acb.png b/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/H9UUmLn9w-71220acb.png new file mode 100644 index 000000000..db81898b5 Binary files /dev/null and b/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/H9UUmLn9w-71220acb.png differ diff --git a/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/V3jr2ulab-b9eaa668.jpg b/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/V3jr2ulab-b9eaa668.jpg new file mode 100644 index 000000000..aba6bc5b0 Binary files /dev/null and b/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/V3jr2ulab-b9eaa668.jpg differ diff --git a/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/index.md b/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/index.md index e871949c8..9f9c61531 100644 --- a/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/index.md +++ b/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/index.md @@ -48,7 +48,7 @@ The reason is performance. The more elements you inspect, the slower the applica If the application feels slow, disable such instrumentations. If possible, invest in newer hardware. Especially more RAM. Also, make sure we allocate enough of that RAM for the IDE! -![Show Method Return Values](https://cdn.hashnode.com/res/hashnode/image/upload/v1645613449451/H9UUmLn9w.png) +![Show Method Return Values](H9UUmLn9w-71220acb.png) ## IntelliJ Jump to Line @@ -74,7 +74,7 @@ E.g. when you're debugging and want to make sure that the object you're looking You can use this in conditional breakpoints to stop at the right location. It's an amazingly useful feature. -![Mark Objects Menu](https://cdn.hashnode.com/res/hashnode/image/upload/v1645613600378/Ajtf6FNyK.png) +![Mark Objects Menu](Ajtf6FNyK-46a8defe.jpg) ## Return Immediately @@ -84,13 +84,13 @@ We can "just" force a return from a point before the errors occur and provide a This is a pretty niche feature, but when you need it, it's cool! -![Return Immediately](https://cdn.hashnode.com/res/hashnode/image/upload/v1645613199855/m3wMBWi1M.png) +![Return Immediately](m3wMBWi1M-63680384.jpg) ## Drop Frame This is something I didn't have time for. I plan to cover it in a future video. It's essentially an "undo" of a step into operation. The stack is just unwinded by it. It doesn't restore the state though, so it isn't an exact "undo" operation. -![Drop Frame](https://cdn.hashnode.com/res/hashnode/image/upload/v1645613256588/V3jr2ulab.png) +![Drop Frame](V3jr2ulab-b9eaa668.jpg) Eagle eyed readers will also notice a feature called "Throw Exception" which does exactly that. Its useful for some edge cases as validating code robustness and failure behavior. I'll try to address that too in the future. diff --git a/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/m3wMBWi1M-63680384.jpg b/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/m3wMBWi1M-63680384.jpg new file mode 100644 index 000000000..2e11c5c12 Binary files /dev/null and b/content/posts/2022/03/02/debugging-tutorial-java-return-value-intellij-jump-to-line-and-more/m3wMBWi1M-63680384.jpg differ diff --git a/content/posts/2022/03/09/vaadin-and-jooq-match-made-in-heaven/index.md b/content/posts/2022/03/09/vaadin-and-jooq-match-made-in-heaven/index.md index b4e91c616..e1a99b9df 100644 --- a/content/posts/2022/03/09/vaadin-and-jooq-match-made-in-heaven/index.md +++ b/content/posts/2022/03/09/vaadin-and-jooq-match-made-in-heaven/index.md @@ -5,7 +5,7 @@ lastmod: "2022-03-10T10:03:41+00:00" description: "Quickly learn how easy it is to create data-centric web applications with the combination of Vaadin and jOOQ!" authors: - "simon-martinelli" -image: "vqs.png" +image: "vqs.jpg" categories: - "jOOQ" - "Vaadin" diff --git a/content/posts/2022/03/09/vaadin-and-jooq-match-made-in-heaven/vqs.jpg b/content/posts/2022/03/09/vaadin-and-jooq-match-made-in-heaven/vqs.jpg new file mode 100644 index 000000000..e5bcd56f9 Binary files /dev/null and b/content/posts/2022/03/09/vaadin-and-jooq-match-made-in-heaven/vqs.jpg differ diff --git a/content/posts/2022/03/09/vaadin-and-jooq-match-made-in-heaven/vqs.png b/content/posts/2022/03/09/vaadin-and-jooq-match-made-in-heaven/vqs.png deleted file mode 100644 index 91be3fd88..000000000 Binary files a/content/posts/2022/03/09/vaadin-and-jooq-match-made-in-heaven/vqs.png and /dev/null differ diff --git a/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/EaanAUH2v-38b67fec.png b/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/EaanAUH2v-38b67fec.png new file mode 100644 index 000000000..83ff8bc06 Binary files /dev/null and b/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/EaanAUH2v-38b67fec.png differ diff --git a/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/P4t7kgylN-72479abf.png b/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/P4t7kgylN-72479abf.png new file mode 100644 index 000000000..3b1023ae4 Binary files /dev/null and b/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/P4t7kgylN-72479abf.png differ diff --git a/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/USe1wFdYi-8f7829ef.jpg b/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/USe1wFdYi-8f7829ef.jpg new file mode 100644 index 000000000..68ad8bac0 Binary files /dev/null and b/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/USe1wFdYi-8f7829ef.jpg differ diff --git a/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/ek78x3KEy-f8b53e3e.png b/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/ek78x3KEy-f8b53e3e.png new file mode 100644 index 000000000..4890a1fc5 Binary files /dev/null and b/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/ek78x3KEy-f8b53e3e.png differ diff --git a/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/g7bVJy9ie-30b3e0b8.jpg b/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/g7bVJy9ie-30b3e0b8.jpg new file mode 100644 index 000000000..3983f0b62 Binary files /dev/null and b/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/g7bVJy9ie-30b3e0b8.jpg differ diff --git a/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/index.md b/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/index.md index b9d14a736..7d3beb060 100644 --- a/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/index.md +++ b/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/index.md @@ -42,7 +42,7 @@ Method breakpoints stop when you enter a method and potentially when you exit it There is an interesting use case of method breakpoints which I will discuss in the next blog post on the subject. So [make sure you follow](https://twitter.com/debugagent)... It's an interesting one! -![Method Breakpoint](https://cdn.hashnode.com/res/hashnode/image/upload/v1646852333339/P4t7kgylN.png) +![Method Breakpoint](P4t7kgylN-72479abf.png) ### Field Watchpoint @@ -50,7 +50,7 @@ This isn't a breakpoint since the execution never stops at the field. It stops i This is a remarkably useful feature that very few developers use. "Who changed this field" is a debugging cliché, yet developers still aren't aware of this feature (or forget it exists). -![Field Watchpoint](https://cdn.hashnode.com/res/hashnode/image/upload/v1646852372466/EaanAUH2v.png) +![Field Watchpoint](EaanAUH2v-38b67fec.png) ### Exception Breakpoint @@ -74,7 +74,7 @@ This effectively means I will stop only if this method is invoked using a differ This is an amazing tool… -![Conditional Breakpoint](https://cdn.hashnode.com/res/hashnode/image/upload/v1646852537167/ek78x3KEy.png) +![Conditional Breakpoint](ek78x3KEy-f8b53e3e.png) ## Managing Breakpoints @@ -90,11 +90,11 @@ You can add a description to a breakpoint to remind you why it's there. E.g. if But if you're like me, you might see it in the breakpoint window and forget what it's there. Then just delete it. By editing the description, you can remind yourself why you added that breakpoint in the first place. It's also very useful for pair debugging. Making sure we're on the same page… -![Naming Breakpoints](https://cdn.hashnode.com/res/hashnode/image/upload/v1646852690499/USe1wFdYi.png) +![Naming Breakpoints](USe1wFdYi-8f7829ef.jpg) Grouping takes this to the next level. You can place several breakpoints in a group. E.g. "Debug Issue 333". Then you can disable or enable the group as a whole. This is something I use for context switching. I sometimes need to work on a different task while I'm in the midst of debugging. I don't remember "where I was". So I can just group the applicable breakpoints and disable them until I "get back". -![Grouping Breakpoints](https://cdn.hashnode.com/res/hashnode/image/upload/v1646852715883/stfGtUZaa.png) +![Grouping Breakpoints](stfGtUZaa-8fdae2f8.jpg) ### Disable Until @@ -110,7 +110,7 @@ This is something I see people doing manually all the time. Setting the low traf We can use a breakpoint as an ad hoc log that doesn't suspend execution. You can just add printouts which can include expressions, etc. While this has some limitations, it's still a pretty cool feature. -![Tracepoint](https://cdn.hashnode.com/res/hashnode/image/upload/v1646852640259/g7bVJy9ie.png) +![Tracepoint](g7bVJy9ie-30b3e0b8.jpg) ## TL;DR diff --git a/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/stfGtUZaa-8fdae2f8.jpg b/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/stfGtUZaa-8fdae2f8.jpg new file mode 100644 index 000000000..6f5fc9159 Binary files /dev/null and b/content/posts/2022/03/17/the-basics-of-breakpoints-you-might-not-know/stfGtUZaa-8fdae2f8.jpg differ diff --git a/content/posts/2022/03/23/debugging-race-conditions-in-production/7UuAgc5oc-77bb44b9.jpg b/content/posts/2022/03/23/debugging-race-conditions-in-production/7UuAgc5oc-77bb44b9.jpg new file mode 100644 index 000000000..b87f15e98 Binary files /dev/null and b/content/posts/2022/03/23/debugging-race-conditions-in-production/7UuAgc5oc-77bb44b9.jpg differ diff --git a/content/posts/2022/03/23/debugging-race-conditions-in-production/8YPXrjo3W-cdd71c3b.png b/content/posts/2022/03/23/debugging-race-conditions-in-production/8YPXrjo3W-cdd71c3b.png new file mode 100644 index 000000000..77079f845 Binary files /dev/null and b/content/posts/2022/03/23/debugging-race-conditions-in-production/8YPXrjo3W-cdd71c3b.png differ diff --git a/content/posts/2022/03/23/debugging-race-conditions-in-production/YlIQ34Aa1-f3990930.jpg b/content/posts/2022/03/23/debugging-race-conditions-in-production/YlIQ34Aa1-f3990930.jpg new file mode 100644 index 000000000..923814d63 Binary files /dev/null and b/content/posts/2022/03/23/debugging-race-conditions-in-production/YlIQ34Aa1-f3990930.jpg differ diff --git a/content/posts/2022/03/23/debugging-race-conditions-in-production/index.md b/content/posts/2022/03/23/debugging-race-conditions-in-production/index.md index e76a45d32..40d54462d 100644 --- a/content/posts/2022/03/23/debugging-race-conditions-in-production/index.md +++ b/content/posts/2022/03/23/debugging-race-conditions-in-production/index.md @@ -52,7 +52,7 @@ This is pretty easy to do with Lightrun. We can log the thread that is in the su The easiest thing we can do is add a log entry such as this: -![Create Log](https://cdn.hashnode.com/res/hashnode/image/upload/v1647171179152/m6wbPhDJb.png) +![Create Log](m6wbPhDJb-d7f238a9.jpg) The log prints "Thread {`Thread.currentThread().getName()`} entered", we can add the corresponding "exited" version at the end of the piece of code. But this brings us to a fresh problem. @@ -62,7 +62,7 @@ The solution is a multi-part solution. First, we can use logs as we did above to Next, we need to verify that there's a large volume of requests. For that, we can add a counter: -![Create Counter](https://cdn.hashnode.com/res/hashnode/image/upload/v1647171229573/7UuAgc5oc.png) +![Create Counter](7UuAgc5oc-77bb44b9.jpg) We can also narrow this further by limiting the counting to a specific thread e.g. for "Thread 1" we can set the condition to: @@ -72,7 +72,7 @@ Thread.currentThread().getName().equals("Thread 1") Finally, we can use a snapshot with multiple captures: -![Create Snapshot](https://cdn.hashnode.com/res/hashnode/image/upload/v1647171271171/YlIQ34Aa1.png) +![Create Snapshot](YlIQ34Aa1-f3990930.jpg) Notice the "Max Hit Count" below. It will trigger 20 separate hits. We can then review them and see the corresponding stack traces. If the path doesn't include synchronization or includes a bad monitor, there could be a problem here. @@ -88,7 +88,7 @@ Here we add a multi-hit snapshot when the setter method is invoked with a differ The condition is: -![Snapshot with different condition](https://cdn.hashnode.com/res/hashnode/image/upload/v1647171321596/8YPXrjo3W.png) +![Snapshot with different condition](8YPXrjo3W-cdd71c3b.png) ```java !Thread.currentThread().getName().equals("Thread 1") diff --git a/content/posts/2022/03/23/debugging-race-conditions-in-production/m6wbPhDJb-d7f238a9.jpg b/content/posts/2022/03/23/debugging-race-conditions-in-production/m6wbPhDJb-d7f238a9.jpg new file mode 100644 index 000000000..e677f8155 Binary files /dev/null and b/content/posts/2022/03/23/debugging-race-conditions-in-production/m6wbPhDJb-d7f238a9.jpg differ diff --git a/content/posts/2022/03/24/full-stream-ahead-astra-streaming-powered-by-apache-pulsar/iceberg-1024x705.jpg b/content/posts/2022/03/24/full-stream-ahead-astra-streaming-powered-by-apache-pulsar/iceberg-1024x705.jpg new file mode 100644 index 000000000..3cb68c042 Binary files /dev/null and b/content/posts/2022/03/24/full-stream-ahead-astra-streaming-powered-by-apache-pulsar/iceberg-1024x705.jpg differ diff --git a/content/posts/2022/03/24/full-stream-ahead-astra-streaming-powered-by-apache-pulsar/iceberg-1024x705.png b/content/posts/2022/03/24/full-stream-ahead-astra-streaming-powered-by-apache-pulsar/iceberg-1024x705.png deleted file mode 100644 index 2256656e8..000000000 Binary files a/content/posts/2022/03/24/full-stream-ahead-astra-streaming-powered-by-apache-pulsar/iceberg-1024x705.png and /dev/null differ diff --git a/content/posts/2022/03/24/full-stream-ahead-astra-streaming-powered-by-apache-pulsar/index.md b/content/posts/2022/03/24/full-stream-ahead-astra-streaming-powered-by-apache-pulsar/index.md index 1e34433ab..e723beb38 100644 --- a/content/posts/2022/03/24/full-stream-ahead-astra-streaming-powered-by-apache-pulsar/index.md +++ b/content/posts/2022/03/24/full-stream-ahead-astra-streaming-powered-by-apache-pulsar/index.md @@ -39,7 +39,7 @@ These capabilities provide a foundational platform to rapidly build data-driven, Astra Streaming isn't only a tool for developers to increase their productivity and help them build high performance data driven applications. Data in motion is becoming an increasing priority for modern enterprises. According to Forrester Research, more than three-quarters of modern enterprises use real-time, actionable data for at least some of their applications. If you look at the aggregate total of data within an enterprise, you are likely to find something that looks like this: -![](iceberg-1024x705.png) +![](iceberg-1024x705.jpg) The vast amount of data in motion that's present within a given enterprise is often trapped in aging message-oriented middleware systems like MQ and JMS. These systems generally treat data as transient and discard it immediately after delivering it to consuming applications that have subscribed to a given message topic. diff --git a/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731188-led-button-bb-1efc1a47.png b/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731188-led-button-bb-1efc1a47.png new file mode 100644 index 000000000..a917ce746 Binary files /dev/null and b/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731188-led-button-bb-1efc1a47.png differ diff --git a/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731189-startvaadin-fe92e18f.jpg b/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731189-startvaadin-fe92e18f.jpg new file mode 100644 index 000000000..ddcf4a019 Binary files /dev/null and b/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731189-startvaadin-fe92e18f.jpg differ diff --git a/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731191-ui-led-8303d034.png b/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731191-ui-led-8303d034.png new file mode 100644 index 000000000..ec7d84dfd Binary files /dev/null and b/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731191-ui-led-8303d034.png differ diff --git a/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731192-ui-button-13d3157f.png b/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731192-ui-button-13d3157f.png new file mode 100644 index 000000000..d635db8ae Binary files /dev/null and b/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731192-ui-button-13d3157f.png differ diff --git a/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731197-ui-about-34c99337.jpg b/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731197-ui-about-34c99337.jpg new file mode 100644 index 000000000..32ed3506a Binary files /dev/null and b/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731197-ui-about-34c99337.jpg differ diff --git a/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731206-screenshot-2022-03-17-at-164350-5d31f992.jpg b/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731206-screenshot-2022-03-17-at-164350-5d31f992.jpg new file mode 100644 index 000000000..83aa3d3da Binary files /dev/null and b/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/15731206-screenshot-2022-03-17-at-164350-5d31f992.jpg differ diff --git a/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/index.md b/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/index.md index 9784f6c20..ad0e0c075 100644 --- a/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/index.md +++ b/content/posts/2022/03/25/blink-a-led-on-raspberry-pi-with-vaadin/index.md @@ -6,7 +6,7 @@ description: "Thanks to Vaadin, you can get a fully running application with a f canonical: "https://dzone.com/articles/blink-a-led-on-a-raspberry-pi-with-vaadin" authors: - "frankdelporte" -image: "https://dz2cdn1.dzone.com/storage/temp/15731206-screenshot-2022-03-17-at-164350.jpg" +image: "15731206-screenshot-2022-03-17-at-164350-5d31f992.jpg" categories: - "Embedded" - "Pi4J" @@ -36,7 +36,7 @@ But JavaFX has one missing piece: running it in the browser... Yes, [**JPRO**](h And yes, there are some projects ongoing to bring JavaFX fully to the browser, but they are ongoing and not mature yet... Let's look at another approach: Vaadin Flow and run it on a Raspberry Pi to control a LED and show the state of a button. -![](https://dz2cdn1.dzone.com/storage/temp/15731206-screenshot-2022-03-17-at-164350.jpg) +![](15731206-screenshot-2022-03-17-at-164350-5d31f992.jpg) ## About Vaadin @@ -75,7 +75,7 @@ And one final pro for the Raspberry Pi: its power! The 4-version is fast and has ## Example Spring + Vaadin + Pi4J application Let's create a Spring-based demo project to illustrate how a Vaadin User Interface (website) can interact with the GPIOs of a Raspberry Pi by using the [Pi4J library](https://www.pi4j.com). The GPIO interaction is based on the [Pi4J minimal example application](https://pi4j.com/getting-started/minimal-example-application/) and uses a button and a LED to demonstrate the digital input and output interaction. The wiring is very simple and only needs a few components. -![Wiring diagram](https://dz2cdn1.dzone.com/storage/temp/15731188-led-button-bb.png) Breadboard wiring +![Wiring diagram](15731188-led-button-bb-1efc1a47.png) Breadboard wiring The base code was generated on [start.vaadin.com/app](https://start.vaadin.com/app) with the following selections: @@ -84,7 +84,7 @@ The base code was generated on [start.vaadin.com/app](https://start.vaadin.com/a * Flow (Java only) * Extra page and custom icons -![Start Vaadin website](https://dz2cdn1.dzone.com/storage/temp/15731189-startvaadin.png) Start Vaadin website +![Start Vaadin website](15731189-startvaadin-fe92e18f.jpg) Start Vaadin website Download the sources, unzip and open in your preferred IDE. It's a Maven project, so you can immediately run it and check the code that was generated automatically. When you start it, the application will be available on \[http://localhost:8080\](http://localhost:8080). @@ -221,7 +221,7 @@ public class ButtonView extends HorizontalLayout implements ButtonListener { } ``` -![](https://dz2cdn1.dzone.com/storage/temp/15731191-ui-led.png) +![](15731191-ui-led-8303d034.png) ### UI to see the state of the button @@ -255,7 +255,7 @@ public class ButtonView extends HorizontalLayout implements ButtonListener { } ``` -![](https://dz2cdn1.dzone.com/storage/temp/15731192-ui-button.png) +![](15731192-ui-button-13d3157f.png) An additional change is needed in the main class. Because we want to send changes from the `backend` to the `user interface` we need to add the [@Push attribute](https://vaadin.com/docs/latest/flow/advanced/server-push). This tiny change, allows you to update the UI from the server, without the user explicitly requesting updates. This is based on a client-server connection (WebSocket if supported, or alternative) which the client establishes and the server can then use to send updates to the client. @@ -290,7 +290,7 @@ public class AboutView extends VerticalLayout { } ``` -![](https://dz2cdn1.dzone.com/storage/temp/15731197-ui-about.png) +![](15731197-ui-about-34c99337.jpg) ## Build and upload to Raspberry Pi diff --git a/content/posts/2022/03/29/debugging-java-equals-hashcode-performance-in-production/Te7eFefiM-137179b5.png b/content/posts/2022/03/29/debugging-java-equals-hashcode-performance-in-production/Te7eFefiM-137179b5.png new file mode 100644 index 000000000..2820d7ef3 Binary files /dev/null and b/content/posts/2022/03/29/debugging-java-equals-hashcode-performance-in-production/Te7eFefiM-137179b5.png differ diff --git a/content/posts/2022/03/29/debugging-java-equals-hashcode-performance-in-production/bBAQdRv-m-0becdd43.jpg b/content/posts/2022/03/29/debugging-java-equals-hashcode-performance-in-production/bBAQdRv-m-0becdd43.jpg new file mode 100644 index 000000000..6b37a831b Binary files /dev/null and b/content/posts/2022/03/29/debugging-java-equals-hashcode-performance-in-production/bBAQdRv-m-0becdd43.jpg differ diff --git a/content/posts/2022/03/29/debugging-java-equals-hashcode-performance-in-production/index.md b/content/posts/2022/03/29/debugging-java-equals-hashcode-performance-in-production/index.md index 5ccafb105..009edebde 100644 --- a/content/posts/2022/03/29/debugging-java-equals-hashcode-performance-in-production/index.md +++ b/content/posts/2022/03/29/debugging-java-equals-hashcode-performance-in-production/index.md @@ -48,7 +48,7 @@ What we would see on the APM is the slow performance of a web service. We can na Note: Before we proceed, I assume you're familiar with the basics of Lightrun and have it installed. If not, please check out [this introduction](https://docs.lightrun.com/). -![Metrics Menu](https://cdn.hashnode.com/res/hashnode/image/upload/v1647872819348/bBAQdRv-m.png) +![Metrics Menu](bBAQdRv-m-0becdd43.jpg) Lightrun includes the ability to set several metric types: @@ -61,7 +61,7 @@ Notice that you can use conditions on all metrics. If performance overhead impac We can now use these tools to narrow down performance problems and find the root cause, e.g. here I can check if these two lines in the method are at fault: -![Adding a TicToc](https://cdn.hashnode.com/res/hashnode/image/upload/v1647872936169/rjeROuI1U.png) +![Adding a TicToc](rjeROuI1U-2575bbf8.png) Adding this tictoc provides us with periodical printouts like this: @@ -95,7 +95,7 @@ E.g. in a key values store, if a separate thread mutates the key, the store migh The simplest way to do this is log the current thread using the condition Current thread is: `{Thread.currentThread().getName()}`: -![Debug threading issue](https://cdn.hashnode.com/res/hashnode/image/upload/v1647873079232/Te7eFefiM.png) +![Debug threading issue](Te7eFefiM-137179b5.png) The problem is that a condition like this can trigger output that's hard to follow, you might see hundreds of printouts. So once we find out the name of the thread, we can add a condition: diff --git a/content/posts/2022/03/29/debugging-java-equals-hashcode-performance-in-production/rjeROuI1U-2575bbf8.png b/content/posts/2022/03/29/debugging-java-equals-hashcode-performance-in-production/rjeROuI1U-2575bbf8.png new file mode 100644 index 000000000..9c89478a3 Binary files /dev/null and b/content/posts/2022/03/29/debugging-java-equals-hashcode-performance-in-production/rjeROuI1U-2575bbf8.png differ diff --git a/content/posts/2022/03/29/increasing-event-streaming-with-kafka-and-azul/Kafka-architecture-1-1024x655-dbd891e4.jpg b/content/posts/2022/03/29/increasing-event-streaming-with-kafka-and-azul/Kafka-architecture-1-1024x655-dbd891e4.jpg new file mode 100644 index 000000000..b818d04d5 Binary files /dev/null and b/content/posts/2022/03/29/increasing-event-streaming-with-kafka-and-azul/Kafka-architecture-1-1024x655-dbd891e4.jpg differ diff --git a/content/posts/2022/03/29/increasing-event-streaming-with-kafka-and-azul/Platform-Prime-1024x613-76a049e8.png b/content/posts/2022/03/29/increasing-event-streaming-with-kafka-and-azul/Platform-Prime-1024x613-76a049e8.png new file mode 100644 index 000000000..869cffab4 Binary files /dev/null and b/content/posts/2022/03/29/increasing-event-streaming-with-kafka-and-azul/Platform-Prime-1024x613-76a049e8.png differ diff --git a/content/posts/2022/03/29/increasing-event-streaming-with-kafka-and-azul/Zulu-builds-of-OpenJDK-1024x400-e2382cc1.png b/content/posts/2022/03/29/increasing-event-streaming-with-kafka-and-azul/Zulu-builds-of-OpenJDK-1024x400-e2382cc1.png new file mode 100644 index 000000000..3bf3e7c98 Binary files /dev/null and b/content/posts/2022/03/29/increasing-event-streaming-with-kafka-and-azul/Zulu-builds-of-OpenJDK-1024x400-e2382cc1.png differ diff --git a/content/posts/2022/03/29/increasing-event-streaming-with-kafka-and-azul/index.md b/content/posts/2022/03/29/increasing-event-streaming-with-kafka-and-azul/index.md index aeec74393..f6e400e0f 100644 --- a/content/posts/2022/03/29/increasing-event-streaming-with-kafka-and-azul/index.md +++ b/content/posts/2022/03/29/increasing-event-streaming-with-kafka-and-azul/index.md @@ -64,7 +64,7 @@ Instead of the traditionally centralized event streaming architectures, Kafka ta A Kafka cluster can have many brokers that supply high availability and redundancy for producers and consumers. Each broker holds zero or more topics, and each topic can be split up into one-to-many partitions. For increased performance and availability, the partitions are replicated across brokers. What's great about brokers is they each do not have to be in the same geographic region. -![Kafka architecture](https://www.azul.com/wp-content/uploads/Kafka-architecture-1-1024x655.png) +![Kafka architecture](Kafka-architecture-1-1024x655-dbd891e4.jpg) Microservice applications (producers) can push messages (events) to topics and other applications (consumers) can pull messages from topics. The consumers of topics can process, transform, and enrich data streams. It can also dynamically create a new stream of data for other consumers. @@ -99,10 +99,10 @@ The following is the JDK version to download: * x86 64-bit The following is the download page of the Azul Zulu Prime Builds of OpenJDK: -[![](https://www.azul.com/wp-content/uploads/Platform-Prime-1024x613.png)](https://www.azul.com/products/prime/stream-download/) +[![](Platform-Prime-1024x613-76a049e8.png)](https://www.azul.com/products/prime/stream-download/) The following is the download page of the Azul Zulu Builds of OpenJDK: -[![](https://www.azul.com/wp-content/uploads/Zulu-builds-of-OpenJDK-1024x400.png)](https://www.azul.com/downloads/?package=jdk#download-openjdk) +[![](Zulu-builds-of-OpenJDK-1024x400-e2382cc1.png)](https://www.azul.com/downloads/?package=jdk#download-openjdk) After downloading the binaries you'll want to decompress the files to a local directory. diff --git a/content/posts/2022/04/04/debugging-jaxb-production-issues/5eqDoijKv-05a4a3c2.jpg b/content/posts/2022/04/04/debugging-jaxb-production-issues/5eqDoijKv-05a4a3c2.jpg new file mode 100644 index 000000000..d18c18579 Binary files /dev/null and b/content/posts/2022/04/04/debugging-jaxb-production-issues/5eqDoijKv-05a4a3c2.jpg differ diff --git a/content/posts/2022/04/04/debugging-jaxb-production-issues/EXR0PHzNg-c5086446.jpg b/content/posts/2022/04/04/debugging-jaxb-production-issues/EXR0PHzNg-c5086446.jpg new file mode 100644 index 000000000..e9f4d5d49 Binary files /dev/null and b/content/posts/2022/04/04/debugging-jaxb-production-issues/EXR0PHzNg-c5086446.jpg differ diff --git a/content/posts/2022/04/04/debugging-jaxb-production-issues/GffXo6YTV-43000d2f.png b/content/posts/2022/04/04/debugging-jaxb-production-issues/GffXo6YTV-43000d2f.png new file mode 100644 index 000000000..c81f88e7b Binary files /dev/null and b/content/posts/2022/04/04/debugging-jaxb-production-issues/GffXo6YTV-43000d2f.png differ diff --git a/content/posts/2022/04/04/debugging-jaxb-production-issues/_kiT_rZj4-44572ec6.png b/content/posts/2022/04/04/debugging-jaxb-production-issues/_kiT_rZj4-44572ec6.png new file mode 100644 index 000000000..f1d118f3c Binary files /dev/null and b/content/posts/2022/04/04/debugging-jaxb-production-issues/_kiT_rZj4-44572ec6.png differ diff --git a/content/posts/2022/04/04/debugging-jaxb-production-issues/i3mstdc2B-36719a81.jpg b/content/posts/2022/04/04/debugging-jaxb-production-issues/i3mstdc2B-36719a81.jpg new file mode 100644 index 000000000..704486e05 Binary files /dev/null and b/content/posts/2022/04/04/debugging-jaxb-production-issues/i3mstdc2B-36719a81.jpg differ diff --git a/content/posts/2022/04/04/debugging-jaxb-production-issues/iNvT4AX2X-1de127fc.png b/content/posts/2022/04/04/debugging-jaxb-production-issues/iNvT4AX2X-1de127fc.png new file mode 100644 index 000000000..dbd474fd5 Binary files /dev/null and b/content/posts/2022/04/04/debugging-jaxb-production-issues/iNvT4AX2X-1de127fc.png differ diff --git a/content/posts/2022/04/04/debugging-jaxb-production-issues/index.md b/content/posts/2022/04/04/debugging-jaxb-production-issues/index.md index 3ec17cd8f..52e9bf5e1 100644 --- a/content/posts/2022/04/04/debugging-jaxb-production-issues/index.md +++ b/content/posts/2022/04/04/debugging-jaxb-production-issues/index.md @@ -125,7 +125,7 @@ Once it's running, we can open the project in the IDE. I'll show the rest in Int As you recall from the code above, we can decode XML with the JAXB unmarshaller and encode it with marshaller. Our first step is to look for the marshaller. Using the Control-O shortcut (or Command-O on Mac) we can open the find class dialog and look for the Marshal interface: -![Screen Shot 2022-01-27 at 15.14.04.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1648536541148/GffXo6YTV.png) +![Screen Shot 2022-01-27 at 15.14.04.png](GffXo6YTV-43000d2f.png) This is why naming is so important. We can see that the JAXB runtime jar has a class that looks like the right implementation of the JAXB API. When we open it, we get the download source prompt (which you must click). @@ -133,7 +133,7 @@ Browsing through the code, we find the marshal methods that we invoke normally. Before we can see this happening, we need to create a new database user which we can do using the following curl command: -![Screen Shot 2022-01-27 at 15.18.42.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1648536726722/EXR0PHzNg.png) +![Screen Shot 2022-01-27 at 15.18.42.png](EXR0PHzNg-c5086446.jpg) ``` curl -X PUT -H "Content-Type: application/json" -d '{"login":"shai","password":"123456"}' http://localhost:8080/addUser @@ -149,17 +149,17 @@ curl -X POST -H "Content-Type: application/json" -H "Authorization: 46d37d7a-598 After that command is sent, you will see the snapshot representing the XML marshaling: -![Screen Shot 2022-01-27 at 15.21.56.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1648537102216/ogc6F0iMM.png) +![Screen Shot 2022-01-27 at 15.21.56.png](ogc6F0iMM-cd6923ee.jpg) In the variables view, you can deeply inspect every property, including the state of the JAXB reference implementation and every aspect of the request. The really cool thing is that you can go up the stack and see how you got there, literally inspect the object you passed into the JAXB API: -![Screen Shot 2022-01-27 at 15.28.29.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1648537232346/iNvT4AX2X.png) +![Screen Shot 2022-01-27 at 15.28.29.png](iNvT4AX2X-1de127fc.png) ## JAXB Unmarshaller The reading process is practically identical to the writing process. We open a class file and type Unmarshall into it (I didn't even need to finish typing): -![Screen Shot 2022-01-27 at 15.30.29.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1648537466786/_kiT_rZj4.png) +![Screen Shot 2022-01-27 at 15.30.29.png](_kiT_rZj4-44572ec6.png) The UnmarshallerImpl class includes a similar internal implementation method, specifically unmarshal0, which uses the SAX approach to parse the XML file. @@ -171,11 +171,11 @@ curl -H "Content-Type: application/json" -H "Authorization: 46d37d7a-5984-4acd-8 You need to update authorization like before. Notice you can set the value for the ID parameter from the values we saw in the previous stack: -![Screen Shot 2022-01-27 at 16.06.26.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1648537592431/5eqDoijKv.png) +![Screen Shot 2022-01-27 at 16.06.26.png](5eqDoijKv-05a4a3c2.jpg) Once we have that in place, we can add a snapshot and see the resulting stack: -![Screen Shot 2022-01-27 at 16.04.41.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1648537705035/i3mstdc2B.png) +![Screen Shot 2022-01-27 at 16.04.41.png](i3mstdc2B-36719a81.jpg) We can dig deeper similarly into the sax parser content tree and inspect an individual XML element. This approach makes it much easier to debug applications with XML. diff --git a/content/posts/2022/04/04/debugging-jaxb-production-issues/ogc6F0iMM-cd6923ee.jpg b/content/posts/2022/04/04/debugging-jaxb-production-issues/ogc6F0iMM-cd6923ee.jpg new file mode 100644 index 000000000..3223c9ea7 Binary files /dev/null and b/content/posts/2022/04/04/debugging-jaxb-production-issues/ogc6F0iMM-cd6923ee.jpg differ diff --git a/content/posts/2022/04/05/how-to-style-a-vaadin-application/4i8koa51nx4fol9sko1i-dedf6bd8.png b/content/posts/2022/04/05/how-to-style-a-vaadin-application/4i8koa51nx4fol9sko1i-dedf6bd8.png new file mode 100644 index 000000000..47fe9fcba Binary files /dev/null and b/content/posts/2022/04/05/how-to-style-a-vaadin-application/4i8koa51nx4fol9sko1i-dedf6bd8.png differ diff --git a/content/posts/2022/04/05/how-to-style-a-vaadin-application/50ek9lzuxks0rvt39y6n-d9759ffb.png b/content/posts/2022/04/05/how-to-style-a-vaadin-application/50ek9lzuxks0rvt39y6n-d9759ffb.png new file mode 100644 index 000000000..177c73484 Binary files /dev/null and b/content/posts/2022/04/05/how-to-style-a-vaadin-application/50ek9lzuxks0rvt39y6n-d9759ffb.png differ diff --git a/content/posts/2022/04/05/how-to-style-a-vaadin-application/gle8hdd9f89lwqus4mb8-a6d27f23.png b/content/posts/2022/04/05/how-to-style-a-vaadin-application/gle8hdd9f89lwqus4mb8-a6d27f23.png new file mode 100644 index 000000000..2a14659bb Binary files /dev/null and b/content/posts/2022/04/05/how-to-style-a-vaadin-application/gle8hdd9f89lwqus4mb8-a6d27f23.png differ diff --git a/content/posts/2022/04/05/how-to-style-a-vaadin-application/index.md b/content/posts/2022/04/05/how-to-style-a-vaadin-application/index.md index c23640546..97e881797 100644 --- a/content/posts/2022/04/05/how-to-style-a-vaadin-application/index.md +++ b/content/posts/2022/04/05/how-to-style-a-vaadin-application/index.md @@ -88,7 +88,7 @@ One easy way to customize the look and feel of our application requires us to ov For example, suppose our application has a bunch of TextField, ComboBox, DatePicker, and Button components. By default, they will look as follows: -![A Vaadin TextField, ComboBox, DatePicker, and Button with default look and feel.](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gle8hdd9f89lwqus4mb8.png) +![A Vaadin TextField, ComboBox, DatePicker, and Button with default look and feel.](gle8hdd9f89lwqus4mb8-a6d27f23.png) Suppose that we want to increase the roundedness of their corners. By default, the Lumo theme provides these components with a small rounded corner whose value is defined in the `--lumo-border-radius-m` variable. @@ -102,7 +102,7 @@ html { This style will increase the corner roundedness of many components at once, so that they will look similar to the following screenshot: -![A Vaadin TextField, ComboBox, DatePicker, and Button with increased corner roundedness.](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jlqwo3qrr1gac3s94i6g.png) +![A Vaadin TextField, ComboBox, DatePicker, and Button with increased corner roundedness.](jlqwo3qrr1gac3s94i6g-889426f6.png) But what if one wants to override the defaults for only a subset of components? No problem; simply use the name of the components as the CSS selector. @@ -116,7 +116,7 @@ vaadin-text-field, vaadin-combo-box { This will change the defaults for the TextField and ComboBox only, leaving other components, such as the DatePicker and Button, with their default values. -![A Vaadin TextField, ComboBox with increased corner roundedness. A Vaadin DatePicker, and Button with default look and feel.](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lrjca5ijn3rdfa2szh66.png) +![A Vaadin TextField, ComboBox with increased corner roundedness. A Vaadin DatePicker, and Button with default look and feel.](lrjca5ijn3rdfa2szh66-6c821527.png) ## How to selectively style views and components @@ -199,7 +199,7 @@ p { Now after the selective styling is applied, `MyView` will look as follows: -![MyView after selective styling](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ij7493vc0zx9vxhoza3p.png) +![MyView after selective styling](ij7493vc0zx9vxhoza3p.png) ## When to add CSS under the `/components` directory @@ -209,11 +209,11 @@ Custom styling of the internals of Vaadin components, such as the Grid or ComboB For example, let's assume we want to increase the size of the toggle icon that opens the dropdown menu of a ComboBox. -![ComboBox with an arrow pointing at toggle](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4i8koa51nx4fol9sko1i.png) +![ComboBox with an arrow pointing at toggle](4i8koa51nx4fol9sko1i-dedf6bd8.png) If we inspect this toggle in Chrome (right-click on the toggle and select the **Inspect** option), we will see that it has an attribute called `part` whose value is equal to `toggle-button`. -![A screenshot of a div Element in the DOM with a highlighted part attribute whose value is equal to toggle-button](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ta1xltpw3emxd76521cu.png) +![A screenshot of a div Element in the DOM with a highlighted part attribute whose value is equal to toggle-button](ta1xltpw3emxd76521cu-ddfeac65.png) To style this part, we need to create a file called `vaadin-combo-box.css` and place it under the `frontend/themes/myapp/components/` directory. In this file, we can do something like the following to increase the size of the ComboBox toggle. @@ -294,7 +294,7 @@ Suppose that we want to change the background color of the drop-down list of ite This background color is controlled by the `background-color` property of the `overlay` part of the `vaadin-combo-box-overlay` element. This `overlay` part in the DOM is highlighted in the following screenshot. -![Vaadin combo-box-overlay element in the DOM with the overlay part highlighted](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/50ek9lzuxks0rvt39y6n.png) +![Vaadin combo-box-overlay element in the DOM with the overlay part highlighted](50ek9lzuxks0rvt39y6n-d9759ffb.png) To selectively style the background of the overlay of the two ComboBox components, we can first give each one of them a theme name using the Java API as follows: diff --git a/content/posts/2022/04/05/how-to-style-a-vaadin-application/jlqwo3qrr1gac3s94i6g-889426f6.png b/content/posts/2022/04/05/how-to-style-a-vaadin-application/jlqwo3qrr1gac3s94i6g-889426f6.png new file mode 100644 index 000000000..367e33a7e Binary files /dev/null and b/content/posts/2022/04/05/how-to-style-a-vaadin-application/jlqwo3qrr1gac3s94i6g-889426f6.png differ diff --git a/content/posts/2022/04/05/how-to-style-a-vaadin-application/lrjca5ijn3rdfa2szh66-6c821527.png b/content/posts/2022/04/05/how-to-style-a-vaadin-application/lrjca5ijn3rdfa2szh66-6c821527.png new file mode 100644 index 000000000..089c088b6 Binary files /dev/null and b/content/posts/2022/04/05/how-to-style-a-vaadin-application/lrjca5ijn3rdfa2szh66-6c821527.png differ diff --git a/content/posts/2022/04/05/how-to-style-a-vaadin-application/ta1xltpw3emxd76521cu-ddfeac65.png b/content/posts/2022/04/05/how-to-style-a-vaadin-application/ta1xltpw3emxd76521cu-ddfeac65.png new file mode 100644 index 000000000..86db3d93f Binary files /dev/null and b/content/posts/2022/04/05/how-to-style-a-vaadin-application/ta1xltpw3emxd76521cu-ddfeac65.png differ diff --git a/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-3ttvaq3eCkpdPXnj-94cfe787.png b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-3ttvaq3eCkpdPXnj-94cfe787.png new file mode 100644 index 000000000..de6b6f363 Binary files /dev/null and b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-3ttvaq3eCkpdPXnj-94cfe787.png differ diff --git a/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-OAeiO0X8-ob8E7Ao-138b9a1e.png b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-OAeiO0X8-ob8E7Ao-138b9a1e.png new file mode 100644 index 000000000..d59d22872 Binary files /dev/null and b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-OAeiO0X8-ob8E7Ao-138b9a1e.png differ diff --git a/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-QMIuX6OHkdzv3HGM-e70ddfe1.jpg b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-QMIuX6OHkdzv3HGM-e70ddfe1.jpg new file mode 100644 index 000000000..de3db956e Binary files /dev/null and b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-QMIuX6OHkdzv3HGM-e70ddfe1.jpg differ diff --git a/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-ZlGt5IypIrbQjidT-5164e52c.png b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-ZlGt5IypIrbQjidT-5164e52c.png new file mode 100644 index 000000000..bbbb9e22d Binary files /dev/null and b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-ZlGt5IypIrbQjidT-5164e52c.png differ diff --git a/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-djc1iQKK1zR5CA_H-b1722e45.png b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-djc1iQKK1zR5CA_H-b1722e45.png new file mode 100644 index 000000000..f84f9bed9 Binary files /dev/null and b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-djc1iQKK1zR5CA_H-b1722e45.png differ diff --git a/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-f115pL_RsWcmbd76-3ea8b42d.png b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-f115pL_RsWcmbd76-3ea8b42d.png new file mode 100644 index 000000000..0b05df308 Binary files /dev/null and b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-f115pL_RsWcmbd76-3ea8b42d.png differ diff --git a/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-lmNF2Veec6mh8Y_r-50192489.png b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-lmNF2Veec6mh8Y_r-50192489.png new file mode 100644 index 000000000..866ef793f Binary files /dev/null and b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-lmNF2Veec6mh8Y_r-50192489.png differ diff --git a/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-rfUnK-b-XmqXUKeo-796e819c.png b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-rfUnK-b-XmqXUKeo-796e819c.png new file mode 100644 index 000000000..ae360f1d2 Binary files /dev/null and b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-rfUnK-b-XmqXUKeo-796e819c.png differ diff --git a/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-shJJ5LNp9eDcky6E-470e1df5.png b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-shJJ5LNp9eDcky6E-470e1df5.png new file mode 100644 index 000000000..21f3fe845 Binary files /dev/null and b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-shJJ5LNp9eDcky6E-470e1df5.png differ diff --git a/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-zLji7chRUuWSHxY4-64ed6c43.png b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-zLji7chRUuWSHxY4-64ed6c43.png new file mode 100644 index 000000000..5a491cd4d Binary files /dev/null and b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/0-zLji7chRUuWSHxY4-64ed6c43.png differ diff --git a/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/index.md b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/index.md index 983c9907b..061b86b87 100644 --- a/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/index.md +++ b/content/posts/2022/04/08/the-quest-to-the-os-java-native-memory-foojay-today/index.md @@ -5,7 +5,7 @@ lastmod: "2022-04-15T11:36:07+00:00" description: "Let’s embark on an epic journey to the wonderland of java native memory to the level of OS while investing in a non-trivial memory issue." authors: - "jakob-loehnertz" -image: "https://miro.medium.com/max/1400/0*QMIuX6OHkdzv3HGM" +image: "0-QMIuX6OHkdzv3HGM-e70ddfe1.jpg" categories: - "Java Core" related_posts: @@ -16,14 +16,14 @@ related_posts: frozen: true --- -![](https://miro.medium.com/max/1400/0*QMIuX6OHkdzv3HGM) +![](0-QMIuX6OHkdzv3HGM-e70ddfe1.jpg) As developers we want to spend most time on new features and improvements, providing value to our users or customers. However, all software inevitably contains bugs and other defects. A lot can be done to catch defects before software reaches production (something Picnic's automated fulfillment center team has [previously written about](https://blog.picnic.nl/reinventing-the-qa-process-25854fee51f3)) but some defects are likely to go undetected until the software is in the hands of users. One such case happened when Picnic's Distribution Systems team started to get notified that one of its deployments, the Fulfillment Service, was regularly killed and restarted by our Kubernetes cluster. This particular deployment houses many of the planning algorithms employed by Picnic, such as its [truck scheduling algorithm](https://blog.picnic.nl/its-in-our-dna-solving-logistics-problems-using-genetic-algorithms-a3d59e31558c). Luckily we have [a broad range of monitoring and observability tools](https://blog.picnic.nl/monitoring-and-observability-at-picnic-684cefd845c4) set up across Picnic. After a quick peek at our dashboards we noticed the offending deployment showed continuously growing memory usage, eventually hitting its 6GB limit causing it to be killed. -![](https://miro.medium.com/max/1352/0*shJJ5LNp9eDcky6E) *Memory consumption over time of a Fulfillment Service instance, until it gets killed at 6GB.* +![](0-shJJ5LNp9eDcky6E-470e1df5.png) *Memory consumption over time of a Fulfillment Service instance, until it gets killed at 6GB.* This scenario is indicative of a memory leak, when resources consuming system memory are allocated but never released. Developers dread such problems, because they're often tricky to reproduce and resolve. Not easily scared, we launched an investigation into what we assumed to be a memory leak. But after digging into the source of the problem, it turns out this behavior was not a memory leak, or at least not in the conventional sense. @@ -32,15 +32,15 @@ To understand this, we need to embark on a quest into the concept of Java native The heap is a JVM construct for memory management. Because of the heap and garbage collection developers don't have to perform memory allocations themselves. It is backed by physical memory requested from the OS by the JVM. The heap expands automatically based on the application's needs. However, it is bounded by a minimum and maximum size, specified through the JVM's `-Xms` and `-Xmx` options respectively. In the case of the Fulfillment Service, `-Xmx` is set to 4GB, so the heap alone should never exceed our 6GB container limit. This already rules out that the heap is solely responsible. But more interestingly, our dashboard reports only about 2.5GB of heap usage while the Fulfillment Service's container is already consuming 6GB. -![](https://miro.medium.com/max/858/0*f115pL_RsWcmbd76) *The Fulfillment Service's 2.5GB heap size is not even close to the 6GB used* +![](0-f115pL_RsWcmbd76-3ea8b42d.png) *The Fulfillment Service's 2.5GB heap size is not even close to the 6GB used* Having determined that Java is the only process running in our container we concluded there must be more to this problem and continued our quest. Any memory the JVM uses besides the heap is considered off-heap. There are a few categories of native memory that the JVM can track by default, such as memory used by the garbage collector, thread stacks, loaded classes, and more. To enable JVM native memory tracking we simply pass it the `-XX:NativeMemoryTracking=detail` flag, after which running `jcmd 1 VM.native_memory` (where 1 is our Java process ID) reports all native memory allocations known by the JVM. -![](https://miro.medium.com/max/1366/0*rfUnK-b-XmqXUKeo) *A (truncated) jcmd native memory report.* +![](0-rfUnK-b-XmqXUKeo-796e819c.png) *A (truncated) jcmd native memory report.* Conveniently, our monitoring also tracks all off-heap memory known to the JVM. -![](https://miro.medium.com/max/826/0*zLji7chRUuWSHxY4) *The Fulfillment Service's off-heap memory adds less than 500MB; still doesn't add up to 6GB.* +![](0-zLji7chRUuWSHxY4-64ed6c43.png) *The Fulfillment Service's off-heap memory adds less than 500MB; still doesn't add up to 6GB.* However, combining the heap and off-heap memory usage is still far from the 6GB limit. It turns out that there are various cases in which the JVM can allocate native memory without tracking it, taking us to the next level of this quest. @@ -51,7 +51,7 @@ Even though the JVM does not track its direct byte buffer memory usage by defaul Luckily, there are some tools around to deal with these problems. For instance, IBM's *Eclipse Memory Analyzer* extensions have a feature to [calculate the size of non-viewed non-phantomed direct byte buffers](https://www.ibm.com/docs/en/support-assistant/5.0.0?topic=se-directbytebuffers). But for us, the Picnic monitoring setup makes it easy to get this data from our production system without resorting to analyzing memory dumps. -![](https://miro.medium.com/max/826/0*ZlGt5IypIrbQjidT) *The Fulfillment Service is using around 600MB memory for direct buffers* +![](0-ZlGt5IypIrbQjidT-5164e52c.png) *The Fulfillment Service is using around 600MB memory for direct buffers* Unfortunately, adding this to all the previous sources of native memory usage we still end up with under 4GB of memory out of the 6GB we need to account for. However, we haven't yet exhausted the possible ways native memory can be allocated by the JVM. So again our quest carries on and we're now tasked with tracking all native memory allocations. @@ -60,24 +60,24 @@ The final possibility of native memory allocation from the JVM comes from librar These two functions, `malloc` and `free`, are implemented in their own library. The default on most flavors of Linux is GNU malloc, but it can be swapped out for other implementations. One such implementation is [`jemalloc`](https://github.com/jemalloc/jemalloc), which conveniently also allows tracking where `malloc` is being called from. This gives us the opportunity to see whether there are any native functions allocating increasing amounts of memory. On Linux, jemalloc can be enabled by bundling its shared library with an application and setting the `LD_PRELOAD` environment variable to the location of `libjemalloc.so` before running Java. Memory profiling can be enabled through the `MALLOC_CONF` environment variable. The `jemalloc` wiki contains [some useful examples](https://github.com/jemalloc/jemalloc/wiki/Use-Case%3A-Heap-Profiling). You can check the [`jemalloc` man page](http://jemalloc.net/jemalloc.3.html) for a full reference of these options. Now our application writes `.heap` files after a set volume of allocations. These files can be parsed using the `jeprof` command into something human-readable. -![](https://miro.medium.com/max/986/0*3ttvaq3eCkpdPXnj) *An extract from the* *jemalloc**profiling output. Here we see that* *Unsafe_allocateMemory0**calls* *malloc**. This function is responsible for allocating memory backing the direct byte buffers discussed above.* +![](0-3ttvaq3eCkpdPXnj-94cfe787.png) *An extract from the* *jemalloc**profiling output. Here we see that* *Unsafe_allocateMemory0**calls* *malloc**. This function is responsible for allocating memory backing the direct byte buffers discussed above.* `Jemalloc` only samples memory allocations instead of measuring every single `malloc` call to prevent excessive resource consumption. Therefore, the output of `jeprof` cannot be directly interpreted as the number of bytes currently in use. However, it does allow us to spot any suspicious functions allocating native memory. Additionally, we could also spot functions that are holding on to significantly more memory relative to others (potentially indicating a memory leak). In our case, we spotted neither. The only functions directly calling `malloc` were `Unsafe_allocateMemory0` and `AllocateHeap`, both of which are implemented in OpenJDK and were investigated through the other methods explained above. However, after we enabled `jemalloc` in the Fulfillment Service we observed something interesting: the memory had stopped growing and stabilized around 4GB. -![](https://miro.medium.com/max/1148/0*djc1iQKK1zR5CA_H) *The Fulfillment Service's Kubernetes memory usage shows very different behavior when jemalloc is enabled.* +![](0-djc1iQKK1zR5CA_H-b1722e45.png) *The Fulfillment Service's Kubernetes memory usage shows very different behavior when jemalloc is enabled.* Even though on the surface we had solved our problem, there must be a full explanation for this dramatic change. And our quest ensues, striving to unearth what was going on in the dangerous depths of our JVM's native memory. If there wouldn't be advantages to picking one `malloc` library over the other, there wouldn't be any competing implementations. In fact, there are a number of different `malloc` libraries, each having surprisingly different internals. As an example, let's look at GNU `malloc`, the `malloc` implementation originally used by our Fulfillment Service. Under the hood, GNU `malloc` uses various data structures to make memory allocations more efficient. One such data structure is a collection of heaps. When the application calls `malloc`, one of these heaps is searched for a contiguous free chunk of memory big enough to fit the request. When the application calls free, a chunk of the heap frees up, which can be reused by a future malloc call. An important detail is that only the topmost chunk of each heap is available for returning to the OS. All empty chunks in the middle of heaps will technically be unused, but still, count towards the memory the application is using. This is a very simplified view of what's happening; check the `glibc` wiki for a [complete overview of GNU `malloc` internals](https://sourceware.org/glibc/wiki/MallocInternals). -![](https://miro.medium.com/max/704/0*lmNF2Veec6mh8Y_r) *Simplified representation of a GNU `malloc` heap. A `malloc` call requests memory. The request does not fit in the lowest free chunk, but does fit in the one above. The lower chunk will remain unused until a request less than or equal its size arrives.* +![](0-lmNF2Veec6mh8Y_r-50192489.png) *Simplified representation of a GNU `malloc` heap. A `malloc` call requests memory. The request does not fit in the lowest free chunk, but does fit in the one above. The lower chunk will remain unused until a request less than or equal its size arrives.* As you might imagine, there could be many chunks in the `malloc` heaps just sitting around empty, depending on the pattern of `malloc` and `free` calls an application executes. At this point, we were wondering if this kind of memory fragmentation could explain the Fulfillment Service's ever-growing memory usage. While investigating possible ways to confirm this, we happened upon [an excellent article from the LinkedIn engineering team](https://engineering.linkedin.com/blog/2021/taming-memory-fragmentation-in-venice-with-jemalloc), describing a problem extremely similar to ours. However, instead of using the [gdb-heap](https://github.com/rogerhu/gdb-heap) tool the LinkedIn team used, we decided to confirm our hypothesis in a slightly more direct way. It turns out that GNU `malloc` already [exposes some statistics](http://www.gnu.org/software/libc/manual/html_node/Statistics-of-Malloc.html) which are suitable for roughly quantifying memory fragmentation. The statistics we are interested in are: the total size of memory in use by the application, the total size of memory in `malloc`'s heaps but not in use by the application and the part of that memory allowed to be returned to the OS. GNU `malloc`'s `mallinfo` function returns these as the `uordblks`, `fordblks` and `keepcost` fields respectively. So, calculating `1 — uordblks / (fordblks — keepcost) `gives the ratio of unused memory that cannot be returned to the OS, a measure of memory fragmentation. -![](https://miro.medium.com/proxy/0*OAeiO0X8-ob8E7Ao) *Simplified representation of a GNU malloc heap with fields returned by mallinfo indicated.* +![](0-OAeiO0X8-ob8E7Ao-138b9a1e.png) *Simplified representation of a GNU malloc heap with fields returned by mallinfo indicated.* Having learned this, we created a local testing setup for the Fulfillment Service. This setup consisted of a Docker container with gdb (the GNU debugger for debugging native code), OpenJDK with debug symbols and glibc with debug symbols. This setup allowed us to attach gdb to the JVM and call the `mallinfo` function from the gdb prompt. diff --git a/content/posts/2022/04/19/does-java-18-finally-have-a-better-alternative-to-jni/3hj2rlctq3rnhi1o0mp4-78f0b7b2.jpg b/content/posts/2022/04/19/does-java-18-finally-have-a-better-alternative-to-jni/3hj2rlctq3rnhi1o0mp4-78f0b7b2.jpg new file mode 100644 index 000000000..da60e38db Binary files /dev/null and b/content/posts/2022/04/19/does-java-18-finally-have-a-better-alternative-to-jni/3hj2rlctq3rnhi1o0mp4-78f0b7b2.jpg differ diff --git a/content/posts/2022/04/19/does-java-18-finally-have-a-better-alternative-to-jni/5jdqdni0gvv6zubwzq8f-49c0be71.jpg b/content/posts/2022/04/19/does-java-18-finally-have-a-better-alternative-to-jni/5jdqdni0gvv6zubwzq8f-49c0be71.jpg new file mode 100644 index 000000000..33eed51b9 Binary files /dev/null and b/content/posts/2022/04/19/does-java-18-finally-have-a-better-alternative-to-jni/5jdqdni0gvv6zubwzq8f-49c0be71.jpg differ diff --git a/content/posts/2022/04/19/does-java-18-finally-have-a-better-alternative-to-jni/c1kwxzrhvt40nuulijge-d97c8eda.jpg b/content/posts/2022/04/19/does-java-18-finally-have-a-better-alternative-to-jni/c1kwxzrhvt40nuulijge-d97c8eda.jpg new file mode 100644 index 000000000..73c87c340 Binary files /dev/null and b/content/posts/2022/04/19/does-java-18-finally-have-a-better-alternative-to-jni/c1kwxzrhvt40nuulijge-d97c8eda.jpg differ diff --git a/content/posts/2022/04/19/does-java-18-finally-have-a-better-alternative-to-jni/index.md b/content/posts/2022/04/19/does-java-18-finally-have-a-better-alternative-to-jni/index.md index 924ca5885..5879ef8bc 100644 --- a/content/posts/2022/04/19/does-java-18-finally-have-a-better-alternative-to-jni/index.md +++ b/content/posts/2022/04/19/does-java-18-finally-have-a-better-alternative-to-jni/index.md @@ -20,7 +20,7 @@ frozen: false Java 18 was released last month (March 2022), and with it comes the second incubator of the Foreign Function \& Memory API, so let us look at the state of Foreign Function Interface (FFI) in Java. -![cover image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c1kwxzrhvt40nuulijge.png) +![cover image](c1kwxzrhvt40nuulijge-d97c8eda.jpg) If you would prefer to follow along by watching a video, here's the recording of my FOSDEM'22 talk on this topic, from the [the OktaDev YouTube channel](https://youtu.be/lW69_AtAXzE). @@ -204,7 +204,7 @@ Let's take a simple example of calling the `getpid` function from the standard C ### JNI -![getpid with JNI](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5jdqdni0gvv6zubwzq8f.png) +![getpid with JNI](5jdqdni0gvv6zubwzq8f-49c0be71.jpg) As you can see here, there are precisely six steps to make this simple native call using JNI. You start by writing a Java class that declares the native method. Then you use `javac` to generate a header file and a C class for this. These are the native bindings. @@ -220,7 +220,7 @@ Ooof! This was just a simple `getpid` call; imagine writing something like an Op ### Panama -![getpid with panama](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3hj2rlctq3rnhi1o0mp4.png) +![getpid with panama](3hj2rlctq3rnhi1o0mp4-78f0b7b2.jpg) Using the new Panama APIs, you can do the same thing in two different ways, either by manually looking up and loading the native function or using the jextract tool. diff --git a/content/posts/2022/04/20/building-a-fullstack-imdb-clone-with-a-java-backend-using-sparkjava-and-neo4j/OzxHfAx-a314796a.jpg b/content/posts/2022/04/20/building-a-fullstack-imdb-clone-with-a-java-backend-using-sparkjava-and-neo4j/OzxHfAx-a314796a.jpg new file mode 100644 index 000000000..84bcc22be Binary files /dev/null and b/content/posts/2022/04/20/building-a-fullstack-imdb-clone-with-a-java-backend-using-sparkjava-and-neo4j/OzxHfAx-a314796a.jpg differ diff --git a/content/posts/2022/04/20/building-a-fullstack-imdb-clone-with-a-java-backend-using-sparkjava-and-neo4j/as0CeWJ-00799f0b.jpg b/content/posts/2022/04/20/building-a-fullstack-imdb-clone-with-a-java-backend-using-sparkjava-and-neo4j/as0CeWJ-00799f0b.jpg new file mode 100644 index 000000000..53b93bf0d Binary files /dev/null and b/content/posts/2022/04/20/building-a-fullstack-imdb-clone-with-a-java-backend-using-sparkjava-and-neo4j/as0CeWJ-00799f0b.jpg differ diff --git a/content/posts/2022/04/20/building-a-fullstack-imdb-clone-with-a-java-backend-using-sparkjava-and-neo4j/index.md b/content/posts/2022/04/20/building-a-fullstack-imdb-clone-with-a-java-backend-using-sparkjava-and-neo4j/index.md index 964722006..dbad9f355 100644 --- a/content/posts/2022/04/20/building-a-fullstack-imdb-clone-with-a-java-backend-using-sparkjava-and-neo4j/index.md +++ b/content/posts/2022/04/20/building-a-fullstack-imdb-clone-with-a-java-backend-using-sparkjava-and-neo4j/index.md @@ -23,7 +23,7 @@ Our [GraphAcademy](https://graphacademy.neo4j.com) is teaching folks starting ou And for developers, there are [courses for using our drivers](https://graphacademy.neo4j.com/categories/developer/) and building the backend of a fullstack app in JavaScript, Go, Python, Java, and soon .Net. -![OzxHfAx](https://i.imgur.com/OzxHfAx.png) +![OzxHfAx](OzxHfAx-a314796a.jpg) The application is an IMDB clone based on the [MovieLens recommendation](https://github.com/neo4j-graph-examples/recommendations) dataset augmented with movie and cast data from [themoviedb.org](https://themoviedb.org). @@ -31,7 +31,7 @@ The front-end is written in vue.js and looks pretty slick. It calls a number of REST API endpoints to serve the different views and functionalities. -![as0CeWJ](https://i.imgur.com/as0CeWJ.png) +![as0CeWJ](as0CeWJ-00799f0b.jpg) Basic functions are: @@ -55,7 +55,7 @@ During the interactive course a lot of quizzes check understanding, let you run The course also automatically integrates with the [Neo4j Sandbox](https://sandbox.neo4j.com) so you can run the test queries and also the app against your personal instance hosting the movies dataset. -![model](https://github.com/neo4j-graph-examples/recommendations/raw/main/documentation/img/model.png) +![model](model-6cbc5afc.png) ## Setup diff --git a/content/posts/2022/04/20/building-a-fullstack-imdb-clone-with-a-java-backend-using-sparkjava-and-neo4j/model-6cbc5afc.png b/content/posts/2022/04/20/building-a-fullstack-imdb-clone-with-a-java-backend-using-sparkjava-and-neo4j/model-6cbc5afc.png new file mode 100644 index 000000000..a1b3c0bce Binary files /dev/null and b/content/posts/2022/04/20/building-a-fullstack-imdb-clone-with-a-java-backend-using-sparkjava-and-neo4j/model-6cbc5afc.png differ diff --git a/content/posts/2022/04/21/sql-vs-nosql-pros-cons-2/0_wznGd8krXaAPYmzU.jpg b/content/posts/2022/04/21/sql-vs-nosql-pros-cons-2/0_wznGd8krXaAPYmzU.jpg new file mode 100644 index 000000000..3cd35adf1 Binary files /dev/null and b/content/posts/2022/04/21/sql-vs-nosql-pros-cons-2/0_wznGd8krXaAPYmzU.jpg differ diff --git a/content/posts/2022/04/21/sql-vs-nosql-pros-cons-2/0_wznGd8krXaAPYmzU.png b/content/posts/2022/04/21/sql-vs-nosql-pros-cons-2/0_wznGd8krXaAPYmzU.png deleted file mode 100644 index 85a3cdd2a..000000000 Binary files a/content/posts/2022/04/21/sql-vs-nosql-pros-cons-2/0_wznGd8krXaAPYmzU.png and /dev/null differ diff --git a/content/posts/2022/04/21/sql-vs-nosql-pros-cons-2/index.md b/content/posts/2022/04/21/sql-vs-nosql-pros-cons-2/index.md index 3ac00ba52..6d3ca3a5d 100644 --- a/content/posts/2022/04/21/sql-vs-nosql-pros-cons-2/index.md +++ b/content/posts/2022/04/21/sql-vs-nosql-pros-cons-2/index.md @@ -6,7 +6,7 @@ description: "What’s the best way to store, protect and access your data? This canonical: "https://datastax.medium.com/sql-versus-nosql-the-pros-and-cons-488d4a7ba92f" authors: - "rich-edwards" -image: "0_wznGd8krXaAPYmzU.png" +image: "0_wznGd8krXaAPYmzU.jpg" categories: - "Apache Cassandra" - "Databases" diff --git a/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/3NZY07XDa-96505594.jpg b/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/3NZY07XDa-96505594.jpg new file mode 100644 index 000000000..d0e815474 Binary files /dev/null and b/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/3NZY07XDa-96505594.jpg differ diff --git a/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/Hj4VQTvII-0a91dfa0.jpg b/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/Hj4VQTvII-0a91dfa0.jpg new file mode 100644 index 000000000..6690b9c49 Binary files /dev/null and b/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/Hj4VQTvII-0a91dfa0.jpg differ diff --git a/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/QcNWaF2o9-55615320.jpg b/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/QcNWaF2o9-55615320.jpg new file mode 100644 index 000000000..246b18498 Binary files /dev/null and b/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/QcNWaF2o9-55615320.jpg differ diff --git a/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/index.md b/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/index.md index 05faf9871..d3c46d47c 100644 --- a/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/index.md +++ b/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/index.md @@ -45,7 +45,7 @@ But the exception breakpoint support will still break for this and many other ex The solution is simple. Filter out the catching classes if they are in the java or sun root packages. We can do this in the current breakpoint dialog using the filter `-java.* -sun.*`, notice the `-` character used to filter out the packages. This one small class filter will remove that redundant noise and let you focus on exceptions that you catch or don't. An uncaught exception is almost always useful in the debugger, as it can lead to an application fatal error. -![Catch Filter](https://cdn.hashnode.com/res/hashnode/image/upload/v1647961656999/QcNWaF2o9.png) +![Catch Filter](QcNWaF2o9-55615320.jpg) You can add additional filters to cover other libraries and your own classes as needed. This is a remarkable feature! @@ -55,11 +55,11 @@ Of all the breakpoint types, I feel these have the most untamed potential. I hop This limits the breakpoint to the current object. This is something I would normally use a conditional breakpoint for. The problem is that conditions might cause a mistake, e.g. in a case where instances are harder to differentiate. Conditions also require more work. -![Instance Filter](https://cdn.hashnode.com/res/hashnode/image/upload/v1647961947086/yEkujOydu.png) +![Instance Filter](yEkujOydu-48219363.jpg) When applying an instance filter, you need to get the object ID from the watch and use that for the field. -![Instance Id](https://cdn.hashnode.com/res/hashnode/image/upload/v1647961990933/Hj4VQTvII.png) +![Instance Id](Hj4VQTvII-0a91dfa0.jpg) ### Class @@ -79,7 +79,7 @@ You may recall I mentioned you shouldn't use method breakpoints... They're usual But there's another approach. You can add a breakpoint using filters/names, e.g. you can add a breakpoint to all the methods starting with the word "is" in all the classes starting with the word "Prime" as we can see here. -![Add Method Breakpoint](https://cdn.hashnode.com/res/hashnode/image/upload/v1647962190063/qKvRw0YC6.png) +![Add Method Breakpoint](qKvRw0YC6-f6f8a81d.png) This might sound excessive, but there's a common and valid use case. @@ -97,7 +97,7 @@ When you right click an Object in the IntelliJ watch you can ask to show "all ob When you do that on a `Thread` object, you see the JIT compiler thread. You can see internal JVM const message strings when doing it on a `String` array. When you're looking at a specific object and wondering "is this the right instance", well... You can review all instances and verify with a right click. -![Show Objects](https://cdn.hashnode.com/res/hashnode/image/upload/v1647962321726/3NZY07XDa.png) +![Show Objects](3NZY07XDa-96505594.jpg) You can even narrow down that list with an expression statement to make it even more useful for a larger list of objects. diff --git a/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/qKvRw0YC6-f6f8a81d.png b/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/qKvRw0YC6-f6f8a81d.png new file mode 100644 index 000000000..108a0a0fa Binary files /dev/null and b/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/qKvRw0YC6-f6f8a81d.png differ diff --git a/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/yEkujOydu-48219363.jpg b/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/yEkujOydu-48219363.jpg new file mode 100644 index 000000000..ca6881aa6 Binary files /dev/null and b/content/posts/2022/04/22/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/yEkujOydu-48219363.jpg differ diff --git a/content/posts/2022/04/25/chopping-monolith/chop-monolith-700x246.jpg b/content/posts/2022/04/25/chopping-monolith/chop-monolith-700x246.jpg new file mode 100644 index 000000000..5e044e106 Binary files /dev/null and b/content/posts/2022/04/25/chopping-monolith/chop-monolith-700x246.jpg differ diff --git a/content/posts/2022/04/25/chopping-monolith/chop-monolith-700x246.png b/content/posts/2022/04/25/chopping-monolith/chop-monolith-700x246.png deleted file mode 100644 index eee48720d..000000000 Binary files a/content/posts/2022/04/25/chopping-monolith/chop-monolith-700x246.png and /dev/null differ diff --git a/content/posts/2022/04/25/chopping-monolith/index.md b/content/posts/2022/04/25/chopping-monolith/index.md index 27d1766d4..ed5c7da08 100644 --- a/content/posts/2022/04/25/chopping-monolith/index.md +++ b/content/posts/2022/04/25/chopping-monolith/index.md @@ -171,7 +171,7 @@ The biggest issue is regarding clients. Migrating an HTTP endpoint to a differen Just route the request to the new endpoint location, and you're done. -{{< img src="chop-monolith-700x246.png" class="size-medium aligncenter" width="700" height="246" >}} +{{< img src="chop-monolith-700x246.jpg" class="size-medium aligncenter" width="700" height="246" >}} ## Conclusion diff --git a/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/debugginglambda-c0c2e486.gif b/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/debugginglambda-c0c2e486.gif new file mode 100644 index 000000000..13b42c876 Binary files /dev/null and b/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/debugginglambda-c0c2e486.gif differ diff --git a/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/index.md b/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/index.md index b79a1787e..d08f9dc02 100644 --- a/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/index.md +++ b/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/index.md @@ -52,11 +52,11 @@ Once enabled, Visual Studio Code will show a hint on the parameter name in the m You can change this setting at any time by going to the "inlay" setting under Java -[![Inlay Setting](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/04/inlaysetting.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/04/inlaysetting.png) +[![Inlay Setting](inlaysetting-41f33145.png)](inlaysetting-41f33145.png) Here is a demo of the feature in action: -![Inlay demo](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/04/inlay.gif) +![Inlay demo](inlay-e04b6df4.webp) ### New Java Language Server Status UX @@ -70,7 +70,7 @@ If you update to the latest version of Visual Studio Code and [Extension Pack fo Here is a demo: -![LS demo](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/04/languageserverstatus.gif) +![LS demo](languageserverstatus-e6d9a707.gif) As you can see from the demo above, currently the language status item provides the following information and action: @@ -84,7 +84,7 @@ As you can see from the demo above, currently the language status item provides If there is an issue or error, you will see an indicator on the status icon and you can click on "Show problems" to reveal the error details. -[![Language Server Error](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/04/languageservererror.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/04/languageservererror.png) +[![Language Server Error](languageservererror-069a2e7d.png)](languageservererror-069a2e7d.png) We hope this improvement will provide better user experience about the state of the Java language server and please share your feedback with us so we can continue to improve this area. @@ -92,7 +92,7 @@ We hope this improvement will provide better user experience about the state of As a minor feature update, we have also added a code action (from Quick Fix) to allow developers to easily extract lambda body to a method. Here is a quick demo: -![Lambda demo](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/04/lambda.gif) +![Lambda demo](lambda.gif) ### Lambda expression evaluation support in debugging @@ -100,7 +100,7 @@ Lastly, we wanted to provide an update on lambda expression support in debugging Here is a quick demo of evaluating a variable from enclosing methods when using lambda in a chain call: -![Debugging demo](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/04/debugginglambda.gif) +![Debugging demo](debugginglambda-c0c2e486.gif) For complete list of supported case, please visit the [original issue](https://github.com/microsoft/vscode-java-debug/issues/754). diff --git a/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/inlay-e04b6df4.webp b/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/inlay-e04b6df4.webp new file mode 100644 index 000000000..77a595819 Binary files /dev/null and b/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/inlay-e04b6df4.webp differ diff --git a/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/inlaysetting-41f33145.png b/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/inlaysetting-41f33145.png new file mode 100644 index 000000000..bffc4c869 Binary files /dev/null and b/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/inlaysetting-41f33145.png differ diff --git a/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/languageservererror-069a2e7d.png b/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/languageservererror-069a2e7d.png new file mode 100644 index 000000000..57ef1b266 Binary files /dev/null and b/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/languageservererror-069a2e7d.png differ diff --git a/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/languageserverstatus-e6d9a707.gif b/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/languageserverstatus-e6d9a707.gif new file mode 100644 index 000000000..a5f5345ba Binary files /dev/null and b/content/posts/2022/04/25/java-on-visual-studio-code-update-april-2022/languageserverstatus-e6d9a707.gif differ diff --git a/content/posts/2022/04/27/journeys-in-java-level-4-building-an-empire-of-microservices/index.md b/content/posts/2022/04/27/journeys-in-java-level-4-building-an-empire-of-microservices/index.md index a1fd299c7..b4e5118f3 100644 --- a/content/posts/2022/04/27/journeys-in-java-level-4-building-an-empire-of-microservices/index.md +++ b/content/posts/2022/04/27/journeys-in-java-level-4-building-an-empire-of-microservices/index.md @@ -116,7 +116,7 @@ The first three fields keep default values (Maven project, Java language, Spring In the `Dependencies` area, we need to add 3 things - `Spring Reactive Web`, `Lombok`, and `Spring Data Reactive MongoDB`. The use of Lombok is personal preference, as well, but I wanted to use it here to trim some code. Next, click the `Generate` button at the bottom of the screen and pick a location to save it. -![springio svc3](springio-svc3.png) +![springio svc3](springio-svc3.jpg) *Note: the Spring Initializr displays in dark mode or light mode via the moon or sun icons in the right column of the page. The image above is in dark mode.* diff --git a/content/posts/2022/04/27/journeys-in-java-level-4-building-an-empire-of-microservices/springio-svc3.jpg b/content/posts/2022/04/27/journeys-in-java-level-4-building-an-empire-of-microservices/springio-svc3.jpg new file mode 100644 index 000000000..33f8f69cd Binary files /dev/null and b/content/posts/2022/04/27/journeys-in-java-level-4-building-an-empire-of-microservices/springio-svc3.jpg differ diff --git a/content/posts/2022/04/27/journeys-in-java-level-4-building-an-empire-of-microservices/springio-svc3.png b/content/posts/2022/04/27/journeys-in-java-level-4-building-an-empire-of-microservices/springio-svc3.png deleted file mode 100644 index 498e72f82..000000000 Binary files a/content/posts/2022/04/27/journeys-in-java-level-4-building-an-empire-of-microservices/springio-svc3.png and /dev/null differ diff --git a/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/2KJtGOrMU-5497d1e0.jpg b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/2KJtGOrMU-5497d1e0.jpg new file mode 100644 index 000000000..7acff5141 Binary files /dev/null and b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/2KJtGOrMU-5497d1e0.jpg differ diff --git a/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/95PP378tf-8d393658.png b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/95PP378tf-8d393658.png new file mode 100644 index 000000000..af3bfd398 Binary files /dev/null and b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/95PP378tf-8d393658.png differ diff --git a/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/CaCvAtL5U-41c17f58.jpg b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/CaCvAtL5U-41c17f58.jpg new file mode 100644 index 000000000..efa06aefb Binary files /dev/null and b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/CaCvAtL5U-41c17f58.jpg differ diff --git a/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/DW3AVv7BX-22e09db2.jpg b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/DW3AVv7BX-22e09db2.jpg new file mode 100644 index 000000000..62da24f3b Binary files /dev/null and b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/DW3AVv7BX-22e09db2.jpg differ diff --git a/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/HIOIjanMn-34537cc7.jpg b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/HIOIjanMn-34537cc7.jpg new file mode 100644 index 000000000..242312127 Binary files /dev/null and b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/HIOIjanMn-34537cc7.jpg differ diff --git a/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/HNamrDhlJ-addf950e.jpg b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/HNamrDhlJ-addf950e.jpg new file mode 100644 index 000000000..0a694be20 Binary files /dev/null and b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/HNamrDhlJ-addf950e.jpg differ diff --git a/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/QHZVYjcud-20b4a932.jpg b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/QHZVYjcud-20b4a932.jpg new file mode 100644 index 000000000..a7043deee Binary files /dev/null and b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/QHZVYjcud-20b4a932.jpg differ diff --git a/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/index.md b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/index.md index 62ed69019..fc517c507 100644 --- a/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/index.md +++ b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/index.md @@ -40,15 +40,15 @@ I talked about a [different type of filters](https://talktotheduck.dev/exception This is a minor feature that's actually on by default. Yet most developers don't even notice it. When you expand an array of objects, you might have noticed that the IDE hides null values. This is a filter that's on by default, you can also add your own… -![filter-1.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1649148290119/n2LvCUt8c.png) +![filter-1.png](n2LvCUt8c-718d0c90.jpg) We can start by selecting an array or collection in the watch and right clicking it. Then clicking the "Filter" option. -![filter-2.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1649148311196/HNamrDhlJ.png) +![filter-2.png](HNamrDhlJ-addf950e.jpg) We can then input any condition we want where "this" stands for the current element. When we press enter, the filter will be applied and we'll only see the applicable elements. Notice that in this case, I used method calls and their results as part of the filter. -![filter-3.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1649148325901/QHZVYjcud.png) +![filter-3.png](QHZVYjcud-20b4a932.jpg) Here we see the filter in action. We can clear it by pressing the "clear" button next to it. We can edit it by clicking on it too. @@ -58,11 +58,11 @@ While I use the Java 8 stream API frequently, I still prefer the old for loops f JetBrains understood that problem and introduced the stream debugger, initially as a plugin and currently as a built-in tool in the IDE. You can see the button to launch the stream debugger when the current breakpoint is stopped on a stream. -![stream-debugger-1.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1649148355554/95PP378tf.png) +![stream-debugger-1.png](95PP378tf-8d393658.png) When you press this button, the stream debugger is launched. It's one tool where watching the video will probably explain it better, but I'll try… -![stream-debugger-2.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1649148370843/CaCvAtL5U.png) +![stream-debugger-2.png](CaCvAtL5U-41c17f58.jpg) This tool represents every stream function as a stage. You can go back and forth between the stages where you can see how elements in one stage map to their counterparts in the next stage. E.g. a map operation can convert the type of element to a new type. So you would see the elements before the mapping and an arrow to the post mapping instance. @@ -84,15 +84,15 @@ Pressing step over and just waiting forever for something to happen is very frus There are many reasons a debugger can be slow. Some of them relate to the application we're debugging, but quite a few of them relate to features we turn on/off. Renderers fall into this category. They can be VERY expensive when we have many watch elements or if the process for rendering them is slow. -![mute-renderers-1.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1649148417300/DW3AVv7BX.png) +![mute-renderers-1.png](DW3AVv7BX-22e09db2.jpg) Luckily JetBrains provides a simple workaround: mute renderers. You can enable this by right clicking on the watch area. -![mute-renderers-2.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1649148435368/2KJtGOrMU.png) +![mute-renderers-2.png](2KJtGOrMU-5497d1e0.jpg) Once we mute the renderers, they appear as a short form rendering. Just the object ID next to a button. Clicking on this entry automatically performs the rendering lazily. In this case, the rendering will just invoke the `toString()` method, as indicated here. -![mute-renderers-3.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1649148451051/HIOIjanMn.png) +![mute-renderers-3.png](HIOIjanMn-34537cc7.jpg) Once clicked, we can see the correct value in the renderer and we can inspect the result only for this value. Other values might still be "unrendered". @@ -100,11 +100,11 @@ Once clicked, we can see the correct value in the renderer and we can inspect th `toString()` is great for many things, but it might not represent what we want to know about an object. Especially 3rd party objects where we can't control the `toString()` implementation for cases where performance is an issue. `toString()` must be efficient since we might use it when logging an object in production. We can't overburden it with data. -![custom-rendering-1.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1649148478174/n5cS0GFMU.png) +![custom-rendering-1.png](n5cS0GFMU-b7f668e7.jpg) The "Customize Data Views…" menu item launches the renderer customization menu. This is a pretty powerful feature that lets us control many nuanced capabilities in the default renderer. -![custom-rendering-2.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1649148493174/rYtalVVGH.png) +![custom-rendering-2.png](rYtalVVGH-ef7f2158.png) There are many options in this dialog that let you customize the way elements are rendered in the watch. One of my favorite options is the one to show hex values for integers, which is pretty useful for some of the low level stuff I do. @@ -116,7 +116,7 @@ For simple cases, `toString()` works really well. But there are complex cases wh But when we debug, this might be pretty valuable. -![custom-rendering-3.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1649148514466/m7lBiOlfO.png) +![custom-rendering-3.png](m7lBiOlfO-6e9e395a.jpg) First off, we need to select the right type for renderer. Notice you can use a base type to select the appropriate objects. In this case, JpaRepository is the base interface. By using the expression: diff --git a/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/m7lBiOlfO-6e9e395a.jpg b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/m7lBiOlfO-6e9e395a.jpg new file mode 100644 index 000000000..185fee29f Binary files /dev/null and b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/m7lBiOlfO-6e9e395a.jpg differ diff --git a/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/n2LvCUt8c-718d0c90.jpg b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/n2LvCUt8c-718d0c90.jpg new file mode 100644 index 000000000..e024c0261 Binary files /dev/null and b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/n2LvCUt8c-718d0c90.jpg differ diff --git a/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/n5cS0GFMU-b7f668e7.jpg b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/n5cS0GFMU-b7f668e7.jpg new file mode 100644 index 000000000..4ae8be84f Binary files /dev/null and b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/n5cS0GFMU-b7f668e7.jpg differ diff --git a/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/rYtalVVGH-ef7f2158.png b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/rYtalVVGH-ef7f2158.png new file mode 100644 index 000000000..afb130272 Binary files /dev/null and b/content/posts/2022/04/29/debugging-collections-streams-and-watch-renderers/rYtalVVGH-ef7f2158.png differ diff --git a/content/posts/2022/05/03/how-to-submit-your-next-article-on-foojay-io/foojay-categories.jpg b/content/posts/2022/05/03/how-to-submit-your-next-article-on-foojay-io/foojay-categories.jpg new file mode 100644 index 000000000..d333b5ab0 Binary files /dev/null and b/content/posts/2022/05/03/how-to-submit-your-next-article-on-foojay-io/foojay-categories.jpg differ diff --git a/content/posts/2022/05/03/how-to-submit-your-next-article-on-foojay-io/foojay-categories.png b/content/posts/2022/05/03/how-to-submit-your-next-article-on-foojay-io/foojay-categories.png deleted file mode 100644 index d6f1df374..000000000 Binary files a/content/posts/2022/05/03/how-to-submit-your-next-article-on-foojay-io/foojay-categories.png and /dev/null differ diff --git a/content/posts/2022/05/03/how-to-submit-your-next-article-on-foojay-io/index.md b/content/posts/2022/05/03/how-to-submit-your-next-article-on-foojay-io/index.md index de74dbff6..6d5c371f6 100644 --- a/content/posts/2022/05/03/how-to-submit-your-next-article-on-foojay-io/index.md +++ b/content/posts/2022/05/03/how-to-submit-your-next-article-on-foojay-io/index.md @@ -7,7 +7,7 @@ authors: - "bazlur-rahman" - "frankdelporte" - "geertjan-wielenga" -image: "foojay-categories.png" +image: "foojay-categories.jpg" categories: - "Foojay" related_posts: diff --git a/content/posts/2022/05/04/easy-jakarta-ee-integration-testing/JRSvfMGHaCwVF6KzMLehX6QOSUrwg4IpAWCf6Xv0-f970aabb.png b/content/posts/2022/05/04/easy-jakarta-ee-integration-testing/JRSvfMGHaCwVF6KzMLehX6QOSUrwg4IpAWCf6Xv0-f970aabb.png new file mode 100644 index 000000000..5382af937 Binary files /dev/null and b/content/posts/2022/05/04/easy-jakarta-ee-integration-testing/JRSvfMGHaCwVF6KzMLehX6QOSUrwg4IpAWCf6Xv0-f970aabb.png differ diff --git a/content/posts/2022/05/04/easy-jakarta-ee-integration-testing/M6Uz4DKM4i0oHTx-HfJn4Lv2CtDv-LZjpzShZs_h-2e085a20.png b/content/posts/2022/05/04/easy-jakarta-ee-integration-testing/M6Uz4DKM4i0oHTx-HfJn4Lv2CtDv-LZjpzShZs_h-2e085a20.png new file mode 100644 index 000000000..05cabf1c0 Binary files /dev/null and b/content/posts/2022/05/04/easy-jakarta-ee-integration-testing/M6Uz4DKM4i0oHTx-HfJn4Lv2CtDv-LZjpzShZs_h-2e085a20.png differ diff --git a/content/posts/2022/05/04/easy-jakarta-ee-integration-testing/index.md b/content/posts/2022/05/04/easy-jakarta-ee-integration-testing/index.md index 3155865d5..dd600bb53 100644 --- a/content/posts/2022/05/04/easy-jakarta-ee-integration-testing/index.md +++ b/content/posts/2022/05/04/easy-jakarta-ee-integration-testing/index.md @@ -6,7 +6,7 @@ description: "How to use Testcontainers for your project to create a stable and canonical: "https://blog.payara.fish/jakarta-ee-integration-testing-with-testcontainers" authors: - "jadon-ortlepp" -image: "https://lh4.googleusercontent.com/JRSvfMGHaCwVF6KzMLehX6QOSUrwg4IpAWCf6Xv0I5AWQ_lgIrvDlik5_hP8mpWqInLR3ajhRQHaogg82q6RgNj3qrDo6yRKrI-GvU9iEq_t-xsAFSbmjAUJ_WUjANDPzGMjdEZW" +image: "JRSvfMGHaCwVF6KzMLehX6QOSUrwg4IpAWCf6Xv0-f970aabb.png" categories: - "Developer Tools" - "Jakarta EE" @@ -630,11 +630,11 @@ Testcontainers Cloud is currently in a private beta and you can [get access by s 2. Install the client on your development environment: Windows, Linux, and macOS are supported. 3. Run the client software. The client software will automatically open a browser window pointing to [https://app.testcontainers.cloud](https://app.testcontainers.cloud/downloads) to retrieve the token needed to link your user account: - ![](https://lh4.googleusercontent.com/JRSvfMGHaCwVF6KzMLehX6QOSUrwg4IpAWCf6Xv0I5AWQ_lgIrvDlik5_hP8mpWqInLR3ajhRQHaogg82q6RgNj3qrDo6yRKrI-GvU9iEq_t-xsAFSbmjAUJ_WUjANDPzGMjdEZW) + ![](JRSvfMGHaCwVF6KzMLehX6QOSUrwg4IpAWCf6Xv0-f970aabb.png) 4. You're good to go! Testcontainers Cloud is ready to power your Testcontainers based tests. Here's how the Testcontainers Cloud client looks in a Windows environment: -![](https://lh4.googleusercontent.com/M6Uz4DKM4i0oHTx-HfJn4Lv2CtDv-LZjpzShZs_hKyliRt8ZL_QViqhKhhuyj7R0UjTvBUAJRboocbUvkqp-scd5vaOBdajtZWLWKl0N-MzVAPPxwzXSC_MIlFhGzCMNBj4VsdkN) +![](M6Uz4DKM4i0oHTx-HfJn4Lv2CtDv-LZjpzShZs_h-2e085a20.png) Now, when running the same test suite that we created in the previous sections, we'll see that when the Testcontainers engine connects to the Docker environment it will use a "leased" environment courtesy of your cloud account: diff --git a/content/posts/2022/05/06/spring-transaction-debugging-in-production-with-lightrun/1atfNFEx2j-704bc579.png b/content/posts/2022/05/06/spring-transaction-debugging-in-production-with-lightrun/1atfNFEx2j-704bc579.png new file mode 100644 index 000000000..53a46f460 Binary files /dev/null and b/content/posts/2022/05/06/spring-transaction-debugging-in-production-with-lightrun/1atfNFEx2j-704bc579.png differ diff --git a/content/posts/2022/05/06/spring-transaction-debugging-in-production-with-lightrun/Fmw8Sgc45-4208ee9e.png b/content/posts/2022/05/06/spring-transaction-debugging-in-production-with-lightrun/Fmw8Sgc45-4208ee9e.png new file mode 100644 index 000000000..dd551be06 Binary files /dev/null and b/content/posts/2022/05/06/spring-transaction-debugging-in-production-with-lightrun/Fmw8Sgc45-4208ee9e.png differ diff --git a/content/posts/2022/05/06/spring-transaction-debugging-in-production-with-lightrun/eRLIMjgCA-bd20dd39.png b/content/posts/2022/05/06/spring-transaction-debugging-in-production-with-lightrun/eRLIMjgCA-bd20dd39.png new file mode 100644 index 000000000..d53dd87cc Binary files /dev/null and b/content/posts/2022/05/06/spring-transaction-debugging-in-production-with-lightrun/eRLIMjgCA-bd20dd39.png differ diff --git a/content/posts/2022/05/06/spring-transaction-debugging-in-production-with-lightrun/index.md b/content/posts/2022/05/06/spring-transaction-debugging-in-production-with-lightrun/index.md index 429ad1e97..27934f218 100644 --- a/content/posts/2022/05/06/spring-transaction-debugging-in-production-with-lightrun/index.md +++ b/content/posts/2022/05/06/spring-transaction-debugging-in-production-with-lightrun/index.md @@ -80,19 +80,19 @@ Annotations aren't magic, though. Spring uses a proxy object, as we discussed ab ### Finding the Actual Transaction Class The first thing we need to do is look for the class that implements transaction functionality. Opening the IntelliJ/IDEA class view (Command-O or CTRL-O) lets us locate a class by name. Typing in "Transaction" resulted in the following view: -![image1.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1650896120559/eRLIMjgCA.png) +![image1.png](eRLIMjgCA-bd20dd39.png) This might seem like a lot, but we need a concrete public class. So annotations and interfaces can be ignored. Since we only care about Spring classes, we can ignore other packages. Still, the class we are looking for was relatively low in the list, so it took me some time to find it. In this case, the interesting class is `TransactionAspectSupport`. Once we open the class, we need to select the option to download the class source code. Once this is done, we can look for an applicable public method. `getTransactionManager` seemed perfect, but it's a bit too bare. Placing a snapshot there provided me a hint: -![image2.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1650896165493/Fmw8Sgc45.png) +![image2.png](Fmw8Sgc45-4208ee9e.png) I don't have much information here but the `invokeWithinTransaction` method up the stack is perfect! Moving on to that method, I would like to track information specific to a transaction on the `findById` method: -![image3.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1650905124053/1atfNFEx2j.png) +![image3.png](1atfNFEx2j-704bc579.png) To limit the scope only to `findById` we add the condition: diff --git a/content/posts/2022/05/09/modernize-legacy-code-in-production-rebuild-your-airplane-midflight-without-crashing/Blog---20.jpg b/content/posts/2022/05/09/modernize-legacy-code-in-production-rebuild-your-airplane-midflight-without-crashing/Blog---20.jpg new file mode 100644 index 000000000..8cd6c6752 Binary files /dev/null and b/content/posts/2022/05/09/modernize-legacy-code-in-production-rebuild-your-airplane-midflight-without-crashing/Blog---20.jpg differ diff --git a/content/posts/2022/05/09/modernize-legacy-code-in-production-rebuild-your-airplane-midflight-without-crashing/Blog---20.png b/content/posts/2022/05/09/modernize-legacy-code-in-production-rebuild-your-airplane-midflight-without-crashing/Blog---20.png deleted file mode 100644 index 4821fadd2..000000000 Binary files a/content/posts/2022/05/09/modernize-legacy-code-in-production-rebuild-your-airplane-midflight-without-crashing/Blog---20.png and /dev/null differ diff --git a/content/posts/2022/05/09/modernize-legacy-code-in-production-rebuild-your-airplane-midflight-without-crashing/index.md b/content/posts/2022/05/09/modernize-legacy-code-in-production-rebuild-your-airplane-midflight-without-crashing/index.md index 9e3c6821e..0c69a8ed8 100644 --- a/content/posts/2022/05/09/modernize-legacy-code-in-production-rebuild-your-airplane-midflight-without-crashing/index.md +++ b/content/posts/2022/05/09/modernize-legacy-code-in-production-rebuild-your-airplane-midflight-without-crashing/index.md @@ -6,7 +6,7 @@ description: "Rewriting applications is easy. Doing it while preserving compatib canonical: "https://lightrun.com/best-practices/modernize-legacy-code-in-production-rebuild-your-airplane-midflight-without-crashing/" authors: - "shai-almog" -image: "Blog---20.png" +image: "Blog---20.jpg" categories: - "DevOps" - "Tutorials" diff --git a/content/posts/2022/05/16/azure-toolkit-for-intellij-april-2022-update/Toolkit-roadmap-2022-1024x576.jpg b/content/posts/2022/05/16/azure-toolkit-for-intellij-april-2022-update/Toolkit-roadmap-2022-1024x576.jpg new file mode 100644 index 000000000..644cb6c5b Binary files /dev/null and b/content/posts/2022/05/16/azure-toolkit-for-intellij-april-2022-update/Toolkit-roadmap-2022-1024x576.jpg differ diff --git a/content/posts/2022/05/16/azure-toolkit-for-intellij-april-2022-update/Toolkit-roadmap-2022-1024x576.png b/content/posts/2022/05/16/azure-toolkit-for-intellij-april-2022-update/Toolkit-roadmap-2022-1024x576.png deleted file mode 100644 index ec9f4121d..000000000 Binary files a/content/posts/2022/05/16/azure-toolkit-for-intellij-april-2022-update/Toolkit-roadmap-2022-1024x576.png and /dev/null differ diff --git a/content/posts/2022/05/16/azure-toolkit-for-intellij-april-2022-update/index.md b/content/posts/2022/05/16/azure-toolkit-for-intellij-april-2022-update/index.md index d779aa630..39067fa47 100644 --- a/content/posts/2022/05/16/azure-toolkit-for-intellij-april-2022-update/index.md +++ b/content/posts/2022/05/16/azure-toolkit-for-intellij-april-2022-update/index.md @@ -35,7 +35,7 @@ We are excited to announce our roadmap for the next few months. Here is a picture that summarizes our investment areas: -![Toolkit roadmap 2022](Toolkit-roadmap-2022-1024x576.png) +![Toolkit roadmap 2022](Toolkit-roadmap-2022-1024x576.jpg) ## What is upcoming? diff --git a/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/cassandra-throughput-1024x405-07ae23d8.png b/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/cassandra-throughput-1024x405-07ae23d8.png new file mode 100644 index 000000000..345e7b943 Binary files /dev/null and b/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/cassandra-throughput-1024x405-07ae23d8.png differ diff --git a/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/finagle-cpu-1024x248-9c894c85.png b/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/finagle-cpu-1024x248-9c894c85.png new file mode 100644 index 000000000..52af1a2cd Binary files /dev/null and b/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/finagle-cpu-1024x248-9c894c85.png differ diff --git a/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/finagle-throughput-1024x248-ba846b67.png b/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/finagle-throughput-1024x248-ba846b67.png new file mode 100644 index 000000000..06673f0d7 Binary files /dev/null and b/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/finagle-throughput-1024x248-ba846b67.png differ diff --git a/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/index.md b/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/index.md index 5aced9cc2..839426404 100644 --- a/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/index.md +++ b/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/index.md @@ -36,10 +36,10 @@ The combination of Cloud Native Compiler with the Azul Platform Prime runtime pr The effect on the warm-up time and the client-side CPU spend when starting a new Java program is dramatic. Look what happens when we run Renaissance's finagle-http workload on an extremely constrained 2 vCore machine. Doing heavier optimizations means spending more resources, as shown by the long warm-up curve of Azul Platform Prime with local JIT. When we offload to Cloud Native Compiler, this long warmup time comes down to the same levels as OpenJDK, while the optimized Falcon code continues to run at a faster throughput. -![](https://www.azul.com/wp-content/uploads/finagle-throughput-1024x248.png) +![](finagle-throughput-1024x248-ba846b67.png) Meanwhile, CPU use on the client remains low and steady, allowing you to allocate more power to running your application logic even during warmup. -![](https://www.azul.com/wp-content/uploads/finagle-cpu-1024x248.png) +![](finagle-cpu-1024x248-9c894c85.png) In this article we will look at: @@ -96,12 +96,12 @@ Here are some numbers on Falcon vs Hotspot on popular Java performance benchmark | Disruptor | 132% | | Kafka | 145% | -![](https://www.azul.com/wp-content/uploads/rennaisance3-1024x515.png) +![](rennaisance3-1024x515-862c6540.png) We've already shown above how Cloud Native Compiler reduces warm-up time and CPU spend when running the finagle-http workload on a resource-starved machine. But it's not just extremely resource constrained machines that benefit from Cloud Native Compiler. Let's look at a more realistic workload – running a three-node Cassandra cluster on an 8 vCore r5.2xlarge AWS instance. With optimization set to the highest level, resulting in high and consistent throughput, warm-up time goes from 20 minutes with local JIT to less than two minutes with Cloud Native Compiler. -![](https://www.azul.com/wp-content/uploads/cassandra-throughput-1024x405.png) +![](cassandra-throughput-1024x405-07ae23d8.png) ## Conclusion diff --git a/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/rennaisance3-1024x515-862c6540.png b/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/rennaisance3-1024x515-862c6540.png new file mode 100644 index 000000000..af5d74068 Binary files /dev/null and b/content/posts/2022/05/18/lets-compile-java-code-in-the-cloud/rennaisance3-1024x515-862c6540.png differ diff --git a/content/posts/2022/05/27/memory-debugging-and-watch-annotations/5YhGuNfeq-0501192c.jpeg b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/5YhGuNfeq-0501192c.jpeg new file mode 100644 index 000000000..df35b541f Binary files /dev/null and b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/5YhGuNfeq-0501192c.jpeg differ diff --git a/content/posts/2022/05/27/memory-debugging-and-watch-annotations/AP9SSjUSK-952bc077.jpg b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/AP9SSjUSK-952bc077.jpg new file mode 100644 index 000000000..83a405659 Binary files /dev/null and b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/AP9SSjUSK-952bc077.jpg differ diff --git a/content/posts/2022/05/27/memory-debugging-and-watch-annotations/CvRs-FN9m-e30a2e19.jpg b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/CvRs-FN9m-e30a2e19.jpg new file mode 100644 index 000000000..33089674c Binary files /dev/null and b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/CvRs-FN9m-e30a2e19.jpg differ diff --git a/content/posts/2022/05/27/memory-debugging-and-watch-annotations/GIZp2-ogJ-c8015bc7.png b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/GIZp2-ogJ-c8015bc7.png new file mode 100644 index 000000000..4b1143ba9 Binary files /dev/null and b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/GIZp2-ogJ-c8015bc7.png differ diff --git a/content/posts/2022/05/27/memory-debugging-and-watch-annotations/KqTfJtrSW-adcb9f40.png b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/KqTfJtrSW-adcb9f40.png new file mode 100644 index 000000000..917d90d70 Binary files /dev/null and b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/KqTfJtrSW-adcb9f40.png differ diff --git a/content/posts/2022/05/27/memory-debugging-and-watch-annotations/index.md b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/index.md index cf8d3f61f..410c1277d 100644 --- a/content/posts/2022/05/27/memory-debugging-and-watch-annotations/index.md +++ b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/index.md @@ -68,17 +68,17 @@ Again everything else matches the content and result we saw in the previous duck The primary focus of this post is the memory debugging capabilities. By default, JetBrains disables most of these capabilities to boost program execution performance. We can enable the memory debugger view by checking it on the right-hand side of the bottom tool window. -![memory-debugging-1.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1650984733258/GIZp2-ogJ.png) +![memory-debugging-1.png](GIZp2-ogJ-c8015bc7.png) Worse. This has such an impact on performance that IntelliJ doesn't load the actual content of this class until we explicitly click the "Load Classes" button in the center of the memory monitor: -![memory-debugging-2.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1650984741434/KqTfJtrSW.png) +![memory-debugging-2.png](KqTfJtrSW-adcb9f40.png) -![memory-debugging-3.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1650984748815/CvRs-FN9m.png) +![memory-debugging-3.png](CvRs-FN9m-e30a2e19.jpg) As you can imagine, this gets old fast. If your machine is slow, then this is a great thing. But if you have an exceptionally powerful machine, then you might want to turn on "Update Loaded Classes on Debugger Stop": -![memory-debugging-4.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1650984760974/wEfiGwUTX.png) +![memory-debugging-4.png](wEfiGwUTX-c5515520.jpg) This effectively disables the requirement to click at the cost of slower step over execution. But what do we get as a result? @@ -90,7 +90,7 @@ The diff column is especially useful in tracking issues such as memory leaks. Yo But there's more. We can double click every object on the list and see this: -![memory-debugging-5.jpeg](https://cdn.hashnode.com/res/hashnode/image/upload/v1650984775597/5YhGuNfeq.jpeg) +![memory-debugging-5.jpeg](5YhGuNfeq-0501192c.jpeg) Here we can see all the objects of this type that were allocated in the entire heap. We can get a sense of what's really held in a memory location and again gain deeper insight into potential memory leaks. @@ -98,11 +98,11 @@ Here we can see all the objects of this type that were allocated in the entire h "Track New Instances" enables even more tracking of heap allocations. We can enable this on a per object type basis. Notice this only applies to "proper object" and not arrays. You can enable it through the right click: -![memory-debugging-6.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1650984788667/AP9SSjUSK.png) +![memory-debugging-6.png](AP9SSjUSK-952bc077.jpg) Once we enable this, heap allocations are tracked everywhere. We get backtraces for memory allocations that we can use to narrow down the exact line of code that allocated every object in the heap! -![memory-debugging-7.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1650984800338/mwYQ4Caq_.png) +![memory-debugging-7.png](mwYQ4Caq_-c15cbc95.jpg) The real benefit though is in the enhanced diff capability. When this is enabled, we can differentiate the specific objects allocated at this point. Say you have a block of code that leaks an object of type `MyObject`. If you enable tracking on `MyObject` and run between the two breakpoints, you can see every allocation of `MyObject` performed only in this block of code... diff --git a/content/posts/2022/05/27/memory-debugging-and-watch-annotations/mwYQ4Caq_-c15cbc95.jpg b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/mwYQ4Caq_-c15cbc95.jpg new file mode 100644 index 000000000..af1fa97a5 Binary files /dev/null and b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/mwYQ4Caq_-c15cbc95.jpg differ diff --git a/content/posts/2022/05/27/memory-debugging-and-watch-annotations/wEfiGwUTX-c5515520.jpg b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/wEfiGwUTX-c5515520.jpg new file mode 100644 index 000000000..8fe77b0c7 Binary files /dev/null and b/content/posts/2022/05/27/memory-debugging-and-watch-annotations/wEfiGwUTX-c5515520.jpg differ diff --git a/content/posts/2022/06/06/microstream-part-1-what-is-it/impedanceMismatch-567x510-1.jpg b/content/posts/2022/06/06/microstream-part-1-what-is-it/impedanceMismatch-567x510-1.jpg new file mode 100644 index 000000000..2253a57f4 Binary files /dev/null and b/content/posts/2022/06/06/microstream-part-1-what-is-it/impedanceMismatch-567x510-1.jpg differ diff --git a/content/posts/2022/06/06/microstream-part-1-what-is-it/impedanceMismatch-567x510-1.png b/content/posts/2022/06/06/microstream-part-1-what-is-it/impedanceMismatch-567x510-1.png deleted file mode 100644 index 0598d2d8b..000000000 Binary files a/content/posts/2022/06/06/microstream-part-1-what-is-it/impedanceMismatch-567x510-1.png and /dev/null differ diff --git a/content/posts/2022/06/06/microstream-part-1-what-is-it/impedanceMismatch-567x510.jpg b/content/posts/2022/06/06/microstream-part-1-what-is-it/impedanceMismatch-567x510.jpg new file mode 100644 index 000000000..2253a57f4 Binary files /dev/null and b/content/posts/2022/06/06/microstream-part-1-what-is-it/impedanceMismatch-567x510.jpg differ diff --git a/content/posts/2022/06/06/microstream-part-1-what-is-it/impedanceMismatch-567x510.png b/content/posts/2022/06/06/microstream-part-1-what-is-it/impedanceMismatch-567x510.png deleted file mode 100644 index 0598d2d8b..000000000 Binary files a/content/posts/2022/06/06/microstream-part-1-what-is-it/impedanceMismatch-567x510.png and /dev/null differ diff --git a/content/posts/2022/06/06/microstream-part-1-what-is-it/index.md b/content/posts/2022/06/06/microstream-part-1-what-is-it/index.md index 3e15070f8..b9592e169 100644 --- a/content/posts/2022/06/06/microstream-part-1-what-is-it/index.md +++ b/content/posts/2022/06/06/microstream-part-1-what-is-it/index.md @@ -5,7 +5,7 @@ lastmod: "2022-06-06T08:06:10+00:00" description: "MicroStream is the high-performance Java-Native-Persistence framework to overcome database impedance mismatches." authors: - "rudy-de-busscher" -image: "impedanceMismatch-567x510-1.png" +image: "impedanceMismatch-567x510-1.jpg" categories: - "Databases" - "DataEngineering" @@ -34,7 +34,7 @@ That is the main idea of the [MicroStream framework](https://microstream.one/), In the most simple cases, the structure of the data within memory matches the data structure in the database relatively well. We have Entities that map to tables and properties that match fields in the database. But sometimes the ideal structure in both systems does not match. And in all cases, the data needs to be retrieved from the relational system using a specific protocol. -![Shows mismatch between Java Object Graph and Database table storage](impedanceMismatch-567x510.png) +![Shows mismatch between Java Object Graph and Database table storage](impedanceMismatch-567x510.jpg) Retrieving a single record is relatively straightforward. But all the required data is seldom included in a single record in the external system. So we need to execute a complex multi-table query with many relations and restrictions. The alternative is executing many simple queries but these roundtrips to the other system are also very time-consuming. The ORM (Object Relational Mapping) frameworks relieved the developer from writing database queries, but these generic frameworks are not super fast, and often many tweaks need to be applied to retrieve the data with an acceptable speed. diff --git a/content/posts/2022/06/07/how-to-add-an-event-to-the-foojay-event-calendar/calendar-october-2026.jpg b/content/posts/2022/06/07/how-to-add-an-event-to-the-foojay-event-calendar/calendar-october-2026.jpg new file mode 100644 index 000000000..43ccef273 Binary files /dev/null and b/content/posts/2022/06/07/how-to-add-an-event-to-the-foojay-event-calendar/calendar-october-2026.jpg differ diff --git a/content/posts/2022/06/07/how-to-add-an-event-to-the-foojay-event-calendar/calendar-october-2026.png b/content/posts/2022/06/07/how-to-add-an-event-to-the-foojay-event-calendar/calendar-october-2026.png deleted file mode 100644 index e4f790f18..000000000 Binary files a/content/posts/2022/06/07/how-to-add-an-event-to-the-foojay-event-calendar/calendar-october-2026.png and /dev/null differ diff --git a/content/posts/2022/06/07/how-to-add-an-event-to-the-foojay-event-calendar/index.md b/content/posts/2022/06/07/how-to-add-an-event-to-the-foojay-event-calendar/index.md index 6ec63495a..5a84c5fc1 100644 --- a/content/posts/2022/06/07/how-to-add-an-event-to-the-foojay-event-calendar/index.md +++ b/content/posts/2022/06/07/how-to-add-an-event-to-the-foojay-event-calendar/index.md @@ -6,7 +6,7 @@ description: "If you want to add an event to our calendar or advertize your even authors: - "bazlur-rahman" - "frankdelporte" -image: "calendar-october-2026.png" +image: "calendar-october-2026.jpg" categories: - "Events" - "Foojay" @@ -28,7 +28,7 @@ You will find all the events in the following link: *Updated: foojay.io no longer runs on WordPress, so events are no longer added through a login. The steps below are the current ones.* -![Foojay Event Calendar October 2026](calendar-october-2026.png) +![Foojay Event Calendar October 2026](calendar-october-2026.jpg) If you want to add an event to our calendar or advertise your event on Foojay.io, there are two routes, and which one you need depends on whether your diff --git a/content/posts/2022/06/07/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/0_H8-xQlbhx0kxOwA_.jpg b/content/posts/2022/06/07/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/0_H8-xQlbhx0kxOwA_.jpg new file mode 100644 index 000000000..0fbabd845 Binary files /dev/null and b/content/posts/2022/06/07/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/0_H8-xQlbhx0kxOwA_.jpg differ diff --git a/content/posts/2022/06/07/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/0_H8-xQlbhx0kxOwA_.png b/content/posts/2022/06/07/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/0_H8-xQlbhx0kxOwA_.png deleted file mode 100644 index f6e0926a4..000000000 Binary files a/content/posts/2022/06/07/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/0_H8-xQlbhx0kxOwA_.png and /dev/null differ diff --git a/content/posts/2022/06/07/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/index.md b/content/posts/2022/06/07/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/index.md index d9a3f0fb6..5abe661c0 100644 --- a/content/posts/2022/06/07/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/index.md +++ b/content/posts/2022/06/07/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/index.md @@ -85,7 +85,7 @@ When you think through the application of these technologies and how you might b Having the right people together to hash out your approach before you wade in will help you identify any limits in your system and other important factors that need to be considered. For example, maybe you have a scarcity of IP addresses. Maybe you're running one big cluster, and now you're talking about many small clusters. Or maybe you run clusters more along business lines or for certain Ops teams. How are you going to start to venture into this multi-cluster multi-region space and ultimately, how are you going to build the plumbing and the pipes between those systems so they can communicate with each other? -![](0_H8-xQlbhx0kxOwA_.png) +![](0_H8-xQlbhx0kxOwA_.jpg) Theoretically, a single team could do this planning. But, that's probably not going to turn out well. It's far more likely that you'll need to involve several teams, including people from operations and people that run the cloud accounts. If you're operating in a hybrid or multi-cloud environment, you'll probably also have some network people involved, too. For example, there may be some firewalls that need to be adjusted in certain ways. diff --git a/content/posts/2022/06/10/remote-debugging-and-developer-observability/counter.jpg b/content/posts/2022/06/10/remote-debugging-and-developer-observability/counter.jpg new file mode 100644 index 000000000..bfda7707b Binary files /dev/null and b/content/posts/2022/06/10/remote-debugging-and-developer-observability/counter.jpg differ diff --git a/content/posts/2022/06/10/remote-debugging-and-developer-observability/counter.png b/content/posts/2022/06/10/remote-debugging-and-developer-observability/counter.png deleted file mode 100644 index b51c995e9..000000000 Binary files a/content/posts/2022/06/10/remote-debugging-and-developer-observability/counter.png and /dev/null differ diff --git a/content/posts/2022/06/10/remote-debugging-and-developer-observability/index.md b/content/posts/2022/06/10/remote-debugging-and-developer-observability/index.md index f5c7ab1f3..7fdd50742 100644 --- a/content/posts/2022/06/10/remote-debugging-and-developer-observability/index.md +++ b/content/posts/2022/06/10/remote-debugging-and-developer-observability/index.md @@ -149,7 +149,7 @@ APMs provide some insight, but they provide very coarse grained information. For Counter works just like that, without the hassle and without deploying. You can use conditional counters as you can with every action to count fine grained usage. -![](counter.png) +![](counter.jpg) ### TicToc \& Method Duration diff --git a/content/posts/2022/06/15/microstream-part-2-configure-the-storage-manager/index.md b/content/posts/2022/06/15/microstream-part-2-configure-the-storage-manager/index.md index 012af4a83..b2f9ae5b7 100644 --- a/content/posts/2022/06/15/microstream-part-2-configure-the-storage-manager/index.md +++ b/content/posts/2022/06/15/microstream-part-2-configure-the-storage-manager/index.md @@ -5,7 +5,7 @@ lastmod: "2022-06-15T08:05:25+00:00" description: "In this second article in the series, we cover how to get started configuring the StorageManager of MicroStream!" authors: - "rudy-de-busscher" -image: "microstream.png" +image: "microstream.jpg" categories: - "Databases" - "DataEngineering" diff --git a/content/posts/2022/06/15/microstream-part-2-configure-the-storage-manager/microstream.jpg b/content/posts/2022/06/15/microstream-part-2-configure-the-storage-manager/microstream.jpg new file mode 100644 index 000000000..98b630b8a Binary files /dev/null and b/content/posts/2022/06/15/microstream-part-2-configure-the-storage-manager/microstream.jpg differ diff --git a/content/posts/2022/06/15/microstream-part-2-configure-the-storage-manager/microstream.png b/content/posts/2022/06/15/microstream-part-2-configure-the-storage-manager/microstream.png deleted file mode 100644 index 0c4aa6088..000000000 Binary files a/content/posts/2022/06/15/microstream-part-2-configure-the-storage-manager/microstream.png and /dev/null differ diff --git a/content/posts/2022/06/16/deep-learning-in-java-for-nuclear-physics-using-deep-netts/FeedForwardNeuralNetwork-e8f7a4a5.png b/content/posts/2022/06/16/deep-learning-in-java-for-nuclear-physics-using-deep-netts/FeedForwardNeuralNetwork-e8f7a4a5.png new file mode 100644 index 000000000..170d6d8bb Binary files /dev/null and b/content/posts/2022/06/16/deep-learning-in-java-for-nuclear-physics-using-deep-netts/FeedForwardNeuralNetwork-e8f7a4a5.png differ diff --git a/content/posts/2022/06/16/deep-learning-in-java-for-nuclear-physics-using-deep-netts/index.md b/content/posts/2022/06/16/deep-learning-in-java-for-nuclear-physics-using-deep-netts/index.md index 9bf6e83ca..72ac6f988 100644 --- a/content/posts/2022/06/16/deep-learning-in-java-for-nuclear-physics-using-deep-netts/index.md +++ b/content/posts/2022/06/16/deep-learning-in-java-for-nuclear-physics-using-deep-netts/index.md @@ -37,7 +37,7 @@ The full research paper is available [here](https://arxiv.org/abs/2202.06869 "he The figure below shows two reactions where missing nucleon was identified through the missing mass of detected particles, and shows significant increase in statistics (solid line) when using AI to identify tracks through their segments in the drift chambers. -![](https://userweb.jlab.org/~gavalian/figures/physics_scan.png) +![](physics_scan-a970e559.png) ## Implementation @@ -47,7 +47,7 @@ We also implemented MLP based auto-encoder to reconstruct missing segments from The reconstruction software infrastructure for CLAS12 detector is a Service Oriented Architecture (SOA) written in Java. -![](https://www.deepnetts.com/blog/wp-content/uploads/2019/02/FeedForwardNeuralNetwork.png) +![](FeedForwardNeuralNetwork-e8f7a4a5.png) We searched for Java machine learning libraries that can be easily integrated into our software infrastructure. diff --git a/content/posts/2022/06/16/deep-learning-in-java-for-nuclear-physics-using-deep-netts/physics_scan-a970e559.png b/content/posts/2022/06/16/deep-learning-in-java-for-nuclear-physics-using-deep-netts/physics_scan-a970e559.png new file mode 100644 index 000000000..8efdf9f5e Binary files /dev/null and b/content/posts/2022/06/16/deep-learning-in-java-for-nuclear-physics-using-deep-netts/physics_scan-a970e559.png differ diff --git a/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/J8eYWzZC4-c45c46c6.png b/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/J8eYWzZC4-c45c46c6.png new file mode 100644 index 000000000..d120c1391 Binary files /dev/null and b/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/J8eYWzZC4-c45c46c6.png differ diff --git a/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/RMkm_mRVG-8dac44fc.jpg b/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/RMkm_mRVG-8dac44fc.jpg new file mode 100644 index 000000000..f142f0527 Binary files /dev/null and b/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/RMkm_mRVG-8dac44fc.jpg differ diff --git a/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/h8Wqwl1Yk-73b817ce.jpg b/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/h8Wqwl1Yk-73b817ce.jpg new file mode 100644 index 000000000..ba974008f Binary files /dev/null and b/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/h8Wqwl1Yk-73b817ce.jpg differ diff --git a/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/index.md b/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/index.md index 4443e9982..aa649e4a8 100644 --- a/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/index.md +++ b/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/index.md @@ -161,11 +161,11 @@ And it led me to the Element class. In it I ctrl-clicked the Selector "select" m Here, I could place a conditional snapshot to see every case where an "a\[href\]" query is made: -![image1.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1650367462176/h8Wqwl1Yk.png) +![image1.png](h8Wqwl1Yk-73b817ce.jpg) This can show me the methods/lines that perform that query: -![image4.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1650465643162/RMkm_mRVG.png) +![image4.png](RMkm_mRVG-8dac44fc.jpg) This can help a lot in narrowing down the general problematic area in the document object hierarchy. @@ -179,7 +179,7 @@ First, we add a log with the following text: "Executing query {query}" ``` -![image2.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1650465598568/jjkSGCvVa.png) +![image2.png](jjkSGCvVa-be908031.jpg) Then, to find out how many entries we returned, we just go to the caller (which we know thanks to the stack in the snapshot) and add the following log there: @@ -214,7 +214,7 @@ Lightrun provides the ability to pipe all of Lightrun's injected logging to the To send logs only to the plugin, select the piping mode as "plugin". -![image3.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1650465790348/J8eYWzZC4.png) +![image3.png](J8eYWzZC4-c45c46c6.png) ### PII Reduction/Blocklists diff --git a/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/jjkSGCvVa-be908031.jpg b/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/jjkSGCvVa-be908031.jpg new file mode 100644 index 000000000..f2deb37be Binary files /dev/null and b/content/posts/2022/06/17/debugging-jsoup-java-code-in-production-using-lightrun/jjkSGCvVa-be908031.jpg differ diff --git a/content/posts/2022/06/20/java-on-visual-studio-code-may-update/index.md b/content/posts/2022/06/20/java-on-visual-studio-code-may-update/index.md index 0add2cc00..91e1ba780 100644 --- a/content/posts/2022/06/20/java-on-visual-studio-code-may-update/index.md +++ b/content/posts/2022/06/20/java-on-visual-studio-code-may-update/index.md @@ -33,7 +33,7 @@ Here is a demonstration of this feature The settings to control how you would like to customize the signature help behavior can be found in the following screenshot: -[![Signature Help Setting](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/05/signaturehelp.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/05/signaturehelp.png) +[![Signature Help Setting](signaturehelp.png)](signaturehelp.png) If you are interested, you can also see a more detailed list of how you can utilize these improvements in the [original PR](https://github.com/eclipse/eclipse.jdt.ls/pull/2039) here @@ -47,7 +47,7 @@ In our latest release, we have made some changes so now it fully works with our The setting to set this preference can be found here: -[![Insert replace code completion](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/05/insertreplace.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/05/insertreplace.png) +[![Insert replace code completion](insertreplace-4e2ffeed.png)](insertreplace-4e2ffeed.png) We hope these user experience improvements can really help to speed up your coding productivity! diff --git a/content/posts/2022/06/20/java-on-visual-studio-code-may-update/insertreplace-4e2ffeed.png b/content/posts/2022/06/20/java-on-visual-studio-code-may-update/insertreplace-4e2ffeed.png new file mode 100644 index 000000000..fa7e606b7 Binary files /dev/null and b/content/posts/2022/06/20/java-on-visual-studio-code-may-update/insertreplace-4e2ffeed.png differ diff --git a/content/posts/2022/06/21/master-detail-with-hilla/image-1754a3fb.png b/content/posts/2022/06/21/master-detail-with-hilla/image-1754a3fb.png new file mode 100644 index 000000000..731460f6a Binary files /dev/null and b/content/posts/2022/06/21/master-detail-with-hilla/image-1754a3fb.png differ diff --git a/content/posts/2022/06/21/master-detail-with-hilla/index.md b/content/posts/2022/06/21/master-detail-with-hilla/index.md index a797033c7..fe638ede9 100644 --- a/content/posts/2022/06/21/master-detail-with-hilla/index.md +++ b/content/posts/2022/06/21/master-detail-with-hilla/index.md @@ -38,7 +38,7 @@ npx @vaadin/cli init --hilla my-hilla-app ``` Or use [start.vaadin.com](https://start.vaadin.com). Make sure that you delete all views and add one of those -![](https://martinelli.ch/wp-content/uploads/2022/06/image.png) +![](image-1754a3fb.png) ## The Endpoint diff --git a/content/posts/2022/06/24/spring-boot-performance-workshop-with-vlad-mihalcea/1200x625A.jpg b/content/posts/2022/06/24/spring-boot-performance-workshop-with-vlad-mihalcea/1200x625A.jpg new file mode 100644 index 000000000..3ec37d8ea Binary files /dev/null and b/content/posts/2022/06/24/spring-boot-performance-workshop-with-vlad-mihalcea/1200x625A.jpg differ diff --git a/content/posts/2022/06/24/spring-boot-performance-workshop-with-vlad-mihalcea/1200x625A.png b/content/posts/2022/06/24/spring-boot-performance-workshop-with-vlad-mihalcea/1200x625A.png deleted file mode 100644 index f4001feb0..000000000 Binary files a/content/posts/2022/06/24/spring-boot-performance-workshop-with-vlad-mihalcea/1200x625A.png and /dev/null differ diff --git a/content/posts/2022/06/24/spring-boot-performance-workshop-with-vlad-mihalcea/index.md b/content/posts/2022/06/24/spring-boot-performance-workshop-with-vlad-mihalcea/index.md index 84cd8ffa5..c7dbcf2c9 100644 --- a/content/posts/2022/06/24/spring-boot-performance-workshop-with-vlad-mihalcea/index.md +++ b/content/posts/2022/06/24/spring-boot-performance-workshop-with-vlad-mihalcea/index.md @@ -6,7 +6,7 @@ description: "Learn how to improve the performance of a Spring application and d canonical: "https://lightrun.com/tutorials/spring-boot-performance-workshop-with-vlad-mihalcea/" authors: - "shai-almog" -image: "1200x625A.png" +image: "1200x625A.jpg" categories: - "Performance" - "Spring" diff --git a/content/posts/2022/07/01/understand-source-code-deep-into-the-codebase-locally-and-in-production/Code-exploration.jpg b/content/posts/2022/07/01/understand-source-code-deep-into-the-codebase-locally-and-in-production/Code-exploration.jpg new file mode 100644 index 000000000..0ca9c208a Binary files /dev/null and b/content/posts/2022/07/01/understand-source-code-deep-into-the-codebase-locally-and-in-production/Code-exploration.jpg differ diff --git a/content/posts/2022/07/01/understand-source-code-deep-into-the-codebase-locally-and-in-production/Code-exploration.png b/content/posts/2022/07/01/understand-source-code-deep-into-the-codebase-locally-and-in-production/Code-exploration.png deleted file mode 100644 index 478e4b711..000000000 Binary files a/content/posts/2022/07/01/understand-source-code-deep-into-the-codebase-locally-and-in-production/Code-exploration.png and /dev/null differ diff --git a/content/posts/2022/07/01/understand-source-code-deep-into-the-codebase-locally-and-in-production/index.md b/content/posts/2022/07/01/understand-source-code-deep-into-the-codebase-locally-and-in-production/index.md index f865663d1..b3281ff61 100644 --- a/content/posts/2022/07/01/understand-source-code-deep-into-the-codebase-locally-and-in-production/index.md +++ b/content/posts/2022/07/01/understand-source-code-deep-into-the-codebase-locally-and-in-production/index.md @@ -5,7 +5,7 @@ lastmod: "2022-07-22T14:24:50+00:00" description: "Learn a new codebase by diving into it with debuggers to understand the full extent of internal semantics and interactions in the project." authors: - "shai-almog" -image: "Code-exploration.png" +image: "Code-exploration.jpg" categories: - "Tutorials" related_posts: diff --git a/content/posts/2022/07/06/microstream-part-5-caching-integrations-and-clustering/index.md b/content/posts/2022/07/06/microstream-part-5-caching-integrations-and-clustering/index.md index 19fe26bbc..ea3cc7d9d 100644 --- a/content/posts/2022/07/06/microstream-part-5-caching-integrations-and-clustering/index.md +++ b/content/posts/2022/07/06/microstream-part-5-caching-integrations-and-clustering/index.md @@ -5,7 +5,7 @@ lastmod: "2022-07-06T07:13:35+00:00" description: "In this article, we discuss MicroStream caching and clustering functionality. We also indicate the available integrations." authors: - "rudy-de-busscher" -image: "microstream.png" +image: "microstream.jpg" categories: - "Databases" - "DataEngineering" diff --git a/content/posts/2022/07/06/microstream-part-5-caching-integrations-and-clustering/microstream.jpg b/content/posts/2022/07/06/microstream-part-5-caching-integrations-and-clustering/microstream.jpg new file mode 100644 index 000000000..98b630b8a Binary files /dev/null and b/content/posts/2022/07/06/microstream-part-5-caching-integrations-and-clustering/microstream.jpg differ diff --git a/content/posts/2022/07/06/microstream-part-5-caching-integrations-and-clustering/microstream.png b/content/posts/2022/07/06/microstream-part-5-caching-integrations-and-clustering/microstream.png deleted file mode 100644 index 0c4aa6088..000000000 Binary files a/content/posts/2022/07/06/microstream-part-5-caching-integrations-and-clustering/microstream.png and /dev/null differ diff --git a/content/posts/2022/07/08/debugging-gson-moshi-and-jackson-json-frameworks-in-production/Debugging-JSON-API-Requests-1.jpg b/content/posts/2022/07/08/debugging-gson-moshi-and-jackson-json-frameworks-in-production/Debugging-JSON-API-Requests-1.jpg new file mode 100644 index 000000000..b8cd429e4 Binary files /dev/null and b/content/posts/2022/07/08/debugging-gson-moshi-and-jackson-json-frameworks-in-production/Debugging-JSON-API-Requests-1.jpg differ diff --git a/content/posts/2022/07/08/debugging-gson-moshi-and-jackson-json-frameworks-in-production/Debugging-JSON-API-Requests-1.png b/content/posts/2022/07/08/debugging-gson-moshi-and-jackson-json-frameworks-in-production/Debugging-JSON-API-Requests-1.png deleted file mode 100644 index 962c6cb1c..000000000 Binary files a/content/posts/2022/07/08/debugging-gson-moshi-and-jackson-json-frameworks-in-production/Debugging-JSON-API-Requests-1.png and /dev/null differ diff --git a/content/posts/2022/07/08/debugging-gson-moshi-and-jackson-json-frameworks-in-production/index.md b/content/posts/2022/07/08/debugging-gson-moshi-and-jackson-json-frameworks-in-production/index.md index 4c911965e..93dbd0a6c 100644 --- a/content/posts/2022/07/08/debugging-gson-moshi-and-jackson-json-frameworks-in-production/index.md +++ b/content/posts/2022/07/08/debugging-gson-moshi-and-jackson-json-frameworks-in-production/index.md @@ -6,7 +6,7 @@ description: "Parsing is a major source of production failures. Some are easy to canonical: "https://lightrun.com/tutorials/debugging-gson-moshi-and-jackson-json-frameworks-in-production/" authors: - "shai-almog" -image: "Debugging-JSON-API-Requests-1.png" +image: "Debugging-JSON-API-Requests-1.jpg" categories: - "Developer Tools" - "IntelliJ IDEA" diff --git a/content/posts/2022/07/11/java-on-azure-tooling-update-july-2022/index.md b/content/posts/2022/07/11/java-on-azure-tooling-update-july-2022/index.md index 7b4d88b49..382b4e571 100644 --- a/content/posts/2022/07/11/java-on-azure-tooling-update-july-2022/index.md +++ b/content/posts/2022/07/11/java-on-azure-tooling-update-july-2022/index.md @@ -57,7 +57,7 @@ After you have upgraded or installed the latest of the toolkit, it will automati Once your click one of these two samples, our plugin will guide you to finish an end-to-end process. You can have an overview of all steps (as the screenshot shows below). -![](overview2.png) +![](overview2.jpg) When you're done, you will have your first application successfully running on Azure. Next, you could click the button "View in Azure Explorer" to focus on your app resources in Azure Explorer. Here is a short demonstration for it. diff --git a/content/posts/2022/07/11/java-on-azure-tooling-update-july-2022/overview2.jpg b/content/posts/2022/07/11/java-on-azure-tooling-update-july-2022/overview2.jpg new file mode 100644 index 000000000..14cfdc9ae Binary files /dev/null and b/content/posts/2022/07/11/java-on-azure-tooling-update-july-2022/overview2.jpg differ diff --git a/content/posts/2022/07/11/java-on-azure-tooling-update-july-2022/overview2.png b/content/posts/2022/07/11/java-on-azure-tooling-update-july-2022/overview2.png deleted file mode 100644 index 38d130b7b..000000000 Binary files a/content/posts/2022/07/11/java-on-azure-tooling-update-july-2022/overview2.png and /dev/null differ diff --git a/content/posts/2022/07/15/debugging-java-collections-framework-issues-in-production/Screen-Shot-2022-03-28-at-14.59.23-700x414.jpg b/content/posts/2022/07/15/debugging-java-collections-framework-issues-in-production/Screen-Shot-2022-03-28-at-14.59.23-700x414.jpg new file mode 100644 index 000000000..b072ef401 Binary files /dev/null and b/content/posts/2022/07/15/debugging-java-collections-framework-issues-in-production/Screen-Shot-2022-03-28-at-14.59.23-700x414.jpg differ diff --git a/content/posts/2022/07/15/debugging-java-collections-framework-issues-in-production/Screen-Shot-2022-03-28-at-14.59.23-700x414.png b/content/posts/2022/07/15/debugging-java-collections-framework-issues-in-production/Screen-Shot-2022-03-28-at-14.59.23-700x414.png deleted file mode 100644 index a74245d52..000000000 Binary files a/content/posts/2022/07/15/debugging-java-collections-framework-issues-in-production/Screen-Shot-2022-03-28-at-14.59.23-700x414.png and /dev/null differ diff --git a/content/posts/2022/07/15/debugging-java-collections-framework-issues-in-production/index.md b/content/posts/2022/07/15/debugging-java-collections-framework-issues-in-production/index.md index 719e80b85..c3947dd5f 100644 --- a/content/posts/2022/07/15/debugging-java-collections-framework-issues-in-production/index.md +++ b/content/posts/2022/07/15/debugging-java-collections-framework-issues-in-production/index.md @@ -107,7 +107,7 @@ vet.getFirstName().equals("Shai") If it's met I can print out the full details for the entry: `Current vet is {newVet}`. -![](Screen-Shot-2022-03-28-at-14.59.23-700x414.png) +![](Screen-Shot-2022-03-28-at-14.59.23-700x414.jpg) ## Preparation diff --git a/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/1-423NV_D5lKEF1wFxBQ3zQg-591c3045.png b/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/1-423NV_D5lKEF1wFxBQ3zQg-591c3045.png new file mode 100644 index 000000000..dd18efcae Binary files /dev/null and b/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/1-423NV_D5lKEF1wFxBQ3zQg-591c3045.png differ diff --git a/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/1-h6-tkIIyMb0YUmqg5uR4jg-89c69092.png b/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/1-h6-tkIIyMb0YUmqg5uR4jg-89c69092.png new file mode 100644 index 000000000..7952d6d81 Binary files /dev/null and b/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/1-h6-tkIIyMb0YUmqg5uR4jg-89c69092.png differ diff --git a/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/1_0FUueLptBTH-g9orqUngWg.jpg b/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/1_0FUueLptBTH-g9orqUngWg.jpg new file mode 100644 index 000000000..019012b86 Binary files /dev/null and b/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/1_0FUueLptBTH-g9orqUngWg.jpg differ diff --git a/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/1_0FUueLptBTH-g9orqUngWg.png b/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/1_0FUueLptBTH-g9orqUngWg.png deleted file mode 100644 index f249987cf..000000000 Binary files a/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/1_0FUueLptBTH-g9orqUngWg.png and /dev/null differ diff --git a/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/index.md b/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/index.md index f205930ec..914adc2eb 100644 --- a/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/index.md +++ b/content/posts/2022/07/20/general-build-distribution-a-game-changer-or-a-gimmick/index.md @@ -5,7 +5,7 @@ lastmod: "2022-07-28T17:34:17+00:00" description: "Understand the performance potential of remote and distributed builds and explore how to improve build feedback times." authors: - "kyle-moore" -image: "1_0FUueLptBTH-g9orqUngWg.png" +image: "1_0FUueLptBTH-g9orqUngWg.jpg" categories: - "DevOps" - "Performance" @@ -55,7 +55,7 @@ Thus, we encourage skepticism at claims of building large projects "from scratch The key to understanding the maximum speed potential of any build (locally built, hosted remotely or distributed) is to visualize the interdependencies of its outputs. Imagine a relatively small software project having three subprojects: A, B and C. If compiling subproject C requires the outputs of subprojects A and B, then C *depends on* A and B. Most importantly, we cannot begin building C until both A and B are complete; therefore the best-case build-time scenario can be denoted as ***max(A, B) + C*** . Given a local or remote build host with unlimited CPU cores, or a pool of unlimited distributed build agents, the build *cannot* be parallelized further than this bottleneck. -[![Project structure](https://miro.medium.com/max/1400/1*423NV_D5lKEF1wFxBQ3zQg.png "Project structure")](// "Project structure") +[![Project structure](1-423NV_D5lKEF1wFxBQ3zQg-591c3045.png "Project structure")](// "Project structure") *Figure 1.: Project structure* As we see that this bottleneck is dependency-based and not performance-based, we now have the ability to predict the potential benefit of remote or distributed builds. @@ -68,7 +68,7 @@ To put this theory to the test, we've performed some analysis of the *paralleliz This last point is critical: tasks that operate as a single process - with no other processes executing simultaneously - are indicative of a bottleneck, like subproject C in the above example. Single-process tasks are proof that further optimization via distribution is not possible. It *is* possible that a more powerful remote CPU would finish the compilation task more quickly, but this benefit could easily be negated by the overhead of sending bits back and forth. -[![Time V Threads](https://miro.medium.com/max/1400/1*h6-tkIIyMb0YUmqg5uR4jg.png "Time V Threads")](http://https://miro.medium.com/max/1400/1*h6-tkIIyMb0YUmqg5uR4jg.png "Time V Threads") +[![Time V Threads](1-h6-tkIIyMb0YUmqg5uR4jg-89c69092.png "Time V Threads")](http://1-h6-tkIIyMb0YUmqg5uR4jg-89c69092.png "Time V Threads") *Figure 2.: Cumulative work time, grouped by number of concurrent workers. Half of the work was executed with no other busy processes running in parallel.* Setting aside test execution (addressed by Test Distribution, see [above](#test-execution-is-the-bottleneck)), and focusing on the remaining CPU-intensive 10-20% portion of build times, we find that the potential for optimization is low. The failure of half these tasks to execute in parallel with other processes means that, at best, a general distribution solution could expedite only 5-10% of overall build time, while incurring significant costs in terms of build complexity and management overhead. diff --git a/content/posts/2022/07/22/the-cost-of-production-blindness/Cost-Saving-with-Lightrun.jpg b/content/posts/2022/07/22/the-cost-of-production-blindness/Cost-Saving-with-Lightrun.jpg new file mode 100644 index 000000000..2e354a528 Binary files /dev/null and b/content/posts/2022/07/22/the-cost-of-production-blindness/Cost-Saving-with-Lightrun.jpg differ diff --git a/content/posts/2022/07/22/the-cost-of-production-blindness/Cost-Saving-with-Lightrun.png b/content/posts/2022/07/22/the-cost-of-production-blindness/Cost-Saving-with-Lightrun.png deleted file mode 100644 index d597aaa49..000000000 Binary files a/content/posts/2022/07/22/the-cost-of-production-blindness/Cost-Saving-with-Lightrun.png and /dev/null differ diff --git a/content/posts/2022/07/22/the-cost-of-production-blindness/index.md b/content/posts/2022/07/22/the-cost-of-production-blindness/index.md index 27e6bcbf8..04a489dca 100644 --- a/content/posts/2022/07/22/the-cost-of-production-blindness/index.md +++ b/content/posts/2022/07/22/the-cost-of-production-blindness/index.md @@ -5,7 +5,7 @@ lastmod: "2022-07-22T08:11:04+00:00" description: "Cloud rose to fame on the banner of cutting costs but with its tremendous growth, spend is rocketing. Learn how you can cut down overspend!" authors: - "shai-almog" -image: "Cost-Saving-with-Lightrun.png" +image: "Cost-Saving-with-Lightrun.jpg" categories: - "Opinion" - "Performance" diff --git a/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/cover.jpg b/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/cover.jpg new file mode 100644 index 000000000..6c73e451c Binary files /dev/null and b/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/cover.jpg differ diff --git a/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/cover.png b/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/cover.png deleted file mode 100644 index c8cc2d2b9..000000000 Binary files a/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/cover.png and /dev/null differ diff --git a/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/dashboard-f5440f04.jpg b/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/dashboard-f5440f04.jpg new file mode 100644 index 000000000..c17b63b3f Binary files /dev/null and b/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/dashboard-f5440f04.jpg differ diff --git a/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/datasource-edd705f2.png b/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/datasource-edd705f2.png new file mode 100644 index 000000000..7789c5b36 Binary files /dev/null and b/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/datasource-edd705f2.png differ diff --git a/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/index.md b/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/index.md index ee27515f4..7266c790e 100644 --- a/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/index.md +++ b/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/index.md @@ -5,7 +5,7 @@ lastmod: "2022-07-27T08:36:47+00:00" description: "For cloud native engineers facing the challenge of observing multiple Azure Kubernetes Clusters and needing a flexible, stateless solution!" authors: - "alessandro-vozza" -image: "cover.png" +image: "cover.jpg" categories: - "Developer Tools" related_posts: @@ -39,7 +39,7 @@ This article was inspired by several sources, most importantly this two articles We will deploy all components of Thanos and Prometheus in a single cluster, but since they are couple only via the ingress they don't need to be co-located. -![Diagram](https://raw.githubusercontent.com/ams0/ams0/deddfb117c95f739fda88c00a963604b9df3dd59/blog/dev.to/posts/stateless-monitoring-with-aks-thanos-prometheus-grafana/assets/images/stateless_thanos.png) +![Diagram](stateless_thanos-399587bc.png) ### Cluster-wide services @@ -237,13 +237,13 @@ To start, head to the Azure Portal and deploy AME; then, get the endpoint from t Add a new source of type Prometheus and basic authentication (the same we created before): -![Datasource](https://raw.githubusercontent.com/ams0/ams0/main/blog/dev.to/posts/stateless-monitoring-with-aks-thanos-prometheus-grafana/assets/images/datasource.png) +![Datasource](datasource-edd705f2.png) Congratulations! We can now visualize the data flowing from Prometheus, we only need a dashboard to properly display the data. Go to (on the left side navigation bar) Dashboards-\> Browse and click on Import; import the "Kubernetes / Views / Global" (ID: 15757) into your Grafana and you'll be able to see the metrics from the cluster: -![Dashboard](https://github.com/ams0/ams0/raw/main/blog/dev.to/posts/stateless-monitoring-with-aks-thanos-prometheus-grafana/assets/images/dashboard.png) +![Dashboard](dashboard-f5440f04.jpg) The imported dashboard has no filter for cluster or region, thus will show all cluster metrics aggregated. We will show in a future post how to add a variable to a Grafana dashboard to properly select and filter cluster views. diff --git a/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/stateless_thanos-399587bc.png b/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/stateless_thanos-399587bc.png new file mode 100644 index 000000000..8b7b9faf8 Binary files /dev/null and b/content/posts/2022/07/27/stateless-secretless-multi-cluster-monitoring-in-azure-kubernetes-service-with-thanos-prometheus-and-azure-managed-grafana/stateless_thanos-399587bc.png differ diff --git a/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/0-hQYNvxeSBRnr062z-b632bff3.png b/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/0-hQYNvxeSBRnr062z-b632bff3.png new file mode 100644 index 000000000..763f93a95 Binary files /dev/null and b/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/0-hQYNvxeSBRnr062z-b632bff3.png differ diff --git a/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/0-ilQdE60YGfg6BUBd-6b6db3cb.jpg b/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/0-ilQdE60YGfg6BUBd-6b6db3cb.jpg new file mode 100644 index 000000000..9dd2d5677 Binary files /dev/null and b/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/0-ilQdE60YGfg6BUBd-6b6db3cb.jpg differ diff --git a/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/0-oNCO_BeAyzirc2s3-669cdb8a.png b/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/0-oNCO_BeAyzirc2s3-669cdb8a.png new file mode 100644 index 000000000..5d54180ec Binary files /dev/null and b/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/0-oNCO_BeAyzirc2s3-669cdb8a.png differ diff --git a/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/deepnetts.jpg b/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/deepnetts.jpg new file mode 100644 index 000000000..8b45d1dca Binary files /dev/null and b/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/deepnetts.jpg differ diff --git a/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/deepnetts.png b/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/deepnetts.png deleted file mode 100644 index 62e50eff5..000000000 Binary files a/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/deepnetts.png and /dev/null differ diff --git a/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/index.md b/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/index.md index 455abcbac..820625fde 100644 --- a/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/index.md +++ b/content/posts/2022/08/03/getting-started-with-deep-learning-in-java-using-deep-netts-part-2/index.md @@ -5,7 +5,7 @@ lastmod: "2023-07-11T09:37:04+00:00" description: "For more complex deep learning challenges, more data, and need better performance, take a look at Deep Netts Professional Edition." authors: - "zoran-sevarac" -image: "deepnetts.png" +image: "deepnetts.jpg" categories: - "Deep Netts" - "Machine Learning" @@ -38,7 +38,7 @@ This example shows how to build a deep learning model in Java that can learn how The data set consists of 60000 images of handwritten digits. Each image is size of 28x28 pixels. Few sample images are shown in the image below. -![](https://miro.medium.com/max/720/0*hQYNvxeSBRnr062z) +![](0-hQYNvxeSBRnr062z-b632bff3.png) As you can see, there is a lot of variation in each digit, and it would be impossible to come out with some set of rules to recognize these digits - that's why we want to build a model which will be capable to extract and learn patterns from these examples. @@ -55,7 +55,7 @@ Convolutional neural networks are type of deep learning models which are capable The image bellow shows the architecture of a typical convolutional neural network which consists of a few blocks of convolutional and pooling operations which perform feature detection/extraction, followed by the fully connected layers that perform classification. -![](https://miro.medium.com/max/1750/0*oNCO_BeAyzirc2s3) +![](0-oNCO_BeAyzirc2s3-669cdb8a.png) The convolutional neural network can be created using the following Java code snippet in Deep Netts, using [ConvolutionalNetwork](https://www.deepnetts.com/apidocs/deepnetts/net/ConvolutionalNetwork.html) class and it's corresponding [builder](https://www.deepnetts.com/apidocs/deepnetts/net/ConvolutionalNetwork.Builder.html). @@ -83,7 +83,7 @@ Not only does it increases productivity in AI development, but it also helps dev It is built on top of [Apache NetBeans](https://netbeans.apache.org/), following proven practices in UX and architecture. -![](https://miro.medium.com/max/1750/0*ilQdE60YGfg6BUBd) +![](0-ilQdE60YGfg6BUBd-6b6db3cb.jpg) ## Differences Compared to Community Edition diff --git a/content/posts/2022/08/10/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes-pt-1/index.md b/content/posts/2022/08/10/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes-pt-1/index.md index d4c086604..41c2d2fe1 100644 --- a/content/posts/2022/08/10/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes-pt-1/index.md +++ b/content/posts/2022/08/10/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes-pt-1/index.md @@ -6,7 +6,7 @@ description: "Today let's examine different Kubernetes deployment patterns and s canonical: "https://k8ssandra.io/blog/tutorials/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes/" authors: - "jeff-carpenter" -image: "k8ssandra-docs-architecture-Multi-cluster-1.png" +image: "k8ssandra-docs-architecture-Multi-cluster-1.jpg" categories: - "Apache Cassandra" - "Databases" @@ -261,7 +261,7 @@ UN 10.120.3.7 158.64 KiB 256 17.8% 9e686277-9a78-49f6-b ``` If everything has been configured correctly, you'll be able to see both datacenters in the cluster output. Here's a picture that depicts what you've just deployed, focusing on the Cassandra nodes: -![](k8ssandra-docs-architecture-Multi-cluster-1.png) +![](k8ssandra-docs-architecture-Multi-cluster-1.jpg) ## Multiple Cassandra datacenters in a single K8ssandra install? diff --git a/content/posts/2022/08/10/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes-pt-1/k8ssandra-docs-architecture-Multi-cluster-1.jpg b/content/posts/2022/08/10/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes-pt-1/k8ssandra-docs-architecture-Multi-cluster-1.jpg new file mode 100644 index 000000000..49e6409b1 Binary files /dev/null and b/content/posts/2022/08/10/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes-pt-1/k8ssandra-docs-architecture-Multi-cluster-1.jpg differ diff --git a/content/posts/2022/08/10/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes-pt-1/k8ssandra-docs-architecture-Multi-cluster-1.png b/content/posts/2022/08/10/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes-pt-1/k8ssandra-docs-architecture-Multi-cluster-1.png deleted file mode 100644 index 52e97a154..000000000 Binary files a/content/posts/2022/08/10/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes-pt-1/k8ssandra-docs-architecture-Multi-cluster-1.png and /dev/null differ diff --git a/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/5m9Wd26e.jpg b/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/5m9Wd26e.jpg new file mode 100644 index 000000000..bb97f867b Binary files /dev/null and b/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/5m9Wd26e.jpg differ diff --git a/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/5m9Wd26e.png b/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/5m9Wd26e.png deleted file mode 100644 index 9e9a83364..000000000 Binary files a/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/5m9Wd26e.png and /dev/null differ diff --git a/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/Lightrun-developer-productivity-dark-29.jpg b/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/Lightrun-developer-productivity-dark-29.jpg new file mode 100644 index 000000000..4cc5d5229 Binary files /dev/null and b/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/Lightrun-developer-productivity-dark-29.jpg differ diff --git a/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/Lightrun-developer-productivity-dark-29.png b/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/Lightrun-developer-productivity-dark-29.png deleted file mode 100644 index b0c9c4800..000000000 Binary files a/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/Lightrun-developer-productivity-dark-29.png and /dev/null differ diff --git a/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/index.md b/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/index.md index 4ad0cbf1a..b33dbd156 100644 --- a/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/index.md +++ b/content/posts/2022/08/12/when-disaster-strikes-production-troubleshooting/index.md @@ -5,7 +5,7 @@ lastmod: "2022-08-12T11:06:37+00:00" description: "Production is failing and everything is lost? That used to be the case. Fail whale, hysteria and panic. Developer observability fixes this!" authors: - "shai-almog" -image: "Lightrun-developer-productivity-dark-29.png" +image: "Lightrun-developer-productivity-dark-29.jpg" categories: - "Spring" - "sql" @@ -29,7 +29,7 @@ Production doesn't go down in flames as much. Thanks to staging, QA, CI/CD and D So we have all of these things in place. We passed QA, staging and everything's perfect. Right? -![](5m9Wd26e.png) +![](5m9Wd26e.jpg) Well… Not exactly. diff --git a/content/posts/2022/08/19/effectively-bridging-the-devops-rd-gap-without-sacrificing-reliability/index.md b/content/posts/2022/08/19/effectively-bridging-the-devops-rd-gap-without-sacrificing-reliability/index.md index eeb1edeb0..77328cf63 100644 --- a/content/posts/2022/08/19/effectively-bridging-the-devops-rd-gap-without-sacrificing-reliability/index.md +++ b/content/posts/2022/08/19/effectively-bridging-the-devops-rd-gap-without-sacrificing-reliability/index.md @@ -25,7 +25,7 @@ DevOps culture revolutionized our industry. Continuous Delivery and Continuous I Before DevOps practices were commonplace, production used to fail. A lot. We don't want to go back to the time before DevOps tools were commonplace… -![The Twitter Fail Whale Demonstrated the need for DevOps](https://cdn.hashnode.com/res/hashnode/image/upload/v1646648317259/r4Exr4vOY.png) +![The Twitter Fail Whale Demonstrated the need for DevOps](r4Exr4vOY-0117f210.png) ## Everything's Perfect in our Development Process, Right? diff --git a/content/posts/2022/08/19/effectively-bridging-the-devops-rd-gap-without-sacrificing-reliability/r4Exr4vOY-0117f210.png b/content/posts/2022/08/19/effectively-bridging-the-devops-rd-gap-without-sacrificing-reliability/r4Exr4vOY-0117f210.png new file mode 100644 index 000000000..8ffb6515a Binary files /dev/null and b/content/posts/2022/08/19/effectively-bridging-the-devops-rd-gap-without-sacrificing-reliability/r4Exr4vOY-0117f210.png differ diff --git a/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/image-png-Apr-12-2022-05-35-20-81-PM-bfb99696.png b/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/image-png-Apr-12-2022-05-35-20-81-PM-bfb99696.png new file mode 100644 index 000000000..2f13789ec Binary files /dev/null and b/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/image-png-Apr-12-2022-05-35-20-81-PM-bfb99696.png differ diff --git a/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/image-png-Apr-13-2022-10-21-10-20-PM-648c3e15.png b/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/image-png-Apr-13-2022-10-21-10-20-PM-648c3e15.png new file mode 100644 index 000000000..527917489 Binary files /dev/null and b/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/image-png-Apr-13-2022-10-21-10-20-PM-648c3e15.png differ diff --git a/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/image-png-Apr-13-2022-10-22-50-19-PM-4f6db9bc.png b/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/image-png-Apr-13-2022-10-22-50-19-PM-4f6db9bc.png new file mode 100644 index 000000000..527018860 Binary files /dev/null and b/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/image-png-Apr-13-2022-10-22-50-19-PM-4f6db9bc.png differ diff --git a/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/image-png-Apr-14-2022-10-07-13-88-AM-fb666e6b.png b/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/image-png-Apr-14-2022-10-07-13-88-AM-fb666e6b.png new file mode 100644 index 000000000..262fa035e Binary files /dev/null and b/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/image-png-Apr-14-2022-10-07-13-88-AM-fb666e6b.png differ diff --git a/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/image-png-Apr-15-2022-06-12-06-82-PM-352acc17.png b/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/image-png-Apr-15-2022-06-12-06-82-PM-352acc17.png new file mode 100644 index 000000000..b3783ebec Binary files /dev/null and b/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/image-png-Apr-15-2022-06-12-06-82-PM-352acc17.png differ diff --git a/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/index.md b/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/index.md index 293404b90..91b6732e7 100644 --- a/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/index.md +++ b/content/posts/2022/08/25/google-remote-procedure-call-grpc-example-in-payara-server/index.md @@ -39,7 +39,7 @@ gRPC was designed for HTTP/2, which provides important performance benefits over [Protocol Buffers](https://developers.google.com/protocol-buffers) (Protbuf) are used by default to serialize the messages. Protbuf is the Interface Definition Language (IDL) to define the payload messages structure and the service interface. The serialization is very quick on both server and client side. It generates small payload messages which are suitable for limited bandwidth devices like mobile phones. The picture below shows the communication between a gRPC server implemented in Java and two different clients: a C++ Client and an Android App. -![](https://blog.payara.fish/hubfs/image-png-Apr-12-2022-05-35-20-81-PM.png) +![](image-png-Apr-12-2022-05-35-20-81-PM-bfb99696.png) ## gRPC Support in Payara @@ -112,10 +112,10 @@ At this point, we have the service defined. Then we can create the Stubs and wor Once we have `.proto` file, we will create the gRPC client and server interfaces from it. We can do this using Maven as described here: [](https://github.com/grpc/grpc-java/blob/master/README.md) We created a module in our[gRPC example](https://github.com/payara/Payara-Examples/tree/master/grpc)called grpc-stubs, as shown in picture below. The `.proto` file was copied into `proto` folder. -![](https://blog.payara.fish/hubfs/image-png-Apr-13-2022-10-21-10-20-PM.png) +![](image-png-Apr-13-2022-10-21-10-20-PM-648c3e15.png) In `grpc-stubs->pom.xml` we included the gRPC dependencies and protobuf-maven-plugin that can generate the code during the Maven build. If the user clones [Payara-Examples](https://github.com/payara/Payara-Examples/) project, then he just need to run the following Maven command from `grpc-stubs` directory: -![](https://blog.payara.fish/hubfs/image-png-Apr-13-2022-10-22-50-19-PM.png) +![](image-png-Apr-13-2022-10-22-50-19-PM-4f6db9bc.png) The results can be found in `target->generated-sources`. The main files generated by proto-plugin are: @@ -124,7 +124,7 @@ The results can be found in `target->generated-sources`. The main files generate * a `RouteGuideGrpc.RouteGuideImplBase` abstract class to be implemented by Servers and have the methods defined in `RouteGuide` proto service. * `Rectangle.java`, `Point.java` and `Feature.java`. There are also other classes that implement a protocol buffer to manipulate request and response message types. -![](https://blog.payara.fish/hubfs/image-png-Apr-14-2022-10-07-13-88-AM.png) +![](image-png-Apr-14-2022-10-07-13-88-AM-fb666e6b.png) ## Server Creation @@ -308,7 +308,7 @@ Inside `RouteGuideClient` constructor the channel is passed twice to create the ### Service Methods Invocation To finish this section let's see how we call our four service methods. The results showed in this subsection were generated by running: -![](https://blog.payara.fish/hubfs/image-png-Apr-15-2022-06-12-06-82-PM.png) +![](image-png-Apr-15-2022-06-12-06-82-PM-352acc17.png) #### Simple Function Call diff --git a/content/posts/2022/08/25/using-git-interactive-rebase/change-order-700x483.jpg b/content/posts/2022/08/25/using-git-interactive-rebase/change-order-700x483.jpg new file mode 100644 index 000000000..3af5232a3 Binary files /dev/null and b/content/posts/2022/08/25/using-git-interactive-rebase/change-order-700x483.jpg differ diff --git a/content/posts/2022/08/25/using-git-interactive-rebase/change-order-700x483.png b/content/posts/2022/08/25/using-git-interactive-rebase/change-order-700x483.png deleted file mode 100644 index 98a483cb1..000000000 Binary files a/content/posts/2022/08/25/using-git-interactive-rebase/change-order-700x483.png and /dev/null differ diff --git a/content/posts/2022/08/25/using-git-interactive-rebase/index.md b/content/posts/2022/08/25/using-git-interactive-rebase/index.md index 434b83d9a..12f13d19b 100644 --- a/content/posts/2022/08/25/using-git-interactive-rebase/index.md +++ b/content/posts/2022/08/25/using-git-interactive-rebase/index.md @@ -133,7 +133,7 @@ In vi, we can do so as follows: * Move the cursor to the line where you want to reinsert this commit (in this example, the end of the file) and type `p`. * Note: you do **not** need to switch to edit mode to do so. -![](change-order-700x483.png) +![](change-order-700x483.jpg) Once we're sure about the order, we need to save the file. Press `esc` to exit edit mode and type `:wq` to save the file. diff --git a/content/posts/2022/08/29/end-to-end-tracing-opentelemetry/index.md b/content/posts/2022/08/29/end-to-end-tracing-opentelemetry/index.md index bf85ae23c..f3da794c0 100644 --- a/content/posts/2022/08/29/end-to-end-tracing-opentelemetry/index.md +++ b/content/posts/2022/08/29/end-to-end-tracing-opentelemetry/index.md @@ -41,7 +41,7 @@ A tracing solution should provide a standard format to work across heterogeneous One needs to understand that a specification rarely appears from nowhere. In general, the market already has a couple of distinct implementations. Most of the time, a new specification leads to an additional implementation, as the famous XKCD comic describes: -![](https://imgs.xkcd.com/comics/standards.png) +![](standards-d3945873.png) Sometimes, however, a miracle happens: the market adheres to the new specification. Here, Trace Context is a W3C specification, and it seems to have done the trick: > This specification defines standard HTTP headers and a value format to propagate context information that enables distributed tracing scenarios. The specification standardizes how context information is sent and modified between services. Context information uniquely identifies individual requests in a distributed system and also defines a means to add and propagate provider-specific context information. diff --git a/content/posts/2022/08/29/end-to-end-tracing-opentelemetry/standards-d3945873.png b/content/posts/2022/08/29/end-to-end-tracing-opentelemetry/standards-d3945873.png new file mode 100644 index 000000000..5d3830377 Binary files /dev/null and b/content/posts/2022/08/29/end-to-end-tracing-opentelemetry/standards-d3945873.png differ diff --git a/content/posts/2022/09/01/can-java-jakarta-ee-do-microservices/index.md b/content/posts/2022/09/01/can-java-jakarta-ee-do-microservices/index.md index 07f76c4b2..fa903a3bd 100644 --- a/content/posts/2022/09/01/can-java-jakarta-ee-do-microservices/index.md +++ b/content/posts/2022/09/01/can-java-jakarta-ee-do-microservices/index.md @@ -6,7 +6,7 @@ description: "In this myth-busting webinar, Steve Millidge (founder of Payara), canonical: "https://www.payara.fish/dismiss-the-myths/" authors: - "jadon-ortlepp" -image: "javaeedoms.png" +image: "javaeedoms.jpg" categories: - "Jakarta EE" - "Microservices" diff --git a/content/posts/2022/09/01/can-java-jakarta-ee-do-microservices/javaeedoms.jpg b/content/posts/2022/09/01/can-java-jakarta-ee-do-microservices/javaeedoms.jpg new file mode 100644 index 000000000..b8baca429 Binary files /dev/null and b/content/posts/2022/09/01/can-java-jakarta-ee-do-microservices/javaeedoms.jpg differ diff --git a/content/posts/2022/09/01/can-java-jakarta-ee-do-microservices/javaeedoms.png b/content/posts/2022/09/01/can-java-jakarta-ee-do-microservices/javaeedoms.png deleted file mode 100644 index 6fd6c47d8..000000000 Binary files a/content/posts/2022/09/01/can-java-jakarta-ee-do-microservices/javaeedoms.png and /dev/null differ diff --git a/content/posts/2022/09/06/running-your-database-on-openshift-and-codeready-containers/14977909-65ps3ym4omipxy6bypbo-c96ef485.png b/content/posts/2022/09/06/running-your-database-on-openshift-and-codeready-containers/14977909-65ps3ym4omipxy6bypbo-c96ef485.png new file mode 100644 index 000000000..169e5c6ce Binary files /dev/null and b/content/posts/2022/09/06/running-your-database-on-openshift-and-codeready-containers/14977909-65ps3ym4omipxy6bypbo-c96ef485.png differ diff --git a/content/posts/2022/09/06/running-your-database-on-openshift-and-codeready-containers/14977914-xfya19mfue6tcsuyuvl4-4273405b.png b/content/posts/2022/09/06/running-your-database-on-openshift-and-codeready-containers/14977914-xfya19mfue6tcsuyuvl4-4273405b.png new file mode 100644 index 000000000..1764364ab Binary files /dev/null and b/content/posts/2022/09/06/running-your-database-on-openshift-and-codeready-containers/14977914-xfya19mfue6tcsuyuvl4-4273405b.png differ diff --git a/content/posts/2022/09/06/running-your-database-on-openshift-and-codeready-containers/index.md b/content/posts/2022/09/06/running-your-database-on-openshift-and-codeready-containers/index.md index e14fe4762..b1324109c 100644 --- a/content/posts/2022/09/06/running-your-database-on-openshift-and-codeready-containers/index.md +++ b/content/posts/2022/09/06/running-your-database-on-openshift-and-codeready-containers/index.md @@ -70,7 +70,7 @@ Open in a browser the URL [https://console-openshift-console.apps-crc.testing](h Log in using the `kubeadmin` username and password, as used above with the `oc login …` command. You might need to try a few times because of the self-signed certificate used. Once OpenShift has started and is running you should see the following webpage -![](https://dzone.com/storage/temp/14977909-65ps3ym4omipxy6bypbo.png) +![](14977909-65ps3ym4omipxy6bypbo-c96ef485.png) Some commands to help check status and the startup process are @@ -86,7 +86,7 @@ View details with 'oc describe /' or list resources with 'oc get ``` Before continuing, go to the CodeReady Containers Preferences dialog. Increase CPUs and Memory to \>12 and \>14GB correspondingly. -![](https://dzone.com/storage/temp/14977914-xfya19mfue6tcsuyuvl4.png) +![](14977914-xfya19mfue6tcsuyuvl4-4273405b.png) ## Create the OpenShift Local Volumes diff --git a/content/posts/2022/09/07/use-pattern-matching-to-simplify-java/index.md b/content/posts/2022/09/07/use-pattern-matching-to-simplify-java/index.md index 78f68e2b6..513bb18cd 100644 --- a/content/posts/2022/09/07/use-pattern-matching-to-simplify-java/index.md +++ b/content/posts/2022/09/07/use-pattern-matching-to-simplify-java/index.md @@ -6,7 +6,7 @@ description: "Learn from Simon Ritter how pattern matching in Java can make your canonical: "https://www.azul.com/blog/use-pattern-matching-to-simplify-java/" authors: - "simonritter" -image: "pattern-matching-image-li.png" +image: "pattern-matching-image-li.jpg" categories: - "Java Core" related_posts: @@ -185,7 +185,7 @@ As you can see, pattern matching is a powerful addition to the Java language tha It also provides several ways to help detect errors at compile time rather than at runtime when your code is in production. Why not try using pattern matching in your next Java application? -[![Webinar: The Art of Java Language Pattern Matching](https://www.azul.com/wp-content/uploads/pattern-matching-image-li.png)](https://www.azul.com/resources-hub/webinars-2/the-art-of-java-language-pattern-matching-on-demand-webinar) +[![Webinar: The Art of Java Language Pattern Matching](pattern-matching-image-li.jpg)](https://www.azul.com/resources-hub/webinars-2/the-art-of-java-language-pattern-matching-on-demand-webinar) Want to learn more about pattern matching in JDK 18? Watch our on-demand webinar from June 2022, [The Art of Java Language Pattern Matching](https://www.azul.com/resources-hub/webinars-2/the-art-of-java-language-pattern-matching-on-demand-webinar). diff --git a/content/posts/2022/09/07/use-pattern-matching-to-simplify-java/pattern-matching-image-li.jpg b/content/posts/2022/09/07/use-pattern-matching-to-simplify-java/pattern-matching-image-li.jpg new file mode 100644 index 000000000..7809d5331 Binary files /dev/null and b/content/posts/2022/09/07/use-pattern-matching-to-simplify-java/pattern-matching-image-li.jpg differ diff --git a/content/posts/2022/09/07/use-pattern-matching-to-simplify-java/pattern-matching-image-li.png b/content/posts/2022/09/07/use-pattern-matching-to-simplify-java/pattern-matching-image-li.png deleted file mode 100644 index 3f4ea3eec..000000000 Binary files a/content/posts/2022/09/07/use-pattern-matching-to-simplify-java/pattern-matching-image-li.png and /dev/null differ diff --git a/content/posts/2022/09/12/kubernetes-gateway-api/api-model-bb4e5c02.jpg b/content/posts/2022/09/12/kubernetes-gateway-api/api-model-bb4e5c02.jpg new file mode 100644 index 000000000..6a7ea7865 Binary files /dev/null and b/content/posts/2022/09/12/kubernetes-gateway-api/api-model-bb4e5c02.jpg differ diff --git a/content/posts/2022/09/12/kubernetes-gateway-api/index.md b/content/posts/2022/09/12/kubernetes-gateway-api/index.md index 2ee005e0c..78b34cb8a 100644 --- a/content/posts/2022/09/12/kubernetes-gateway-api/index.md +++ b/content/posts/2022/09/12/kubernetes-gateway-api/index.md @@ -71,7 +71,7 @@ The idea behind the Gateway API is to have a clean separation between standard o The above definition also mentions an organizational concern: different roles should manage a different set of objects. -![Gateway API Model](https://gateway-api.sigs.k8s.io/images/api-model.png) +![Gateway API Model](api-model-bb4e5c02.jpg) *Picture from gateway-api.sigs.k8s.io* diff --git a/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/astra-client-credentials-1024x610.jpg b/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/astra-client-credentials-1024x610.jpg new file mode 100644 index 000000000..087a48346 Binary files /dev/null and b/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/astra-client-credentials-1024x610.jpg differ diff --git a/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/astra-client-credentials-1024x610.png b/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/astra-client-credentials-1024x610.png deleted file mode 100644 index ca03a703c..000000000 Binary files a/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/astra-client-credentials-1024x610.png and /dev/null differ diff --git a/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/astra-secure-connect-1024x560.jpg b/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/astra-secure-connect-1024x560.jpg new file mode 100644 index 000000000..da7ba763a Binary files /dev/null and b/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/astra-secure-connect-1024x560.jpg differ diff --git a/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/astra-secure-connect-1024x560.png b/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/astra-secure-connect-1024x560.png deleted file mode 100644 index 3bb2f7fb4..000000000 Binary files a/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/astra-secure-connect-1024x560.png and /dev/null differ diff --git a/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/avengers-map-1024x519-1.jpg b/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/avengers-map-1024x519-1.jpg new file mode 100644 index 000000000..8d4aceaa8 Binary files /dev/null and b/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/avengers-map-1024x519-1.jpg differ diff --git a/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/avengers-map-1024x519-1.png b/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/avengers-map-1024x519-1.png deleted file mode 100644 index 9b216328a..000000000 Binary files a/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/avengers-map-1024x519-1.png and /dev/null differ diff --git a/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/index.md b/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/index.md index c429870ef..4a2e03bab 100644 --- a/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/index.md +++ b/content/posts/2022/09/13/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/index.md @@ -33,14 +33,14 @@ In order to follow along with this article, it is assumed that you have already **In order to connect to the Cassandra database hosted by DataStax Astra via CQL, we need to download the "Secure Connect Bundle".** This is a zip file containing SSL certificates and connection details for this exact database, allowing the connection to be made securely. This is available from the Astra dashboard, found under the "Connect" tab for our exact database, and then the "Java" option under "Connect using a driver": -![](astra-secure-connect-1024x560.png) +![](astra-secure-connect-1024x560.jpg) For pragmatic reasons, we're going to put this file into *src/main/resources* so that we can access it from the classpath. In a normal deployment situation, you would need to be able to provide different files to connect to different databases – for example, to have different databases for development and production environments. ### **2.2. Creating Client Credentials** **We also need to have some client credentials in order to connect to our database.** Unlike the APIs that we've used in previous articles, which use an access token, the CQL API requires a "username" and "password". These are actually a Client ID and Client Secret that we generate from the "Manage Tokens" section under "Organizations": -![](astra-client-credentials-1024x610.png) +![](astra-client-credentials-1024x610.jpg) Once this is done, we need to add the generated Client ID and Client Secret to our *application.properties*: @@ -385,7 +385,7 @@ Once we've written our controller, we need a template to actually render the HTM We are injecting the data retrieved from Cassandra, as well as some other details. Thymeleaf automatically handles converting the objects within the *script* block into valid JSON. Once this is done, our JavaScript then renders a map using the Google Maps API and adds some routes and markers onto it to show our selected data. **At this point, we have a fully working application. Into this we can select some avengers to display, date and time ranges of interest, and see what was happening with our data:** -![](avengers-map-1024x519-1.png) +![](avengers-map-1024x519-1.jpg) ## **6. Conclusion** diff --git a/content/posts/2022/09/21/a-better-way-to-use-gradle-with-github-actions/189988848-386c3d6b-d93d-4b4b-8c76-3f62a1-1eac8a69.jpg b/content/posts/2022/09/21/a-better-way-to-use-gradle-with-github-actions/189988848-386c3d6b-d93d-4b4b-8c76-3f62a1-1eac8a69.jpg new file mode 100644 index 000000000..143f4a7d7 Binary files /dev/null and b/content/posts/2022/09/21/a-better-way-to-use-gradle-with-github-actions/189988848-386c3d6b-d93d-4b4b-8c76-3f62a1-1eac8a69.jpg differ diff --git a/content/posts/2022/09/21/a-better-way-to-use-gradle-with-github-actions/189988870-04497d32-65d2-47e5-b197-94f4e3-5a66e14d.jpg b/content/posts/2022/09/21/a-better-way-to-use-gradle-with-github-actions/189988870-04497d32-65d2-47e5-b197-94f4e3-5a66e14d.jpg new file mode 100644 index 000000000..df049ceef Binary files /dev/null and b/content/posts/2022/09/21/a-better-way-to-use-gradle-with-github-actions/189988870-04497d32-65d2-47e5-b197-94f4e3-5a66e14d.jpg differ diff --git a/content/posts/2022/09/21/a-better-way-to-use-gradle-with-github-actions/index.md b/content/posts/2022/09/21/a-better-way-to-use-gradle-with-github-actions/index.md index ee468ddf9..d479922df 100644 --- a/content/posts/2022/09/21/a-better-way-to-use-gradle-with-github-actions/index.md +++ b/content/posts/2022/09/21/a-better-way-to-use-gradle-with-github-actions/index.md @@ -40,7 +40,7 @@ Each of these features is described in more detail below. It's easy to take advantage of the `gradle-build-action` by adding a setup step to your existing GitHub Actions workflow, similar to the way you would use the [actions/setup-java](https://github.com/actions/setup-java#setup-java) action to configure a JVM for your workflow. -![gh-actions1](https://user-images.githubusercontent.com/51727488/189988870-04497d32-65d2-47e5-b197-94f4e34c5b75.png) +![gh-actions1](189988870-04497d32-65d2-47e5-b197-94f4e3-5a66e14d.jpg) For details on how to use the `gradle-build-action` in your workflow, check out the [Gradle Build Tool documentation](https://docs.gradle.org/current/userguide/github-actions.html#sec:configure_github_actions) or the [README](https://github.com/gradle/gradle-build-action#use-the-action-to-setup-gradle). @@ -68,7 +68,7 @@ However, by using the `gradle-build-action` and by configuring each Gradle invoc The `gradle-build-action` instruments all Gradle build invocations, capturing details such as tasks executed, build outcome and the link to any Build Scan produced. And the linked Gradle Build Scan provides a complete view of a build execution, including all build logs, a complete task timeline, test outputs, dependencies resolved and performance characteristics of your build. -![gh-actions2](https://user-images.githubusercontent.com/51727488/189988848-386c3d6b-d93d-4b4b-8c76-3f62a13ba3bf.png) +![gh-actions2](189988848-386c3d6b-d93d-4b4b-8c76-3f62a1-1eac8a69.jpg) For more details, read about [how the Google AndroidX team leverages the gradle-build-action and Gradle Build Scans](https://gradle.com/blog/determine-the-root-cause-of-github-actions-failures-faster-with-gradle-enterprise/) to help them troubleshoot build and test failures faster in their GitHub Actions CI environment. diff --git a/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/index.md b/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/index.md index 221165325..7f2c1fa0c 100644 --- a/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/index.md +++ b/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/index.md @@ -5,7 +5,7 @@ lastmod: "2022-09-21T11:12:42+00:00" description: "At some point in your career, probably many points, you'll have to resolve merge conflicts. Learn how on Foojay.io!" authors: - "helenjoscott" -image: "merge-feature-into-main-1.png" +image: "merge-feature-into-main-1.jpg" categories: - "IntelliJ IDEA" - "Tutorials" @@ -29,7 +29,7 @@ You can do this by selecting the feature branch in the *Git* tool window which y Select the feature branch and then choose *Merge feature into main*. -![Merge feature branch into main IntelliJ IDEA popup](merge-feature-into-main.png) +![Merge feature branch into main IntelliJ IDEA popup](merge-feature-into-main.jpg) When you press **⏎** (macOS), or **Enter** (Windows/Linux), IntelliJ IDEA opens a popup telling us there are merge conflicts. @@ -65,7 +65,7 @@ Back on the *Conflicts* dialog, there are changes on both branches that we want Here you can see the changes to our current branch (`main`) on the left, and the changes that we want to merge from the `feature` branch on the right. There is a fully-functional editor in the middle. -![Merge Non Conflicting Changes](merge-non-conflicting-changes.png) +![Merge Non Conflicting Changes](merge-non-conflicting-changes.jpg) There are several changes: @@ -98,7 +98,7 @@ When you choose **Resolve using Left** or **Resolve using Right**, the changes f At this point, IntelliJ IDEA has concluded that all changes have been processed, so we can click **Apply** to save the changes and finish merging which will close this dialog. -![Apply changes and finish merging](save-changes-finish-merging.png) +![Apply changes and finish merging](save-changes-finish-merging.jpg) However, as we can see from the error highlighting this doesn't look quite right. The reason here is that both branches have added fields to this record, so we need to fix the brackets. diff --git a/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-feature-into-main-1.jpg b/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-feature-into-main-1.jpg new file mode 100644 index 000000000..60fd6fe24 Binary files /dev/null and b/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-feature-into-main-1.jpg differ diff --git a/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-feature-into-main-1.png b/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-feature-into-main-1.png deleted file mode 100644 index 3538a1bd6..000000000 Binary files a/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-feature-into-main-1.png and /dev/null differ diff --git a/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-feature-into-main.jpg b/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-feature-into-main.jpg new file mode 100644 index 000000000..635afa4ba Binary files /dev/null and b/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-feature-into-main.jpg differ diff --git a/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-feature-into-main.png b/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-feature-into-main.png deleted file mode 100644 index 4b0437532..000000000 Binary files a/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-feature-into-main.png and /dev/null differ diff --git a/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-non-conflicting-changes.jpg b/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-non-conflicting-changes.jpg new file mode 100644 index 000000000..e55a70a53 Binary files /dev/null and b/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-non-conflicting-changes.jpg differ diff --git a/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-non-conflicting-changes.png b/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-non-conflicting-changes.png deleted file mode 100644 index 6aaf1b4bd..000000000 Binary files a/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/merge-non-conflicting-changes.png and /dev/null differ diff --git a/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/save-changes-finish-merging.jpg b/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/save-changes-finish-merging.jpg new file mode 100644 index 000000000..bffcb0bba Binary files /dev/null and b/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/save-changes-finish-merging.jpg differ diff --git a/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/save-changes-finish-merging.png b/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/save-changes-finish-merging.png deleted file mode 100644 index 5a78a9059..000000000 Binary files a/content/posts/2022/09/21/resolving-git-merge-conflicts-in-intellij-idea/save-changes-finish-merging.png and /dev/null differ diff --git a/content/posts/2022/10/06/unified-event-driven-architecture-for-the-cloud-native-enterprise/a4a34537-image1-1024x814.jpg b/content/posts/2022/10/06/unified-event-driven-architecture-for-the-cloud-native-enterprise/a4a34537-image1-1024x814.jpg new file mode 100644 index 000000000..c69cb7e0f Binary files /dev/null and b/content/posts/2022/10/06/unified-event-driven-architecture-for-the-cloud-native-enterprise/a4a34537-image1-1024x814.jpg differ diff --git a/content/posts/2022/10/06/unified-event-driven-architecture-for-the-cloud-native-enterprise/a4a34537-image1-1024x814.png b/content/posts/2022/10/06/unified-event-driven-architecture-for-the-cloud-native-enterprise/a4a34537-image1-1024x814.png deleted file mode 100644 index e85e60ff1..000000000 Binary files a/content/posts/2022/10/06/unified-event-driven-architecture-for-the-cloud-native-enterprise/a4a34537-image1-1024x814.png and /dev/null differ diff --git a/content/posts/2022/10/06/unified-event-driven-architecture-for-the-cloud-native-enterprise/index.md b/content/posts/2022/10/06/unified-event-driven-architecture-for-the-cloud-native-enterprise/index.md index b524259ae..df04df71f 100644 --- a/content/posts/2022/10/06/unified-event-driven-architecture-for-the-cloud-native-enterprise/index.md +++ b/content/posts/2022/10/06/unified-event-driven-architecture-for-the-cloud-native-enterprise/index.md @@ -34,7 +34,7 @@ Even for enterprises that have done a good job of building out their EDAs, the o One of the most common challenges enterprise architects are struggling with in the EDA space is the proliferation of messaging and streaming technologies. Aging technologies such as JMS and various MQ implementations are deeply entrenched throughout the application landscape. When developers modernize on-prem apps and move them into the cloud, they often swap out legacy messaging systems for cloud native ones like GCP Pub/Sub or AWS Kinesis. Developers and architects focused on greenfield development of new digital experiences often find that platforms like JMS and MQ can no longer keep up with the scale and performance requirements needed to create an engaging customer experience. This, coupled with the desire to retain streams of events for use by data scientists, often leads to the adoption of other specialized platforms such as Kafka. While each of these individual decisions makes sense in a vacuum, when combined they result in a fragmented architecture with limited interoperability and unreasonably high costs that impose both Capex and Opex (capital expenditures and operational expenditures) drawbacks. The result of all this is an architecture that starts to resemble an abomination of bolted-on technology that hinders, rather than aids, the core tenets of EDA. -![](a4a34537-image1-1024x814.png) +![](a4a34537-image1-1024x814.jpg) ## Creating a Unified EDA diff --git a/content/posts/2022/10/11/presenting-with-intellij-idea/enable-mouse-zoom-698x510.jpg b/content/posts/2022/10/11/presenting-with-intellij-idea/enable-mouse-zoom-698x510.jpg new file mode 100644 index 000000000..629dd44f3 Binary files /dev/null and b/content/posts/2022/10/11/presenting-with-intellij-idea/enable-mouse-zoom-698x510.jpg differ diff --git a/content/posts/2022/10/11/presenting-with-intellij-idea/enable-mouse-zoom-698x510.png b/content/posts/2022/10/11/presenting-with-intellij-idea/enable-mouse-zoom-698x510.png deleted file mode 100644 index 31ad1c266..000000000 Binary files a/content/posts/2022/10/11/presenting-with-intellij-idea/enable-mouse-zoom-698x510.png and /dev/null differ diff --git a/content/posts/2022/10/11/presenting-with-intellij-idea/index.md b/content/posts/2022/10/11/presenting-with-intellij-idea/index.md index 47bdff428..cd08bf2bb 100644 --- a/content/posts/2022/10/11/presenting-with-intellij-idea/index.md +++ b/content/posts/2022/10/11/presenting-with-intellij-idea/index.md @@ -64,7 +64,7 @@ We can use **Quick Switch Scheme** again to **Exit Presentation Mode**. To enable mouse zoom, you need to turn it on explicitly. Go to **Preferences \> Editor \> General** and select **Change font size with Command+Mouse Wheel** (on Mac) or **Change font size with Control+Mouse** (on Windows/Linux). Click **OK** to apply the changes and close the dialog or click **Apply** to keep the dialog open. -{{< img src="enable-mouse-zoom-698x510.png" class="size-medium" alt="Enable Mouse Zoom in IntelliJ IDEA Preferences" width="698" height="510" >}} +{{< img src="enable-mouse-zoom-698x510.jpg" class="size-medium" alt="Enable Mouse Zoom in IntelliJ IDEA Preferences" width="698" height="510" >}} Now we can use **Command+Mouse Wheel** (on Mac) or **Control+Mouse Wheel** (on Windows/Linux) to zoom in or out. While we are using mouse zoom, a popup appears containing the current font size on the left and a link to reset to the original font size on the right. Click the link to reset the font size. @@ -89,7 +89,7 @@ Select the UI theme from the Theme list: * **Darcula** is the default dark theme that we're using here * **High contrast** is a theme designed for users with color vision deficiency -{{< img src="theme-700x507.png" class="size-medium" alt="Selecting a Theme in IntelliJ IDEA Preferences" width="700" height="507" >}} +{{< img src="theme-700x507.jpg" class="size-medium" alt="Selecting a Theme in IntelliJ IDEA Preferences" width="700" height="507" >}} Which theme to use depends on your personal preference. When presenting in front of an audience, you may want to take into account how light or dark the room is. If possible, try different themes and walk to the back of the room to see which one works best before your presentation. When sharing your screen during an online meeting, you may also want to check with teammates which theme works best. diff --git a/content/posts/2022/10/11/presenting-with-intellij-idea/theme-700x507.jpg b/content/posts/2022/10/11/presenting-with-intellij-idea/theme-700x507.jpg new file mode 100644 index 000000000..6e5ab9e61 Binary files /dev/null and b/content/posts/2022/10/11/presenting-with-intellij-idea/theme-700x507.jpg differ diff --git a/content/posts/2022/10/11/presenting-with-intellij-idea/theme-700x507.png b/content/posts/2022/10/11/presenting-with-intellij-idea/theme-700x507.png deleted file mode 100644 index ecc4a6a52..000000000 Binary files a/content/posts/2022/10/11/presenting-with-intellij-idea/theme-700x507.png and /dev/null differ diff --git a/content/posts/2022/10/17/java-on-azure-tooling-update-september-2022/index.md b/content/posts/2022/10/17/java-on-azure-tooling-update-september-2022/index.md index 17c1c2329..615ba1d2c 100644 --- a/content/posts/2022/10/17/java-on-azure-tooling-update-september-2022/index.md +++ b/content/posts/2022/10/17/java-on-azure-tooling-update-september-2022/index.md @@ -5,7 +5,7 @@ lastmod: "2022-10-18T08:58:48+00:00" description: "In this update, we will introduce the Azure Cosmos DB Support, the Azure Virtual Machine Enhancement, and Azure SDK Reference Book updates." authors: - "jialuo-gan" -image: "theme.png" +image: "theme.jpg" categories: - "Azure" - "Developer Tools" diff --git a/content/posts/2022/10/17/java-on-azure-tooling-update-september-2022/theme.jpg b/content/posts/2022/10/17/java-on-azure-tooling-update-september-2022/theme.jpg new file mode 100644 index 000000000..cd5538e9f Binary files /dev/null and b/content/posts/2022/10/17/java-on-azure-tooling-update-september-2022/theme.jpg differ diff --git a/content/posts/2022/10/17/java-on-azure-tooling-update-september-2022/theme.png b/content/posts/2022/10/17/java-on-azure-tooling-update-september-2022/theme.png deleted file mode 100644 index db146332e..000000000 Binary files a/content/posts/2022/10/17/java-on-azure-tooling-update-september-2022/theme.png and /dev/null differ diff --git a/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEg4yZyksyu3xqAbAj44fheHcemCgQZNjGKq-8e140e85.png b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEg4yZyksyu3xqAbAj44fheHcemCgQZNjGKq-8e140e85.png new file mode 100644 index 000000000..d02ea66b3 Binary files /dev/null and b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEg4yZyksyu3xqAbAj44fheHcemCgQZNjGKq-8e140e85.png differ diff --git a/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEgHTALnmpA7DEvZj6QxKQmwqKdjPPKLhKlZ-1e4230f5.png b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEgHTALnmpA7DEvZj6QxKQmwqKdjPPKLhKlZ-1e4230f5.png new file mode 100644 index 000000000..c88d54167 Binary files /dev/null and b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEgHTALnmpA7DEvZj6QxKQmwqKdjPPKLhKlZ-1e4230f5.png differ diff --git a/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEh3qfActZG-2gu9LjZ3e73WemtzCttIziJ3-1c4eeeb5.png b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEh3qfActZG-2gu9LjZ3e73WemtzCttIziJ3-1c4eeeb5.png new file mode 100644 index 000000000..dce25825d Binary files /dev/null and b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEh3qfActZG-2gu9LjZ3e73WemtzCttIziJ3-1c4eeeb5.png differ diff --git a/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEhj9fdgrxzUzjulgrIX5hosG0H-nC0SgPcI-07ebcb35.png b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEhj9fdgrxzUzjulgrIX5hosG0H-nC0SgPcI-07ebcb35.png new file mode 100644 index 000000000..ca1b2bd6f Binary files /dev/null and b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEhj9fdgrxzUzjulgrIX5hosG0H-nC0SgPcI-07ebcb35.png differ diff --git a/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEiS0214rgPJ0H8qP9HK8Eciiy9RNiE3qtqL-76d1822b.png b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEiS0214rgPJ0H8qP9HK8Eciiy9RNiE3qtqL-76d1822b.png new file mode 100644 index 000000000..7056f4f9d Binary files /dev/null and b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEiS0214rgPJ0H8qP9HK8Eciiy9RNiE3qtqL-76d1822b.png differ diff --git a/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEjELC9xnk-jTPNkpKG4JHvEX64fM33ZNJPY-2794152d.png b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEjELC9xnk-jTPNkpKG4JHvEX64fM33ZNJPY-2794152d.png new file mode 100644 index 000000000..eb94078ef Binary files /dev/null and b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEjELC9xnk-jTPNkpKG4JHvEX64fM33ZNJPY-2794152d.png differ diff --git a/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEjEMWmzL03e0bjpDwxNE6sdx_-UnSfXugAZ-44e2d20d.png b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEjEMWmzL03e0bjpDwxNE6sdx_-UnSfXugAZ-44e2d20d.png new file mode 100644 index 000000000..ced244f62 Binary files /dev/null and b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEjEMWmzL03e0bjpDwxNE6sdx_-UnSfXugAZ-44e2d20d.png differ diff --git a/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEjL9aie5-WPDlJOWLxVGPRzWlekHbKfkrEs-b227eee2.jpg b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEjL9aie5-WPDlJOWLxVGPRzWlekHbKfkrEs-b227eee2.jpg new file mode 100644 index 000000000..6ceb78c82 Binary files /dev/null and b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEjL9aie5-WPDlJOWLxVGPRzWlekHbKfkrEs-b227eee2.jpg differ diff --git a/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEjMGD_-_KVzJC1S-8yY9xlkHawwdDSmQOEG-93d9f173.png b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEjMGD_-_KVzJC1S-8yY9xlkHawwdDSmQOEG-93d9f173.png new file mode 100644 index 000000000..6f2e22572 Binary files /dev/null and b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/AVvXsEjMGD_-_KVzJC1S-8yY9xlkHawwdDSmQOEG-93d9f173.png differ diff --git a/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/index.md b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/index.md index f914270a4..af227c411 100644 --- a/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/index.md +++ b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/index.md @@ -43,7 +43,7 @@ netstat -ao ``` You will get a screen such as the below. Locate the port on which you had started the Tomcat Server. -![](https://blogger.googleusercontent.com/img/a/AVvXsEgHTALnmpA7DEvZj6QxKQmwqKdjPPKLhKlZsw8ZnXz5r9ZiZqF6AIRO2IPSBmH5nhEmheRyCoJiiMOQJ0u9zehkl4XPav7aezTSiU8bQAoH8xu3lMzQQNQIIWvM6c-k7_owyzWB1D-KdnHA6467-79vdiNRC34ZKGf1zIlWj-7Pe9u7HiUOZoHt4ETlLw) +![](AVvXsEgHTALnmpA7DEvZj6QxKQmwqKdjPPKLhKlZ-1e4230f5.png) Go ahead and locate the PID and kill the task (Windows/MS-DOS) @@ -51,7 +51,7 @@ Go ahead and locate the PID and kill the task (Windows/MS-DOS) taskkill /F /PID 14836 ``` -![](https://blogger.googleusercontent.com/img/a/AVvXsEiS0214rgPJ0H8qP9HK8Eciiy9RNiE3qtqL9wOIXAO4hDX9x98oXi-BwPqyA7E0H0d2HUJOEZbnpfFTv_ed6_kUl39TjmCgHnI_UK1ktyx_FSOIKoEtYoKQMRzLZFYJJicBhKg9MhyRIOxVWg2WPoxbqXsd9F1iktbdc2xwUVY-eK2LH1LTYaDvegG5ow) +![](AVvXsEiS0214rgPJ0H8qP9HK8Eciiy9RNiE3qtqL-76d1822b.png) Note that if you were running the application from the command-line, You can just press \[Ctrl+C\] to terminate the application. In most cases, it will also kill the process. But if it does not kill the process, you should proceed with the above mentioned steps. **\[1a\]** ++Automate the writing of Process Id to a File++ @@ -67,7 +67,7 @@ Note that if you were running the application from the command-line, You can jus **2. Terminate the Application, Kill the Process (TCPView)** There is one another way to immediately kill the process via the TCPView tool that is made available by Microsoft. It is available at this [link](https://learn.microsoft.com/en-us/sysinternals/downloads/tcpview) to download. -![](https://blogger.googleusercontent.com/img/a/AVvXsEjL9aie5-WPDlJOWLxVGPRzWlekHbKfkrEscRetmCcaL3OUOLq-txmjYPHeuBsl3s1DO1o8Pr_th2NcpT4HNH0GQsb0Py2luN3WZAXwqxN6jcuLB0m6AMWC4JgxXPHvpLu1kooRWx7Mk15q_SHjXV8LGstOtEZJXvTxln1IAwqpuWUV_qruJpzI7HAgGA=w640-h306) +![](AVvXsEjL9aie5-WPDlJOWLxVGPRzWlekHbKfkrEs-b227eee2.jpg) The next simple method is proposed by me. Beginby clicking on the \[Terminate - Red Square in Eclipse on the Console Tab\] button. You will observer that the application immediately shuts down. But infact at the background, the tomcat server will still be running on the port that it was started! @@ -79,14 +79,14 @@ This is a very convenient way especially if you are a Software Architect or an E The most 'cleanest' way among the ones I described until now is the usage of Actuator to shutdown the spring boot applications. You will begin this by making sure to the include the following in your **pom.xml** -![](https://blogger.googleusercontent.com/img/a/AVvXsEjMGD_-_KVzJC1S-8yY9xlkHawwdDSmQOEGGyJqG5M4w4GCqe1Hb1loq3cJK5ha6_lWkAGbdx79hzEXe7anYhn8ZOQKGw34ag9UCEjs3lNevzhEun_OjV8ZXijPAEfe42HLjGdJbqXVuVM8s8xWGglp3xwshOIPWbhDRQ_Q-PidNZUQRNkMoO4dtwHWBA=w400-h55) +![](AVvXsEjMGD_-_KVzJC1S-8yY9xlkHawwdDSmQOEG-93d9f173.png) Next make sure that you have enabled the shutdown endpoint via actuator using the properties as shown below. -![](https://blogger.googleusercontent.com/img/a/AVvXsEg4yZyksyu3xqAbAj44fheHcemCgQZNjGKqEjyrUtOyupBEGwmK5iWkORjloBSMlRnvrzkR_F-67CzLy2G3WS1j3GrVM_iwNqfGDaLZuvAsFdATgQOKxDChPkcwY-M8atwhl6tBo8jLDJFNucVGR5IlLq5MP8LmGfdW29cpM-4LQUpnbXlY8roNWYV9Ag=w640-h144) +![](AVvXsEg4yZyksyu3xqAbAj44fheHcemCgQZNjGKq-8e140e85.png) Once you have to shutdown the application, the actuator endpoint /shutdown will also kill the associated process. This is a very clean way to shutdown the Spring Boot applications. You have to make sure that you invoke the actuator endpoint /shutdown via a \[POST\] request only. -![](https://blogger.googleusercontent.com/img/a/AVvXsEjELC9xnk-jTPNkpKG4JHvEX64fM33ZNJPYh2K9uk0aF1nDfCpM1B_6TdYDehsaSdtuODU7eqBczYFciTj4IMj76oxYrnK2RGbNxDJ20a8BUxE9-XKxjYro056BO1jPeAXysyF75ydWPxLhcI-t3RJCps1j218jEq_avpiuI7bPElYFBPAT3Rl4xqdwRg=w640-h130) +![](AVvXsEjELC9xnk-jTPNkpKG4JHvEX64fM33ZNJPY-2794152d.png) If Spring Boot is the root context of your spring boot application, then the invocation will look like the following. The above diagram shows the response from the request sent via Postman. @@ -143,11 +143,11 @@ You may then use the following controller method to close the context asynchrono Once the above has been done, built and deployed. You may then close the spring boot using the following browser request. -![](https://blogger.googleusercontent.com/img/a/AVvXsEh3qfActZG-2gu9LjZ3e73WemtzCttIziJ3f181kiRhpCEGrtCGqjofhAjRJ8g4kN66KT_R5Ds2YurtYvb4sIHfpht0oT0vvpNnwlRVoHAKTJIlTjuOCM3E25AP9D6U_DevgY88dkj6GHxSzVnmhGsb2MmOj0fiJNMbKqEyVjMNfkBz69D_t-3W4K5cCg=w640-h122) +![](AVvXsEh3qfActZG-2gu9LjZ3e73WemtzCttIziJ3-1c4eeeb5.png) You will notice that the application has been shutdown when you see the console and also the process has been removed from the operating system processes. -![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwooWQgGZkL8VyoA6LJ6Lzc51_Nq9KHvfveWJifqWK4Qm_24FzXOlfWVW0aqLHV8i7BB03IvsKmidWAnf83DUeyWP1wg1o5pG1o9eY7r7vUfLN8X4fRxzeSnD428cEak97SWoaUF0zxwOmSrFBfspKGx9GXVyhmK09NTG6H-RxtmkT548DPJV4ZiG3Qg/w640-h70/skp_ts_blog_001.png) +![](skp_ts_blog_001-257c8527.png) **5. Exit using SpringApplication.exit()** @@ -180,11 +180,11 @@ The other way is use the exit() method of the SpringApplication class, it will a The controller will look similar to what we had written previously. Once your application is running and you want to shutdown the application 'cleanly', then you may use the following: -![](https://blogger.googleusercontent.com/img/a/AVvXsEhj9fdgrxzUzjulgrIX5hosG0H-nC0SgPcICf29E5Ld4p-R7omRSHNol4bAVVpClQ_B2dNYyLuD1rrCvSgQqWRKJGF5SbzM3_8VMNcKnDb3rJuH5_tg1w4DwGBPVHyIq0DfVlGGH4iy-RWhB1hKuxw6jxHF8MCd7yHzAcq3yCPkgTkwULetJ_nNQzWM9g=w640-h96) +![](AVvXsEhj9fdgrxzUzjulgrIX5hosG0H-nC0SgPcI-07ebcb35.png) You will notice that the application has been shutdown when you see the console and also the process has been removed from the operating system processes. -![](https://blogger.googleusercontent.com/img/a/AVvXsEjEMWmzL03e0bjpDwxNE6sdx_-UnSfXugAZ1VNCNYucL1d35gmNJTZfCSQm1OUu8IOEAnkuvx4CHuuO4V7i6GzelBuq6AGzRqApL1OjwRlL5cj5HwYWig-OtAcXG2kceyPtMO9P5nd5sZTlkWZKtbTXl68n7bvBkdujThsxRsnSTTvBaDTNNwe81j5yXw=w640-h62) +![](AVvXsEjEMWmzL03e0bjpDwxNE6sdx_-UnSfXugAZ-44e2d20d.png) **\[Reference\]** diff --git a/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/skp_ts_blog_001-257c8527.png b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/skp_ts_blog_001-257c8527.png new file mode 100644 index 000000000..60c126fff Binary files /dev/null and b/content/posts/2022/11/04/clean-shutdown-of-spring-boot-applications/skp_ts_blog_001-257c8527.png differ diff --git a/content/posts/2022/11/09/reducing-tail-latencies-with-chronicle-queue-enterprise/Screen-Shot-2022-10-31-at-11.20.54-AM.jpg b/content/posts/2022/11/09/reducing-tail-latencies-with-chronicle-queue-enterprise/Screen-Shot-2022-10-31-at-11.20.54-AM.jpg new file mode 100644 index 000000000..d78c09786 Binary files /dev/null and b/content/posts/2022/11/09/reducing-tail-latencies-with-chronicle-queue-enterprise/Screen-Shot-2022-10-31-at-11.20.54-AM.jpg differ diff --git a/content/posts/2022/11/09/reducing-tail-latencies-with-chronicle-queue-enterprise/Screen-Shot-2022-10-31-at-11.20.54-AM.png b/content/posts/2022/11/09/reducing-tail-latencies-with-chronicle-queue-enterprise/Screen-Shot-2022-10-31-at-11.20.54-AM.png deleted file mode 100644 index 2e2a91a68..000000000 Binary files a/content/posts/2022/11/09/reducing-tail-latencies-with-chronicle-queue-enterprise/Screen-Shot-2022-10-31-at-11.20.54-AM.png and /dev/null differ diff --git a/content/posts/2022/11/09/reducing-tail-latencies-with-chronicle-queue-enterprise/index.md b/content/posts/2022/11/09/reducing-tail-latencies-with-chronicle-queue-enterprise/index.md index 5a519ef6f..b74eee29e 100644 --- a/content/posts/2022/11/09/reducing-tail-latencies-with-chronicle-queue-enterprise/index.md +++ b/content/posts/2022/11/09/reducing-tail-latencies-with-chronicle-queue-enterprise/index.md @@ -5,7 +5,7 @@ lastmod: "2022-11-09T15:08:08+00:00" description: "Fed up with pauses at the high percentiles in your application? You may want to consider Chronicle Queue Enterprise!" authors: - "jerry-shea" -image: "Screen-Shot-2022-10-31-at-11.20.54-AM.png" +image: "Screen-Shot-2022-10-31-at-11.20.54-AM.jpg" categories: - "Developer Tools" - "DevOps" diff --git a/content/posts/2022/11/11/api-mocking-essential-and-redundant/DALL-E-2022-10-25-19.40.58-Mocking-bird-standing-on-a-computer.jpg b/content/posts/2022/11/11/api-mocking-essential-and-redundant/DALL-E-2022-10-25-19.40.58-Mocking-bird-standing-on-a-computer.jpg new file mode 100644 index 000000000..33db05f5b Binary files /dev/null and b/content/posts/2022/11/11/api-mocking-essential-and-redundant/DALL-E-2022-10-25-19.40.58-Mocking-bird-standing-on-a-computer.jpg differ diff --git a/content/posts/2022/11/11/api-mocking-essential-and-redundant/DALL-E-2022-10-25-19.40.58-Mocking-bird-standing-on-a-computer.png b/content/posts/2022/11/11/api-mocking-essential-and-redundant/DALL-E-2022-10-25-19.40.58-Mocking-bird-standing-on-a-computer.png deleted file mode 100644 index 7a3d988a5..000000000 Binary files a/content/posts/2022/11/11/api-mocking-essential-and-redundant/DALL-E-2022-10-25-19.40.58-Mocking-bird-standing-on-a-computer.png and /dev/null differ diff --git a/content/posts/2022/11/11/api-mocking-essential-and-redundant/index.md b/content/posts/2022/11/11/api-mocking-essential-and-redundant/index.md index 36d493a72..64460215a 100644 --- a/content/posts/2022/11/11/api-mocking-essential-and-redundant/index.md +++ b/content/posts/2022/11/11/api-mocking-essential-and-redundant/index.md @@ -6,7 +6,7 @@ description: "Is API mocking in unit tests important or does it do nothing? The canonical: "https://debugagent.com/api-mocking-essential-and-redundant" authors: - "shai-almog" -image: "DALL-E-2022-10-25-19.40.58-Mocking-bird-standing-on-a-computer.png" +image: "DALL-E-2022-10-25-19.40.58-Mocking-bird-standing-on-a-computer.jpg" categories: - "Testing" related_posts: diff --git a/content/posts/2022/11/14/java-profiling-overview/Screenshot-2022-10-24-at-11.46.10.jpg b/content/posts/2022/11/14/java-profiling-overview/Screenshot-2022-10-24-at-11.46.10.jpg new file mode 100644 index 000000000..99d000177 Binary files /dev/null and b/content/posts/2022/11/14/java-profiling-overview/Screenshot-2022-10-24-at-11.46.10.jpg differ diff --git a/content/posts/2022/11/14/java-profiling-overview/Screenshot-2022-10-24-at-11.46.10.png b/content/posts/2022/11/14/java-profiling-overview/Screenshot-2022-10-24-at-11.46.10.png deleted file mode 100644 index 14ea68002..000000000 Binary files a/content/posts/2022/11/14/java-profiling-overview/Screenshot-2022-10-24-at-11.46.10.png and /dev/null differ diff --git a/content/posts/2022/11/14/java-profiling-overview/index.md b/content/posts/2022/11/14/java-profiling-overview/index.md index ae0b977bb..c54886f7f 100644 --- a/content/posts/2022/11/14/java-profiling-overview/index.md +++ b/content/posts/2022/11/14/java-profiling-overview/index.md @@ -5,7 +5,7 @@ lastmod: "2022-12-06T15:32:49+00:00" description: "When I ask Java devs whether they profile, the answer is usually \"no\". A reason is the lack of info and knowledge for everyday developers." authors: - "johannes-bechberger" -image: "Screenshot-2022-10-24-at-11.46.10.png" +image: "Screenshot-2022-10-24-at-11.46.10.jpg" categories: - "Developer Tools" - "JDK Flight Recorder" diff --git a/content/posts/2022/11/22/friends-of-openjdk-at-fosdem-2023/image-1024x1013.jpg b/content/posts/2022/11/22/friends-of-openjdk-at-fosdem-2023/image-1024x1013.jpg new file mode 100644 index 000000000..1adf66c5f Binary files /dev/null and b/content/posts/2022/11/22/friends-of-openjdk-at-fosdem-2023/image-1024x1013.jpg differ diff --git a/content/posts/2022/11/22/friends-of-openjdk-at-fosdem-2023/image-1024x1013.png b/content/posts/2022/11/22/friends-of-openjdk-at-fosdem-2023/image-1024x1013.png deleted file mode 100644 index 5853159f8..000000000 Binary files a/content/posts/2022/11/22/friends-of-openjdk-at-fosdem-2023/image-1024x1013.png and /dev/null differ diff --git a/content/posts/2022/11/22/friends-of-openjdk-at-fosdem-2023/index.md b/content/posts/2022/11/22/friends-of-openjdk-at-fosdem-2023/index.md index a2b195504..b63a02ba2 100644 --- a/content/posts/2022/11/22/friends-of-openjdk-at-fosdem-2023/index.md +++ b/content/posts/2022/11/22/friends-of-openjdk-at-fosdem-2023/index.md @@ -57,7 +57,7 @@ Please submit through Pentabarf here: When submitting your talk in Pentabarf, make sure to select "Friends Of OpenJDK devroom" as the Track, as shown below. -{{< img src="image-1024x1013.png" class="size-large is-resized" width="554" height="547" >}} +{{< img src="image-1024x1013.jpg" class="size-large is-resized" width="554" height="547" >}} Create a Pentabarf account if, and only if, you don't already have one from a previous year. Please double check if you have an account you can reuse! diff --git a/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-11.11.19-AM.jpg b/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-11.11.19-AM.jpg new file mode 100644 index 000000000..218ec9da0 Binary files /dev/null and b/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-11.11.19-AM.jpg differ diff --git a/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-11.11.19-AM.png b/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-11.11.19-AM.png deleted file mode 100644 index 5df952f9b..000000000 Binary files a/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-11.11.19-AM.png and /dev/null differ diff --git a/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-11.29.14-AM-1024x563.jpg b/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-11.29.14-AM-1024x563.jpg new file mode 100644 index 000000000..a405ee307 Binary files /dev/null and b/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-11.29.14-AM-1024x563.jpg differ diff --git a/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-11.29.14-AM-1024x563.png b/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-11.29.14-AM-1024x563.png deleted file mode 100644 index 7b8e5d700..000000000 Binary files a/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-11.29.14-AM-1024x563.png and /dev/null differ diff --git a/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-9.26.21-AM-889x1024.jpg b/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-9.26.21-AM-889x1024.jpg new file mode 100644 index 000000000..c8f504b05 Binary files /dev/null and b/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-9.26.21-AM-889x1024.jpg differ diff --git a/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-9.26.21-AM-889x1024.png b/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-9.26.21-AM-889x1024.png deleted file mode 100644 index 09dda317b..000000000 Binary files a/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/Screen-Shot-2022-11-22-at-9.26.21-AM-889x1024.png and /dev/null differ diff --git a/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/index.md b/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/index.md index 5baa63149..65fabc783 100644 --- a/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/index.md +++ b/content/posts/2022/11/30/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/index.md @@ -52,7 +52,7 @@ Using Kafka for the same test, but at a lower throughput of 100k msg/s the 99%il To use the same analogy as above, this is the time it takes for a signal to travel 526 km. If you walk this distance from London, you will for example end up in Dumfries in Scotland and you will need to walk for over 100 hours. -![](Screen-Shot-2022-11-22-at-9.26.21-AM-889x1024.png) +![](Screen-Shot-2022-11-22-at-9.26.21-AM-889x1024.jpg) ### Log Aggregation @@ -101,7 +101,7 @@ As can be seen, the typical latency to publish is comparable. However, the outli In each case, the events published were 512-byte JSON messages. Two fields were added to trace when the message was sent. -![](Screen-Shot-2022-11-22-at-11.11.19-AM.png) +![](Screen-Shot-2022-11-22-at-11.11.19-AM.jpg) ### Microservice Messaging Transport @@ -200,7 +200,7 @@ The Kafka benchmark of 250k/s messages for 10 minutes (300 million messages tota This can be run with a 128 MB heap size but results in over 139k GCs which is sub-optimal. -![](Screen-Shot-2022-11-22-at-11.29.14-AM-1024x563.png) +![](Screen-Shot-2022-11-22-at-11.29.14-AM-1024x563.jpg) ### Conclusion diff --git a/content/posts/2022/12/06/introducing-gradle-test-suites/adding-other-tests-fdc45b5b.png b/content/posts/2022/12/06/introducing-gradle-test-suites/adding-other-tests-fdc45b5b.png new file mode 100644 index 000000000..74872cbb6 Binary files /dev/null and b/content/posts/2022/12/06/introducing-gradle-test-suites/adding-other-tests-fdc45b5b.png differ diff --git a/content/posts/2022/12/06/introducing-gradle-test-suites/customizing-test-suites-0f84bae1.png b/content/posts/2022/12/06/introducing-gradle-test-suites/customizing-test-suites-0f84bae1.png new file mode 100644 index 000000000..11684b5c7 Binary files /dev/null and b/content/posts/2022/12/06/introducing-gradle-test-suites/customizing-test-suites-0f84bae1.png differ diff --git a/content/posts/2022/12/06/introducing-gradle-test-suites/default-test-layout-97a5ef80.png b/content/posts/2022/12/06/introducing-gradle-test-suites/default-test-layout-97a5ef80.png new file mode 100644 index 000000000..ec22c6790 Binary files /dev/null and b/content/posts/2022/12/06/introducing-gradle-test-suites/default-test-layout-97a5ef80.png differ diff --git a/content/posts/2022/12/06/introducing-gradle-test-suites/index.md b/content/posts/2022/12/06/introducing-gradle-test-suites/index.md index 4fc97289f..241a6d32e 100644 --- a/content/posts/2022/12/06/introducing-gradle-test-suites/index.md +++ b/content/posts/2022/12/06/introducing-gradle-test-suites/index.md @@ -6,7 +6,7 @@ description: "Did you know? In Gradle 7.3, released November 2021, the Gradle te canonical: "https://blog.gradle.org/introducing-test-suites" authors: - "tom-tresansky" -image: "https://blog.gradle.org/images/introducing-test-suites/default-test-layout.png" +image: "default-test-layout-97a5ef80.png" categories: - "Gradle" - "Java Core" @@ -35,7 +35,7 @@ Normally - whether or not you're practicing strict Test Driven Development - as By convention, for a Java project, these tests live in `src/test/java`: -[![layout](https://blog.gradle.org/images/introducing-test-suites/default-test-layout.png "layout")](http:/https://blog.gradle.org/images/introducing-test-suites/default-test-layout.png/ "layout") +[![layout](default-test-layout-97a5ef80.png "layout")](http:/default-test-layout-97a5ef80.png/ "layout") These unit tests ensure your classes behave correctly in isolation from the very beginning of your project's lifecycle. @@ -53,7 +53,7 @@ Varied test goals often involve different and incompatible patterns. At a minimum you'll want to organize your test code by separating tests into different directories for each goal: -[![other tests](https://blog.gradle.org/images/introducing-test-suites/adding-other-tests.png "other tests")](https://blog.gradle.org/images/introducing-test-suites/adding-other-tests.png "other tests") +[![other tests](adding-other-tests-fdc45b5b.png "other tests")](adding-other-tests-fdc45b5b.png "other tests") But separating the source files is only the beginning. @@ -85,7 +85,7 @@ Before diving in, take a moment to think about how you would create a separate s Before Gradle 7.2, the proper way to set up integration tests went like this (note that while this example is written in the Gradle Kotlin DSL, the Groovy setup is very similar): -[![proper set up](https://blog.gradle.org/images/introducing-test-suites/proper-integration-test-setup.png "proper set up")](http://https://blog.gradle.org/images/introducing-test-suites/proper-integration-test-setup.png "proper set up") +[![proper set up](proper-integration-test-setup-74a0ef9a.jpg "proper set up")](http://proper-integration-test-setup-74a0ef9a.jpg "proper set up") 1. We need to create a `SourceSet` that will in turn create the associated `Configuration`s we'll need later. This is low-level plumbing that we shouldn't have to focus on. 2. We wire the new test configurations to the test existing configurations, to re-use their dependency declarations. We might not always want to do this. @@ -121,7 +121,7 @@ Congratulations! Here is the previous example, rewritten to take advantage of Test Suites: -[![integration tests](https://blog.gradle.org/images/introducing-test-suites/integration-tests-with-suites.png "integration tests")](https://blog.gradle.org/images/introducing-test-suites/integration-tests-with-suites.png "integration tests") +[![integration tests](integration-tests-with-suites-d6bf2ea4.png "integration tests")](integration-tests-with-suites-d6bf2ea4.png "integration tests") 1. All Test Suite configuration is co-located within a new `testing` block, of type [TestingExtension](https://docs.gradle.org/7.5.1/dsl/org.gradle.testing.base.TestingExtension.html#org.gradle.testing.base.TestingExtension). 2. Maintaining backwards compatibility with existing builds that already use the `test` task was an important requirement for us when implementing Test Suites. We've associated the existing `test` task with a default Test Suite that you can use to contain your unit tests. @@ -168,7 +168,7 @@ For a new project, the easiest way to get started is to use the [Gradle Init tas The rationale behind Test Suites, just like Gradle in general, is to abstract the details of configuration and use sensible conventions as defaults - but to also allow you to change those defaults as necessary. -[![custom set up](https://blog.gradle.org/images/introducing-test-suites/customizing-test-suites.png "custom set up")](https://blog.gradle.org/images/introducing-test-suites/customizing-test-suites.png "custom set up") +[![custom set up](customizing-test-suites-0f84bae1.png "custom set up")](customizing-test-suites-0f84bae1.png "custom set up") 1. Configure the built-in Test Suite to use a different testing framework using one of [several convenience methods available](https://docs.gradle.org/7.5.1/javadoc/org/gradle/api/plugins/jvm/JvmTestSuite.html#useJUnitJupiter--).\[\^4\] 2. Add a non-project dependency for use in compiling and running a Test Suite. diff --git a/content/posts/2022/12/06/introducing-gradle-test-suites/integration-tests-with-suites-d6bf2ea4.png b/content/posts/2022/12/06/introducing-gradle-test-suites/integration-tests-with-suites-d6bf2ea4.png new file mode 100644 index 000000000..fb5906ffc Binary files /dev/null and b/content/posts/2022/12/06/introducing-gradle-test-suites/integration-tests-with-suites-d6bf2ea4.png differ diff --git a/content/posts/2022/12/06/introducing-gradle-test-suites/proper-integration-test-setup-74a0ef9a.jpg b/content/posts/2022/12/06/introducing-gradle-test-suites/proper-integration-test-setup-74a0ef9a.jpg new file mode 100644 index 000000000..8a94e68b9 Binary files /dev/null and b/content/posts/2022/12/06/introducing-gradle-test-suites/proper-integration-test-setup-74a0ef9a.jpg differ diff --git a/content/posts/2022/12/09/springone-tlv-world-tour-trip-report/cover-image.jpg b/content/posts/2022/12/09/springone-tlv-world-tour-trip-report/cover-image.jpg new file mode 100644 index 000000000..12af2f5e5 Binary files /dev/null and b/content/posts/2022/12/09/springone-tlv-world-tour-trip-report/cover-image.jpg differ diff --git a/content/posts/2022/12/09/springone-tlv-world-tour-trip-report/cover-image.png b/content/posts/2022/12/09/springone-tlv-world-tour-trip-report/cover-image.png deleted file mode 100644 index 4070bcba5..000000000 Binary files a/content/posts/2022/12/09/springone-tlv-world-tour-trip-report/cover-image.png and /dev/null differ diff --git a/content/posts/2022/12/09/springone-tlv-world-tour-trip-report/index.md b/content/posts/2022/12/09/springone-tlv-world-tour-trip-report/index.md index 2aa72f91f..65f961a80 100644 --- a/content/posts/2022/12/09/springone-tlv-world-tour-trip-report/index.md +++ b/content/posts/2022/12/09/springone-tlv-world-tour-trip-report/index.md @@ -6,7 +6,7 @@ description: "Got a chance to meet & talk to many interesting members of the Spr canonical: "https://debugagent.com/springone-tlv-world-tour-trip-report" authors: - "shai-almog" -image: "cover-image.png" +image: "cover-image.jpg" categories: - "Cloud" - "Spring" diff --git a/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/index.md b/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/index.md index 95a370a36..3e9b40eee 100644 --- a/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/index.md +++ b/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/index.md @@ -30,8 +30,8 @@ Based on many inputs, Trinity helps evaluate whether machine learning models pro Trinity allows users to navigate and explore hundreds of layers in AI models and hyper-dimensional data by visualizing them in 3D. {{< gallery >}} -trinity-skyline-1024x576.png | Trinity intro and main menu -trinity-hyperspace-1024x576.png | Trinity Hyperspace Tool +trinity-skyline-1024x576.jpg | Trinity intro and main menu +trinity-hyperspace-1024x576.jpg | Trinity Hyperspace Tool trinity-hypersurface-1024x576.png | Trinity Hypersurface Tool {{< /gallery >}} diff --git a/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-hyperspace-1024x576.jpg b/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-hyperspace-1024x576.jpg new file mode 100644 index 000000000..a8cce41e1 Binary files /dev/null and b/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-hyperspace-1024x576.jpg differ diff --git a/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-hyperspace-1024x576.png b/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-hyperspace-1024x576.png deleted file mode 100644 index 0cbb12522..000000000 Binary files a/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-hyperspace-1024x576.png and /dev/null differ diff --git a/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-hypersurface.jpg b/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-hypersurface.jpg new file mode 100644 index 000000000..fa53a4b76 Binary files /dev/null and b/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-hypersurface.jpg differ diff --git a/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-hypersurface.png b/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-hypersurface.png deleted file mode 100644 index 83e905e68..000000000 Binary files a/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-hypersurface.png and /dev/null differ diff --git a/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-skyline-1024x576.jpg b/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-skyline-1024x576.jpg new file mode 100644 index 000000000..c131e2003 Binary files /dev/null and b/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-skyline-1024x576.jpg differ diff --git a/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-skyline-1024x576.png b/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-skyline-1024x576.png deleted file mode 100644 index 5f184d728..000000000 Binary files a/content/posts/2022/12/09/visualizing-brain-computer-interface-data-using-javafx/trinity-skyline-1024x576.png and /dev/null differ diff --git a/content/posts/2022/12/16/preparing-to-move-away-from-twitter/Screenshot-2022-12-11-at-17.59.21-782x1024.jpg b/content/posts/2022/12/16/preparing-to-move-away-from-twitter/Screenshot-2022-12-11-at-17.59.21-782x1024.jpg new file mode 100644 index 000000000..8dadf2a5f Binary files /dev/null and b/content/posts/2022/12/16/preparing-to-move-away-from-twitter/Screenshot-2022-12-11-at-17.59.21-782x1024.jpg differ diff --git a/content/posts/2022/12/16/preparing-to-move-away-from-twitter/Screenshot-2022-12-11-at-17.59.21-782x1024.png b/content/posts/2022/12/16/preparing-to-move-away-from-twitter/Screenshot-2022-12-11-at-17.59.21-782x1024.png deleted file mode 100644 index 5af9db125..000000000 Binary files a/content/posts/2022/12/16/preparing-to-move-away-from-twitter/Screenshot-2022-12-11-at-17.59.21-782x1024.png and /dev/null differ diff --git a/content/posts/2022/12/16/preparing-to-move-away-from-twitter/index.md b/content/posts/2022/12/16/preparing-to-move-away-from-twitter/index.md index 57e7b626b..b63c4a84d 100644 --- a/content/posts/2022/12/16/preparing-to-move-away-from-twitter/index.md +++ b/content/posts/2022/12/16/preparing-to-move-away-from-twitter/index.md @@ -25,7 +25,7 @@ Of course, I wanted to support them and started to use my Twitter account to fig With the acquisition of Twitter by Elon Musk, I'm afraid it's going to get much worse - case in point: -[![](Screenshot-2022-12-11-at-17.59.21-782x1024.png)](https://twitter.com/SarahKSilverman/status/1589418271308386304) +[![](Screenshot-2022-12-11-at-17.59.21-782x1024.jpg)](https://twitter.com/SarahKSilverman/status/1589418271308386304) Some (most?) people I know planned or already had moved away. The target seems to be Mastodon, an alternate decentralized Open Source using the [ActivityPub](https://en.wikipedia.org/wiki/ActivityPub) protocol: > Mastodon is free and open-source software for running self-hosted social networking services. It has microblogging features similar to the Twitter service, which are offered by a large number of independently run Mastodon nodes (technically known as instances), each with its own code of conduct, terms of service, privacy options, and moderation policies. diff --git a/content/posts/2022/12/19/foojay-podcast-9/index.md b/content/posts/2022/12/19/foojay-podcast-9/index.md index 5c1827daf..cb15cbdf6 100644 --- a/content/posts/2022/12/19/foojay-podcast-9/index.md +++ b/content/posts/2022/12/19/foojay-podcast-9/index.md @@ -8,7 +8,7 @@ authors: - "gail-anderson" - "johan-vos" - "pedro-vieira" -image: "podcast-javafx-guests-1024x393.png" +image: "podcast-javafx-guests-1024x393.jpg" categories: - "JavaFX" - "Podcast" diff --git a/content/posts/2022/12/19/foojay-podcast-9/podcast-javafx-guests-1024x393.jpg b/content/posts/2022/12/19/foojay-podcast-9/podcast-javafx-guests-1024x393.jpg new file mode 100644 index 000000000..86aaff3a9 Binary files /dev/null and b/content/posts/2022/12/19/foojay-podcast-9/podcast-javafx-guests-1024x393.jpg differ diff --git a/content/posts/2022/12/19/foojay-podcast-9/podcast-javafx-guests-1024x393.png b/content/posts/2022/12/19/foojay-podcast-9/podcast-javafx-guests-1024x393.png deleted file mode 100644 index 7c4a55086..000000000 Binary files a/content/posts/2022/12/19/foojay-podcast-9/podcast-javafx-guests-1024x393.png and /dev/null differ diff --git a/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/index.md b/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/index.md index fa8a22530..408867c7d 100644 --- a/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/index.md +++ b/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/index.md @@ -46,7 +46,7 @@ The postfix shortcuts we currently support are the following: Here's a demo for this feature: -[![Postfix Completion](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/11/postfix.gif)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/11/postfix.gif) +[![Postfix Completion](postfix.webp)](postfix.webp) We plan to continue adding more postfix shortcuts so stay tuned. @@ -68,7 +68,7 @@ Another way to add all missing imports to right click to pull out the context me Here's a demo for all features mentioned above -[![Organize import](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/11/organizeimport.gif)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/11/organizeimport.gif) +[![Organize import](organizeimport-5ee8eb12.webp)](organizeimport-5ee8eb12.webp) We are continuing to add more improvements around "organize import" scenarios and you can find all our future plans in [this GitHub issue](https://github.com/redhat-developer/vscode-java/issues/2748). Feel free to leave your feedback or comments there. @@ -82,7 +82,7 @@ In our latest Extension Pack for Java, we have started to support this feature. When debugging has stopped on a statement, you can select "Step Into Target" from the context menu, which allows you to directly step into the function or target you are interested in. Here's a demo for this feature: -[![Step into target](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/11/stepintotarget.gif)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/11/stepintotarget.gif) +[![Step into target](stepintotarget-54c42bca.webp)](stepintotarget-54c42bca.webp) #### **Gutter Icons for Spring Components** @@ -92,17 +92,17 @@ With the latest release of Spring Boot Extension Pack, you will find gutter icon This gives you visual clues that this is a Spring entity. When hovering on these components, a tooltip will pop up and you will see details about this component as well as a link to open it in Spring Boot dashboard. Here is a quick demo for this feature. -[![Spring gutter icon](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/11/springguttericon.gif)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/11/springguttericon.gif) +[![Spring gutter icon](springguttericon-8af8bba9.gif)](springguttericon-8af8bba9.gif) #### **Install Extension Pack for Java** To use all features mentioned above, please download and install [Extension Pack for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) on Visual Studio Code. -[![Extension pack for Java](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png) +[![Extension pack for Java](javapack-892c0338.png)](javapack-892c0338.png) If you are a Spring developer working on a Spring Boot application, you can also download the [Spring Boot Extension Pack](https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-boot-dev-pack) for specialized Spring experience. -[![Spring boot extension pack](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png) +[![Spring boot extension pack](spring-ac42cb4c.png)](spring-ac42cb4c.png) **Feedback and suggestions** diff --git a/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/javapack-892c0338.png b/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/javapack-892c0338.png new file mode 100644 index 000000000..c05f90e30 Binary files /dev/null and b/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/javapack-892c0338.png differ diff --git a/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/organizeimport-5ee8eb12.webp b/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/organizeimport-5ee8eb12.webp new file mode 100644 index 000000000..6eb8bad5c Binary files /dev/null and b/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/organizeimport-5ee8eb12.webp differ diff --git a/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/spring-ac42cb4c.png b/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/spring-ac42cb4c.png new file mode 100644 index 000000000..c3d38f0a6 Binary files /dev/null and b/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/spring-ac42cb4c.png differ diff --git a/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/springguttericon-8af8bba9.gif b/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/springguttericon-8af8bba9.gif new file mode 100644 index 000000000..7a37b0d84 Binary files /dev/null and b/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/springguttericon-8af8bba9.gif differ diff --git a/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/stepintotarget-54c42bca.webp b/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/stepintotarget-54c42bca.webp new file mode 100644 index 000000000..f0d2d6631 Binary files /dev/null and b/content/posts/2022/12/19/two-million-java-developers-on-visual-studio-code-november-2022-update/stepintotarget-54c42bca.webp differ diff --git a/content/posts/2022/12/22/spring-boot-annotation-reference-01-a/AVvXsEghRn9_AnCnub4H-xJJZ3IDGxtXEzayfXKV-07a05395.png b/content/posts/2022/12/22/spring-boot-annotation-reference-01-a/AVvXsEghRn9_AnCnub4H-xJJZ3IDGxtXEzayfXKV-07a05395.png new file mode 100644 index 000000000..07cae7660 Binary files /dev/null and b/content/posts/2022/12/22/spring-boot-annotation-reference-01-a/AVvXsEghRn9_AnCnub4H-xJJZ3IDGxtXEzayfXKV-07a05395.png differ diff --git a/content/posts/2022/12/22/spring-boot-annotation-reference-01-a/AVvXsEh_YHALIvRTyRrUibkYVbv4T6wajr7lTequ-b49c69f3.png b/content/posts/2022/12/22/spring-boot-annotation-reference-01-a/AVvXsEh_YHALIvRTyRrUibkYVbv4T6wajr7lTequ-b49c69f3.png new file mode 100644 index 000000000..1eab14069 Binary files /dev/null and b/content/posts/2022/12/22/spring-boot-annotation-reference-01-a/AVvXsEh_YHALIvRTyRrUibkYVbv4T6wajr7lTequ-b49c69f3.png differ diff --git a/content/posts/2022/12/22/spring-boot-annotation-reference-01-a/index.md b/content/posts/2022/12/22/spring-boot-annotation-reference-01-a/index.md index a79c48fe0..9e2854aab 100644 --- a/content/posts/2022/12/22/spring-boot-annotation-reference-01-a/index.md +++ b/content/posts/2022/12/22/spring-boot-annotation-reference-01-a/index.md @@ -24,7 +24,7 @@ Though I had worked on a 'similar architecture' way back in 2007-'08 while worki This includes building 'executable applications' for windows much easier! -![](https://blogger.googleusercontent.com/img/a/AVvXsEghRn9_AnCnub4H-xJJZ3IDGxtXEzayfXKV-XqD0czmugSGjJGEVYDe1cVOxHKRyK9G5jM8V03LJfxUWL5O0cdKgAB-PjoBOPu-1z6Ctv-uMZqP7ygj0J_mTdDL5CqVLZKGAP2SgG-fwGfqpWgoIMGZJv3hbX5swfCm9Snmp_nA4zui3bdm_3Q09TPtFA) +![](AVvXsEghRn9_AnCnub4H-xJJZ3IDGxtXEzayfXKV-07a05395.png) Anyways, the topic of our discussion is Spring Boot Annotations. Recently, in August 2022 while training a team of 10, I realized that though even though I know most of the Spring Boot Annotations, I may not be aware of all of them. So, I decided to write this article. @@ -167,7 +167,7 @@ package xyz.sumithpuri.spring.boot.annotation.configuration; With Spring DevTools Enabled, you will see one such log on the console that are the debug statements showing the matches or evaluations against the conditions. -![](https://blogger.googleusercontent.com/img/a/AVvXsEh_YHALIvRTyRrUibkYVbv4T6wajr7lTequVrbA6XybZubtdP61FHgch9J84jsHrPcvXmlTmoo0_Q4CFzo9SRYompQJgGkuZWWHcP3MBtJKfoSI4ByS7-VuG7Jpf2tbMKqHi-fgivNuWH76fWzHjLGsfGp3OYhY5s0JhilC5kDne9a-BJCqIzkuy1k_3A) +![](AVvXsEh_YHALIvRTyRrUibkYVbv4T6wajr7lTequ-b49c69f3.png) **@ConditionalOnProperty** @@ -206,7 +206,7 @@ Please go ahead and add the property 'mode=false' in your application.properties If this property is not present or has a different value, your server will refuse to start as there will be not property present to inject for an autowired bean. (Refer to the code in the GitHub Repository). -![](https://blogger.googleusercontent.com/img/a/AVvXsEghRn9_AnCnub4H-xJJZ3IDGxtXEzayfXKV-XqD0czmugSGjJGEVYDe1cVOxHKRyK9G5jM8V03LJfxUWL5O0cdKgAB-PjoBOPu-1z6Ctv-uMZqP7ygj0J_mTdDL5CqVLZKGAP2SgG-fwGfqpWgoIMGZJv3hbX5swfCm9Snmp_nA4zui3bdm_3Q09TPtFA) +![](AVvXsEghRn9_AnCnub4H-xJJZ3IDGxtXEzayfXKV-07a05395.png) **@ConfigurationProperties** **@ConfigurationPropertiesScan** diff --git a/content/posts/2022/12/27/javafx-links-of-december/index.md b/content/posts/2022/12/27/javafx-links-of-december/index.md index 91e39a993..9bdbb53c7 100644 --- a/content/posts/2022/12/27/javafx-links-of-december/index.md +++ b/content/posts/2022/12/27/javafx-links-of-december/index.md @@ -5,7 +5,7 @@ lastmod: "2022-12-27T07:55:53+00:00" description: "If anyone needs a reminder Java and JavaFX are \"alive and kicking\", you can not only check out jfx-central.com, but also the list below." authors: - "frankdelporte" -image: "podcast-javafx-guests-1024x393.png" +image: "podcast-javafx-guests-1024x393.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2022/12/27/javafx-links-of-december/podcast-javafx-guests-1024x393.jpg b/content/posts/2022/12/27/javafx-links-of-december/podcast-javafx-guests-1024x393.jpg new file mode 100644 index 000000000..86aaff3a9 Binary files /dev/null and b/content/posts/2022/12/27/javafx-links-of-december/podcast-javafx-guests-1024x393.jpg differ diff --git a/content/posts/2022/12/27/javafx-links-of-december/podcast-javafx-guests-1024x393.png b/content/posts/2022/12/27/javafx-links-of-december/podcast-javafx-guests-1024x393.png deleted file mode 100644 index 7c4a55086..000000000 Binary files a/content/posts/2022/12/27/javafx-links-of-december/podcast-javafx-guests-1024x393.png and /dev/null differ diff --git a/content/posts/2022/12/28/java-on-visual-studio-code-update-december-2022/index.md b/content/posts/2022/12/28/java-on-visual-studio-code-update-december-2022/index.md index 04c9c3fa9..db086f317 100644 --- a/content/posts/2022/12/28/java-on-visual-studio-code-update-december-2022/index.md +++ b/content/posts/2022/12/28/java-on-visual-studio-code-update-december-2022/index.md @@ -28,7 +28,7 @@ This includes the beans and endpoints mapping view, more live information displa We hope that these improvements make it easier to develop Spring applications and observe the state of application when it's running. -[![Spring Boot dashboard smaller](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/06/springbootdashboard-1.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/06/springbootdashboard-1.png) +[![Spring Boot dashboard smaller](springbootdashboard-1.png)](springbootdashboard-1.png) #### Fundamental Coding Experience Improvements @@ -114,11 +114,11 @@ There will be many great updates coming in 2023, so please stay tuned, and see y To use all features mentioned above, please download and install [Extension Pack for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) on Visual Studio Code. -[![Extension pack for Java](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png) +[![Extension pack for Java](javapack-892c0338.png)](javapack-892c0338.png) If you are a Spring developer working on a Spring Boot application, you can also download the [Spring Boot Extension Pack](https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-boot-dev-pack) for specialized Spring experience. -[![Spring boot extension pack](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png) +[![Spring boot extension pack](spring-ac42cb4c.png)](spring-ac42cb4c.png) Feedback and suggestions diff --git a/content/posts/2022/12/28/java-on-visual-studio-code-update-december-2022/javapack-892c0338.png b/content/posts/2022/12/28/java-on-visual-studio-code-update-december-2022/javapack-892c0338.png new file mode 100644 index 000000000..c05f90e30 Binary files /dev/null and b/content/posts/2022/12/28/java-on-visual-studio-code-update-december-2022/javapack-892c0338.png differ diff --git a/content/posts/2022/12/28/java-on-visual-studio-code-update-december-2022/spring-ac42cb4c.png b/content/posts/2022/12/28/java-on-visual-studio-code-update-december-2022/spring-ac42cb4c.png new file mode 100644 index 000000000..c3d38f0a6 Binary files /dev/null and b/content/posts/2022/12/28/java-on-visual-studio-code-update-december-2022/spring-ac42cb4c.png differ diff --git a/content/posts/2023/01/03/foojay-podcast-10/dubai-jug-podcast-1024x575-1.jpg b/content/posts/2023/01/03/foojay-podcast-10/dubai-jug-podcast-1024x575-1.jpg new file mode 100644 index 000000000..8539501d4 Binary files /dev/null and b/content/posts/2023/01/03/foojay-podcast-10/dubai-jug-podcast-1024x575-1.jpg differ diff --git a/content/posts/2023/01/03/foojay-podcast-10/dubai-jug-podcast-1024x575-1.png b/content/posts/2023/01/03/foojay-podcast-10/dubai-jug-podcast-1024x575-1.png deleted file mode 100644 index 54802e284..000000000 Binary files a/content/posts/2023/01/03/foojay-podcast-10/dubai-jug-podcast-1024x575-1.png and /dev/null differ diff --git a/content/posts/2023/01/03/foojay-podcast-10/index.md b/content/posts/2023/01/03/foojay-podcast-10/index.md index 0619d12f2..ff0d240ef 100644 --- a/content/posts/2023/01/03/foojay-podcast-10/index.md +++ b/content/posts/2023/01/03/foojay-podcast-10/index.md @@ -5,7 +5,7 @@ lastmod: "2025-11-13T09:18:36+00:00" description: "in this episode, we talk to the organizers of the Dubai JUG that started in May of 2022. Find out how the JUG started and where it's going!" authors: - "frankdelporte" -image: "dubai-jug-podcast-1024x575-1.png" +image: "dubai-jug-podcast-1024x575-1.jpg" categories: - "Foojay" - "JUGs" diff --git a/content/posts/2023/01/09/new-section-added-to-foojay-io-java-quick-start/foojay-playlist-getting-started-942x1024.jpg b/content/posts/2023/01/09/new-section-added-to-foojay-io-java-quick-start/foojay-playlist-getting-started-942x1024.jpg new file mode 100644 index 000000000..f2bc5bc4c Binary files /dev/null and b/content/posts/2023/01/09/new-section-added-to-foojay-io-java-quick-start/foojay-playlist-getting-started-942x1024.jpg differ diff --git a/content/posts/2023/01/09/new-section-added-to-foojay-io-java-quick-start/foojay-playlist-getting-started-942x1024.png b/content/posts/2023/01/09/new-section-added-to-foojay-io-java-quick-start/foojay-playlist-getting-started-942x1024.png deleted file mode 100644 index 7adadee5c..000000000 Binary files a/content/posts/2023/01/09/new-section-added-to-foojay-io-java-quick-start/foojay-playlist-getting-started-942x1024.png and /dev/null differ diff --git a/content/posts/2023/01/09/new-section-added-to-foojay-io-java-quick-start/index.md b/content/posts/2023/01/09/new-section-added-to-foojay-io-java-quick-start/index.md index cad81ce41..8929715b1 100644 --- a/content/posts/2023/01/09/new-section-added-to-foojay-io-java-quick-start/index.md +++ b/content/posts/2023/01/09/new-section-added-to-foojay-io-java-quick-start/index.md @@ -25,7 +25,7 @@ So... today we're announcing a new section: [Java Quick Start](https://foojay.io {{< gallery >}} foojay-menu-quick-start.png -foojay-playlist-getting-started-942x1024.png +foojay-playlist-getting-started-942x1024.jpg {{< /gallery >}} ## What You Will Learn diff --git a/content/posts/2023/01/10/2022-in-retrospective/Screenshot-2023-01-02-at-15.32.08-752x1024.jpg b/content/posts/2023/01/10/2022-in-retrospective/Screenshot-2023-01-02-at-15.32.08-752x1024.jpg new file mode 100644 index 000000000..835eea5cf Binary files /dev/null and b/content/posts/2023/01/10/2022-in-retrospective/Screenshot-2023-01-02-at-15.32.08-752x1024.jpg differ diff --git a/content/posts/2023/01/10/2022-in-retrospective/Screenshot-2023-01-02-at-15.32.08-752x1024.png b/content/posts/2023/01/10/2022-in-retrospective/Screenshot-2023-01-02-at-15.32.08-752x1024.png deleted file mode 100644 index 9421abb65..000000000 Binary files a/content/posts/2023/01/10/2022-in-retrospective/Screenshot-2023-01-02-at-15.32.08-752x1024.png and /dev/null differ diff --git a/content/posts/2023/01/10/2022-in-retrospective/index.md b/content/posts/2023/01/10/2022-in-retrospective/index.md index bb7bc4c8a..3d6ce536a 100644 --- a/content/posts/2023/01/10/2022-in-retrospective/index.md +++ b/content/posts/2023/01/10/2022-in-retrospective/index.md @@ -97,7 +97,7 @@ It's interesting to see that though I thought dev.to focused on web and front-en ## Public speaking -[![](Screenshot-2023-01-02-at-15.32.08-752x1024.png)](https://twitter.com/nicolas_frankel/status/1608043464146710528) +[![](Screenshot-2023-01-02-at-15.32.08-752x1024.jpg)](https://twitter.com/nicolas_frankel/status/1608043464146710528) Indeed, 2022 was not my best year in terms of conference attendance. Here's a comparison of the previous years: diff --git a/content/posts/2023/01/10/managing-dependencies-in-intellij-idea/add-ktor.jpg b/content/posts/2023/01/10/managing-dependencies-in-intellij-idea/add-ktor.jpg new file mode 100644 index 000000000..2bec2e709 Binary files /dev/null and b/content/posts/2023/01/10/managing-dependencies-in-intellij-idea/add-ktor.jpg differ diff --git a/content/posts/2023/01/10/managing-dependencies-in-intellij-idea/add-ktor.png b/content/posts/2023/01/10/managing-dependencies-in-intellij-idea/add-ktor.png deleted file mode 100644 index 92229e85c..000000000 Binary files a/content/posts/2023/01/10/managing-dependencies-in-intellij-idea/add-ktor.png and /dev/null differ diff --git a/content/posts/2023/01/10/managing-dependencies-in-intellij-idea/index.md b/content/posts/2023/01/10/managing-dependencies-in-intellij-idea/index.md index 80e9fcec3..d7f532b75 100644 --- a/content/posts/2023/01/10/managing-dependencies-in-intellij-idea/index.md +++ b/content/posts/2023/01/10/managing-dependencies-in-intellij-idea/index.md @@ -165,7 +165,7 @@ If we want to see only Kotlin multiplatform dependencies, we can select the **Ko When we click **Add** to the right of the Ktor dependency, we see that Ktor is added to the list of dependencies and to the pom.xml for the Kotlin module. -[![Add Ktor](add-ktor.png "Add Ktor")](add-ktor.png "Add Ktor") +[![Add Ktor](add-ktor.jpg "Add Ktor")](add-ktor.jpg "Add Ktor") We will also need to keep our dependencies up to date. diff --git a/content/posts/2023/01/16/foojay-podcast-11/index.md b/content/posts/2023/01/16/foojay-podcast-11/index.md index f7adfa4af..3f1931a55 100644 --- a/content/posts/2023/01/16/foojay-podcast-11/index.md +++ b/content/posts/2023/01/16/foojay-podcast-11/index.md @@ -5,7 +5,7 @@ lastmod: "2025-11-13T09:17:59+00:00" description: "In this Foojay Podcast episode, we talk about Ted Neward's predictions, and an analogy between Twitter and Java!" authors: - "frankdelporte" -image: "ted-frank-zoom-1.png" +image: "ted-frank-zoom-1.jpg" categories: - "Interviews" - "Opinion" diff --git a/content/posts/2023/01/16/foojay-podcast-11/ted-frank-zoom-1.jpg b/content/posts/2023/01/16/foojay-podcast-11/ted-frank-zoom-1.jpg new file mode 100644 index 000000000..06502b84e Binary files /dev/null and b/content/posts/2023/01/16/foojay-podcast-11/ted-frank-zoom-1.jpg differ diff --git a/content/posts/2023/01/16/foojay-podcast-11/ted-frank-zoom-1.png b/content/posts/2023/01/16/foojay-podcast-11/ted-frank-zoom-1.png deleted file mode 100644 index cc420ebac..000000000 Binary files a/content/posts/2023/01/16/foojay-podcast-11/ted-frank-zoom-1.png and /dev/null differ diff --git a/content/posts/2023/01/23/foojay-podcast-12/ide-podcast-guests-1024x396-1.jpg b/content/posts/2023/01/23/foojay-podcast-12/ide-podcast-guests-1024x396-1.jpg new file mode 100644 index 000000000..cf67d2924 Binary files /dev/null and b/content/posts/2023/01/23/foojay-podcast-12/ide-podcast-guests-1024x396-1.jpg differ diff --git a/content/posts/2023/01/23/foojay-podcast-12/ide-podcast-guests-1024x396-1.png b/content/posts/2023/01/23/foojay-podcast-12/ide-podcast-guests-1024x396-1.png deleted file mode 100644 index 730b3f2ea..000000000 Binary files a/content/posts/2023/01/23/foojay-podcast-12/ide-podcast-guests-1024x396-1.png and /dev/null differ diff --git a/content/posts/2023/01/23/foojay-podcast-12/index.md b/content/posts/2023/01/23/foojay-podcast-12/index.md index 8a486ae3c..0d6f575e8 100644 --- a/content/posts/2023/01/23/foojay-podcast-12/index.md +++ b/content/posts/2023/01/23/foojay-podcast-12/index.md @@ -8,7 +8,7 @@ authors: - "geertjan-wielenga" - "helenjoscott" - "nick-zhu" -image: "ide-podcast-guests-1024x396-1.png" +image: "ide-podcast-guests-1024x396-1.jpg" categories: - "Deep Netts" - "Eclipse" diff --git a/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/image-1-8a4d5e94.png b/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/image-1-8a4d5e94.png new file mode 100644 index 000000000..ef629b701 Binary files /dev/null and b/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/image-1-8a4d5e94.png differ diff --git a/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/image-1024x723-ac6f6f14.png b/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/image-1024x723-ac6f6f14.png new file mode 100644 index 000000000..9e6f6fe2e Binary files /dev/null and b/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/image-1024x723-ac6f6f14.png differ diff --git a/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/image-2-1dce7fe8.png b/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/image-2-1dce7fe8.png new file mode 100644 index 000000000..c0b3349b1 Binary files /dev/null and b/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/image-2-1dce7fe8.png differ diff --git a/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/image-3-975eafca.png b/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/image-3-975eafca.png new file mode 100644 index 000000000..632d23b3b Binary files /dev/null and b/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/image-3-975eafca.png differ diff --git a/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/index.md b/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/index.md index 94c14b3d6..f4f74dffa 100644 --- a/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/index.md +++ b/content/posts/2023/01/24/vaadin-oauth2-and-keycloak/index.md @@ -80,7 +80,7 @@ Now comes a crucial step. We must disable the role mapping to the ID token. When 5. Disable "Add to ID token" The configuration must look like this: -![](https://martinelli.ch/wp-content/uploads/2022/11/image-1024x723.png) +![](image-1024x723-ac6f6f14.png) ## Vaadin Application with Security Configuration @@ -139,15 +139,15 @@ spring.security.oauth2.client.provider.keycloak.user-name-attribute=preferred_us ``` Now you can start the application and open . -![](https://martinelli.ch/wp-content/uploads/2022/11/image-1.png) +![](image-1-8a4d5e94.png) As you can see in the menu on the left, there is only one entry, "Index". Click on the "Sign in" button in the lower left corner. This will direct you to the Keycloak login screen. -![](https://martinelli.ch/wp-content/uploads/2022/11/image-2.png) +![](image-2-1dce7fe8.png) Sign in with admin/admin, and you'll be redirected to the app: -![](https://martinelli.ch/wp-content/uploads/2022/11/image-3.png) +![](image-3-975eafca.png) Now you have access to all views. diff --git a/content/posts/2023/01/26/asyncgetstacktrace-a-better-stack-trace-api-for-the-jvm/asgct_2-2000x1125-c8c811ba.jpg b/content/posts/2023/01/26/asyncgetstacktrace-a-better-stack-trace-api-for-the-jvm/asgct_2-2000x1125-c8c811ba.jpg new file mode 100644 index 000000000..8b89c5c3b Binary files /dev/null and b/content/posts/2023/01/26/asyncgetstacktrace-a-better-stack-trace-api-for-the-jvm/asgct_2-2000x1125-c8c811ba.jpg differ diff --git a/content/posts/2023/01/26/asyncgetstacktrace-a-better-stack-trace-api-for-the-jvm/asgst-2000x1125-f319748f.jpg b/content/posts/2023/01/26/asyncgetstacktrace-a-better-stack-trace-api-for-the-jvm/asgst-2000x1125-f319748f.jpg new file mode 100644 index 000000000..5baf60a71 Binary files /dev/null and b/content/posts/2023/01/26/asyncgetstacktrace-a-better-stack-trace-api-for-the-jvm/asgst-2000x1125-f319748f.jpg differ diff --git a/content/posts/2023/01/26/asyncgetstacktrace-a-better-stack-trace-api-for-the-jvm/index.md b/content/posts/2023/01/26/asyncgetstacktrace-a-better-stack-trace-api-for-the-jvm/index.md index 8349c6e4f..f2efbcbaa 100644 --- a/content/posts/2023/01/26/asyncgetstacktrace-a-better-stack-trace-api-for-the-jvm/index.md +++ b/content/posts/2023/01/26/asyncgetstacktrace-a-better-stack-trace-api-for-the-jvm/index.md @@ -71,7 +71,7 @@ He never implemented anything into his async-profiler. ## AsyncGetCallTrace The only other option left is to use `AsyncGetCallTrace`, an API added on the 19th of November 2002 in the JVMTI draft and removed two months later. This API is the asynchronous, non-safepoint-biased ([kind-of](https://jpbempel.github.io/2022/06/22/debug-non-safepoints.html)) version of `GetStackTrace`, called from signal handlers at any point of time: -![](https://mostlynerdless.de/wp-content/uploads/2023/01/asgct_2-2000x1125.png) +![](asgct_2-2000x1125-c8c811ba.jpg) ```cpp void AsyncGetCallTrace(ASGCT_CallTrace *trace, jint depth, @@ -122,7 +122,7 @@ These discussions eventually led to the proposal of `AsyncGetStackTrace` that is ## AsyncGetStackTrace The proposed API is essentially an extended, official, and well-tested version of `AsyncGetCallTrace`: -![](https://mostlynerdless.de/wp-content/uploads/2023/01/asgst-2000x1125.png) +![](asgst-2000x1125-f319748f.jpg) * it has its own `profile.h` header, so using it is easy * it returns much more information on individual frames, like compilation level (interpreted, C1, C2, ...) and info on inlining diff --git a/content/posts/2023/01/30/javafx-links-of-january-2023/index.md b/content/posts/2023/01/30/javafx-links-of-january-2023/index.md index 2c67c62a4..0effa48b9 100644 --- a/content/posts/2023/01/30/javafx-links-of-january-2023/index.md +++ b/content/posts/2023/01/30/javafx-links-of-january-2023/index.md @@ -5,7 +5,7 @@ lastmod: "2023-02-03T07:15:30+00:00" description: "2023 has taken of with a flying start! Here is a summary of the Links Of The Week that were published in January on jfx-central.com." authors: - "frankdelporte" -image: "podcast-javafx-guests-1024x393.png" +image: "podcast-javafx-guests-1024x393.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2023/01/30/javafx-links-of-january-2023/podcast-javafx-guests-1024x393.jpg b/content/posts/2023/01/30/javafx-links-of-january-2023/podcast-javafx-guests-1024x393.jpg new file mode 100644 index 000000000..86aaff3a9 Binary files /dev/null and b/content/posts/2023/01/30/javafx-links-of-january-2023/podcast-javafx-guests-1024x393.jpg differ diff --git a/content/posts/2023/01/30/javafx-links-of-january-2023/podcast-javafx-guests-1024x393.png b/content/posts/2023/01/30/javafx-links-of-january-2023/podcast-javafx-guests-1024x393.png deleted file mode 100644 index 7c4a55086..000000000 Binary files a/content/posts/2023/01/30/javafx-links-of-january-2023/podcast-javafx-guests-1024x393.png and /dev/null differ diff --git a/content/posts/2023/02/01/real-time-stream-processing-with-hazelcast-and-streamnative/Screenshot-2023-01-27-at-14.01.42-c6268004.jpg b/content/posts/2023/02/01/real-time-stream-processing-with-hazelcast-and-streamnative/Screenshot-2023-01-27-at-14.01.42-c6268004.jpg new file mode 100644 index 000000000..81d32b0f3 Binary files /dev/null and b/content/posts/2023/02/01/real-time-stream-processing-with-hazelcast-and-streamnative/Screenshot-2023-01-27-at-14.01.42-c6268004.jpg differ diff --git a/content/posts/2023/02/01/real-time-stream-processing-with-hazelcast-and-streamnative/index.md b/content/posts/2023/02/01/real-time-stream-processing-with-hazelcast-and-streamnative/index.md index dc6371482..022df88a6 100644 --- a/content/posts/2023/02/01/real-time-stream-processing-with-hazelcast-and-streamnative/index.md +++ b/content/posts/2023/02/01/real-time-stream-processing-with-hazelcast-and-streamnative/index.md @@ -33,7 +33,7 @@ When it comes to usage, Hazelcast can be used for stateful data processing over Meanwhile, Apache Pulsar **can be used for** both messaging and streaming use cases, taking the place of multiple products and provides a superset of their features. Apache Pulsar is a cloud-native multitenant unified messaging platform to replace Apache Kafka, RabbitMQ, MQTT and legacy messaging platforms. Apache Pulsar provides an infinite message bus for Hazelcast to act as an instant source and sink for any and all data sources. -![](https://hazelcast.com/wp-content/uploads/2023/01/Screenshot-2023-01-27-at-14.00.51.png) +![](Screenshot-2023-01-27-at-14.00.51.png) ## Prerequisites @@ -136,7 +136,7 @@ Example PM2.5 Data {"dateObserved":"2023-01-19 ","hourObserved":12,"localTimeZone":"EST","reportingArea":"Philadelphia","stateCode":"PA","parameterName":"PM2.5","latitude":39.95,"longitude":-75.151,"aqi":54} ``` -![](https://hazelcast.com/wp-content/uploads/2023/01/Screenshot-2023-01-27-at-14.01.42.png) +![](Screenshot-2023-01-27-at-14.01.42-c6268004.jpg) ## Data processing diff --git a/content/posts/2023/02/02/firefox-profiler-beyond-the-web/FOSDEM-FirefoxProfiler-1-2000x888-3351e695.jpg b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/FOSDEM-FirefoxProfiler-1-2000x888-3351e695.jpg new file mode 100644 index 000000000..a2917b468 Binary files /dev/null and b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/FOSDEM-FirefoxProfiler-1-2000x888-3351e695.jpg differ diff --git a/content/posts/2023/02/02/firefox-profiler-beyond-the-web/Screenshot-2023-01-27-at-12.31.55-2000x1-1533b4a6.jpg b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/Screenshot-2023-01-27-at-12.31.55-2000x1-1533b4a6.jpg new file mode 100644 index 000000000..74be9c978 Binary files /dev/null and b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/Screenshot-2023-01-27-at-12.31.55-2000x1-1533b4a6.jpg differ diff --git a/content/posts/2023/02/02/firefox-profiler-beyond-the-web/Screenshot-2023-01-27-at-12.32.55-2000x1-16f7d89a.jpg b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/Screenshot-2023-01-27-at-12.32.55-2000x1-16f7d89a.jpg new file mode 100644 index 000000000..6428e1125 Binary files /dev/null and b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/Screenshot-2023-01-27-at-12.32.55-2000x1-16f7d89a.jpg differ diff --git a/content/posts/2023/02/02/firefox-profiler-beyond-the-web/Screenshot-2023-01-27-at-12.33.49-2000x1-cc7af2a0.jpg b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/Screenshot-2023-01-27-at-12.33.49-2000x1-cc7af2a0.jpg new file mode 100644 index 000000000..505f75d41 Binary files /dev/null and b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/Screenshot-2023-01-27-at-12.33.49-2000x1-cc7af2a0.jpg differ diff --git a/content/posts/2023/02/02/firefox-profiler-beyond-the-web/Screenshot-2023-01-27-at-12.34.45-1-2000-1c2d7b87.jpg b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/Screenshot-2023-01-27-at-12.34.45-1-2000-1c2d7b87.jpg new file mode 100644 index 000000000..142e3bc3c Binary files /dev/null and b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/Screenshot-2023-01-27-at-12.34.45-1-2000-1c2d7b87.jpg differ diff --git a/content/posts/2023/02/02/firefox-profiler-beyond-the-web/image-2-63d3ad24.jpg b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/image-2-63d3ad24.jpg new file mode 100644 index 000000000..9c881a68e Binary files /dev/null and b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/image-2-63d3ad24.jpg differ diff --git a/content/posts/2023/02/02/firefox-profiler-beyond-the-web/index.md b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/index.md index 191036740..4e953a9fa 100644 --- a/content/posts/2023/02/02/firefox-profiler-beyond-the-web/index.md +++ b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/index.md @@ -45,15 +45,15 @@ public void testEvaluateSwitchStatement() { ``` I wanted to use an open-source profiler, as I had no access to the paid version of [IntelliJ](https://www.jetbrains.com/idea/), which includes profiling support. Multiple tools are available, but it essentially boils down to [async-profiler](https://krzysztofslusarski.github.io/2022/12/12/async-manual.html) and [JMC](https://github.com/openjdk/jmc). Both tools have their advantages and disadvantages regarding their UI, but it essentially boils down to ease of use vs. available features: -![](https://mostlynerdless.de/wp-content/uploads/2023/01/FOSDEM-FirefoxProfiler-1-2000x888.png) +![](FOSDEM-FirefoxProfiler-1-2000x888-3351e695.jpg) Async-profiler and its profiling visualizations are easy to use but do not have that many features. The only available visualization is flamegraphs with minimal interactivity, just zooming is supported. Flamegraphs are the bread-and-butter of profiling: -[![](https://mostlynerdless.de/wp-content/uploads/2023/01/image-2.png)](https://twitter.com/mariofusco/status/1618928328613974018) +[![](image-2-63d3ad24.jpg)](https://twitter.com/mariofusco/status/1618928328613974018) If you want more visualizations, like a tree view, timelines, or a JFR event view, you can export your profile into JFR format (or use JFR to record your profile directly) and view it in JMC. But the difference between the ease of use of both is vast: Whereas the flamegraphs of async-profiler are usable by anyone with a short introduction, using JMC has a steep learning curve, it is currently more a tool for experts to dig deep into the profiling data. This observation leads us to the first problem: There is, to my knowledge, no open-source tool that offers more visualizations than just flamegraphs and is as easy to use. Another problem with both async-profiler and JFR is the missing integration into IDEs. I would like to just click on a button in a context menu to profile an individual test case: -![](https://mostlynerdless.de/wp-content/uploads/2023/01/jfrplugin_context_menu.png) +![](jfrplugin_context_menu-397c6365.jpg) Without the hassle of creating a main method that just calls this method: I want to be able to profile it by modifying the JVM options of a run configuration. @@ -79,16 +79,16 @@ Just keep in mind that you'll have to map your data onto the profile data struct ## My Java Profiler IntelliJ Plugin My [Java JFR profiler](https://github.com/parttimenerd/intellij-profiler-plugin) plugin is the result of all my efforts: -[![](https://mostlynerdless.de/wp-content/uploads/2023/01/Screenshot-2023-01-27-at-12.32.55-2000x1201.png)](https://plugins.jetbrains.com/plugin/20937-java-jfr-profiler) +[![](Screenshot-2023-01-27-at-12.32.55-2000x1-16f7d89a.jpg)](https://plugins.jetbrains.com/plugin/20937-java-jfr-profiler) It uses my [Firefox Profiler fork](https://github.com/parttimenerd/firefox-profiler), which includes additions not yet in the upstream repository and has a modular implementation so that you can use the JFR to Firefox Profiler converter independently. The plugin supports gathering profiles using JFR and async-profiler (via ap-loader), the previous image with the different run configurations is from my plugin, and opening arbitrary JFR files (as long as they are not too large): -![](https://mostlynerdless.de/wp-content/uploads/2023/01/Screenshot-2023-01-27-at-12.31.55-2000x1201.png) +![](Screenshot-2023-01-27-at-12.31.55-2000x1-1533b4a6.jpg) The plugin integrates with your IDE, navigating to a method in the source code when you double-click a method in the profile view. Shift double-click, and it shows you the code with the profiling information on the side: -![](https://mostlynerdless.de/wp-content/uploads/2023/01/Screenshot-2023-01-27-at-12.34.45-1-2000x1201.png) +![](Screenshot-2023-01-27-at-12.34.45-1-2000-1c2d7b87.jpg) Besides that, it has support for showing information on all JFR events: -![](https://mostlynerdless.de/wp-content/uploads/2023/01/Screenshot-2023-01-27-at-12.33.49-2000x1201.png) +![](Screenshot-2023-01-27-at-12.33.49-2000x1-cc7af2a0.jpg) The Firefox Profiler view contains a *Function Table* , *Flame Graph* , and *Stack Chart* view, combined with a timeline on top, so it truly solves the first problem of visualizations. And it solves the second problem, as profiling with JFR or async-profiler can't be more accessible than clicking a single button. diff --git a/content/posts/2023/02/02/firefox-profiler-beyond-the-web/jfrplugin_context_menu-397c6365.jpg b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/jfrplugin_context_menu-397c6365.jpg new file mode 100644 index 000000000..ed9cc0ee8 Binary files /dev/null and b/content/posts/2023/02/02/firefox-profiler-beyond-the-web/jfrplugin_context_menu-397c6365.jpg differ diff --git a/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.29.52-AM-1024x506.jpg b/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.29.52-AM-1024x506.jpg new file mode 100644 index 000000000..879e1297d Binary files /dev/null and b/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.29.52-AM-1024x506.jpg differ diff --git a/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.29.52-AM-1024x506.png b/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.29.52-AM-1024x506.png deleted file mode 100644 index 5a31eb5cf..000000000 Binary files a/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.29.52-AM-1024x506.png and /dev/null differ diff --git a/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507-1.jpg b/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507-1.jpg new file mode 100644 index 000000000..df6976067 Binary files /dev/null and b/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507-1.jpg differ diff --git a/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507-1.png b/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507-1.png deleted file mode 100644 index 4c6147614..000000000 Binary files a/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507-1.png and /dev/null differ diff --git a/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507.jpg b/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507.jpg new file mode 100644 index 000000000..8151995e0 Binary files /dev/null and b/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507.jpg differ diff --git a/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507.png b/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507.png deleted file mode 100644 index 98e00c094..000000000 Binary files a/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507.png and /dev/null differ diff --git a/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.57-AM-1024x508.jpg b/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.57-AM-1024x508.jpg new file mode 100644 index 000000000..18e492ed1 Binary files /dev/null and b/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.57-AM-1024x508.jpg differ diff --git a/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.57-AM-1024x508.png b/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.57-AM-1024x508.png deleted file mode 100644 index 2c9d04a33..000000000 Binary files a/content/posts/2023/02/02/why-core-to-core-latency-matters/Screen-Shot-2023-01-24-at-9.30.57-AM-1024x508.png and /dev/null differ diff --git a/content/posts/2023/02/02/why-core-to-core-latency-matters/index.md b/content/posts/2023/02/02/why-core-to-core-latency-matters/index.md index 05419595a..ef737bee5 100644 --- a/content/posts/2023/02/02/why-core-to-core-latency-matters/index.md +++ b/content/posts/2023/02/02/why-core-to-core-latency-matters/index.md @@ -5,7 +5,7 @@ lastmod: "2023-02-03T10:43:06+00:00" description: "An initial goal of Java was to “write once, run anywhere”, but does that mean we should not be sympathetic to the hardware?" authors: - "rob-austin" -image: "Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507-1.png" +image: "Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507-1.jpg" categories: - "Performance" related_posts: @@ -45,13 +45,13 @@ AMD architecture differs from Intel by introducing core complexes (CCX) which ar The following heatmaps show the latency when exchanging data between a pair of threads running on different cores, colour-coded with the lowest numbers green, and moving through yellow to red for the highest numbers. All three heatmaps use the same scale. **Intel Xeon Gold 6346 (2×16 core)** -![](Screen-Shot-2023-01-24-at-9.29.52-AM-1024x506.png) +![](Screen-Shot-2023-01-24-at-9.29.52-AM-1024x506.jpg) **AMD EPYC 7343 (2×16 core, 4-core CCX)** -![](Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507.png) +![](Screen-Shot-2023-01-24-at-9.30.29-AM-1024x507.jpg) **AMD EPYC 73F3 (2×16 core, 2-core CCX)** -![](Screen-Shot-2023-01-24-at-9.30.57-AM-1024x508.png) +![](Screen-Shot-2023-01-24-at-9.30.57-AM-1024x508.jpg) ### Conclusion diff --git a/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/Screenshot-2023-01-27-at-12.34.45-1-2000-1c2d7b87.jpg b/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/Screenshot-2023-01-27-at-12.34.45-1-2000-1c2d7b87.jpg new file mode 100644 index 000000000..142e3bc3c Binary files /dev/null and b/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/Screenshot-2023-01-27-at-12.34.45-1-2000-1c2d7b87.jpg differ diff --git a/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/file_format-3eed3975.jpg b/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/file_format-3eed3975.jpg new file mode 100644 index 000000000..548e58cd7 Binary files /dev/null and b/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/file_format-3eed3975.jpg differ diff --git a/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/image-3-2000x309-e9b25063.jpg b/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/image-3-2000x309-e9b25063.jpg new file mode 100644 index 000000000..fa4c4c4e6 Binary files /dev/null and b/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/image-3-2000x309-e9b25063.jpg differ diff --git a/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/image-4-2000x64-5e579778.png b/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/image-4-2000x64-5e579778.png new file mode 100644 index 000000000..96f1986fa Binary files /dev/null and b/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/image-4-2000x64-5e579778.png differ diff --git a/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/index.md b/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/index.md index c8c26e8cf..e64417a8d 100644 --- a/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/index.md +++ b/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/index.md @@ -20,7 +20,7 @@ frozen: false *This blog post is the base for the second half of my upcoming talk at FOSDEM 2023 on the topic "[Firefox Profiler beyond the web: Using Firefox Profiler to view Java profiling data](http://%22https://fosdem.org/2023/schedule/event/mozilla_firefox_profiler_beyond_the_web/)."* I detailed in [my last blog post](https://mostlynerdless.de/?p=628) how the Firefox Profiler can be used to view Java profiling data: -![](https://mostlynerdless.de/wp-content/uploads/2023/01/Screenshot-2023-01-27-at-12.34.45-1-2000x1201.png) +![](Screenshot-2023-01-27-at-12.34.45-1-2000-1c2d7b87.jpg) But I'm of course not the only one who uses Firefox Profiler beyond the web because using it has many advantages: You're essentially getting a prototypical visualization for your data in an afternoon. @@ -57,7 +57,7 @@ There are also non-open source uses of Firefox Profiler, Luís Oliveira, for exa I hope I convinced you that the Firefox Profiler is really great for visualizing profiling data, even if this data comes from the world beyond web UIs. If not, please read [my previous article](https://mostlynerdless.de/?p=628). The main part of adapting to Firefox Profiler is to convert your data into the profiler format. The data is stored as JSON in a (optionally zipped) file and can be loaded into Firefox Profiler. See [Loading in profiles from various sources](https://github.com/firefox-devtools/profiler/blob/main/docs-developer/loading-in-profiles.md) for more information. The basic structure of a tool using Firefox Profiler can be as follows, using my plugin as an example: -![](https://mostlynerdless.de/wp-content/uploads/2023/01/structure2-2000x1123.png) +![](structure2-2000x1123-a3bc6c3e.jpg) You have a converter from your profile format to the Firefox Profiler format. The converted file is then passed to the Firefox Profiler, either from [profiler.firefox.com](https://profiler.firefox.com) or a custom fork. You typically then wrap your UI and the converter, hosting both on a small webserver. This web server runs then on e.g. localhost. Hosting your own Firefox Profiler instance has two main advantages: First, you have always a tested combination of Firefox Profiler and Converter. Second, it works offline. The web server can then be embedded into a larger application, showing the UI using an embedded browser. @@ -68,14 +68,14 @@ The type definitions are written with flow. It is helpful to read its documentat ### Layout A short interlude: The layout of Firefox Profiler consists basically of a timeline view and a methods and timing view: -![](https://mostlynerdless.de/wp-content/uploads/2023/01/layout.png) +![](layout-00f5a821.jpg) The timeline allows you to select specific threads and a time slice to view the details in the detail section below the timeline. ### Overview The following shows the main components of the profile format, omitting and summarizing many properties. This diagram should give a rough overview of what comes next: -![](https://mostlynerdless.de/wp-content/uploads/2023/01/file_format.png) +![](file_format-3eed3975.jpg) ### Profile @@ -170,7 +170,7 @@ type Category = {| Categories are referenced by their index in the category list of the `ProfileMeta` data structure and subcategories by their index in the field of their parent category. The categories are used to assign a color to the squares in front of the method names and give more information on every call tree node in the sidebar: -![](https://mostlynerdless.de/wp-content/uploads/2023/01/image-3-2000x309.png) +![](image-3-2000x309-e9b25063.jpg) Now to the individual threads: @@ -247,7 +247,7 @@ SamplesTable = { ``` Filling the `threadCPUDelta` property allows you to specify the CPU time a thread has used since the last sample. The Firefox Profiler uses this property to show the CPU usage curves in the timeline: -![](https://mostlynerdless.de/wp-content/uploads/2023/01/image-4-2000x64.png) +![](image-4-2000x64-5e579778.png) ### Stack Table diff --git a/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/layout-00f5a821.jpg b/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/layout-00f5a821.jpg new file mode 100644 index 000000000..95b64f490 Binary files /dev/null and b/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/layout-00f5a821.jpg differ diff --git a/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/structure2-2000x1123-a3bc6c3e.jpg b/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/structure2-2000x1123-a3bc6c3e.jpg new file mode 100644 index 000000000..22b09f9d9 Binary files /dev/null and b/content/posts/2023/02/03/using-firefox-profiler-beyond-the-web/structure2-2000x1123-a3bc6c3e.jpg differ diff --git a/content/posts/2023/02/03/what-should-i-know-about-garbage-collection-as-a-java-developer/2022-Nov-Performance-TwoOutOfThree-7643e571.jpg b/content/posts/2023/02/03/what-should-i-know-about-garbage-collection-as-a-java-developer/2022-Nov-Performance-TwoOutOfThree-7643e571.jpg new file mode 100644 index 000000000..bb2cb506b Binary files /dev/null and b/content/posts/2023/02/03/what-should-i-know-about-garbage-collection-as-a-java-developer/2022-Nov-Performance-TwoOutOfThree-7643e571.jpg differ diff --git a/content/posts/2023/02/03/what-should-i-know-about-garbage-collection-as-a-java-developer/2022-Nov-Performance-Young-Old-Generatio-e909aece.jpg b/content/posts/2023/02/03/what-should-i-know-about-garbage-collection-as-a-java-developer/2022-Nov-Performance-Young-Old-Generatio-e909aece.jpg new file mode 100644 index 000000000..7f58b4da6 Binary files /dev/null and b/content/posts/2023/02/03/what-should-i-know-about-garbage-collection-as-a-java-developer/2022-Nov-Performance-Young-Old-Generatio-e909aece.jpg differ diff --git a/content/posts/2023/02/03/what-should-i-know-about-garbage-collection-as-a-java-developer/garbage-collectors-table-a4b7857b.png b/content/posts/2023/02/03/what-should-i-know-about-garbage-collection-as-a-java-developer/garbage-collectors-table-a4b7857b.png new file mode 100644 index 000000000..f0b5391ff Binary files /dev/null and b/content/posts/2023/02/03/what-should-i-know-about-garbage-collection-as-a-java-developer/garbage-collectors-table-a4b7857b.png differ diff --git a/content/posts/2023/02/03/what-should-i-know-about-garbage-collection-as-a-java-developer/index.md b/content/posts/2023/02/03/what-should-i-know-about-garbage-collection-as-a-java-developer/index.md index 16cda3cab..c665ef0b3 100644 --- a/content/posts/2023/02/03/what-should-i-know-about-garbage-collection-as-a-java-developer/index.md +++ b/content/posts/2023/02/03/what-should-i-know-about-garbage-collection-as-a-java-developer/index.md @@ -112,14 +112,14 @@ In many cases, the Old generation is larger than the Young generation, but not a In region-based generational collectors (C4 and G1), the size of the generations is fluid and elastic. Most of the regions could be the Young generation, or most could be the Old generation. In collectors like CMS, Parallel, and Serial, the boundary between the two generations was fixed, and the ratio between new and old generation sizes may have to be tuned. The following diagram illustrates how a typical Young generation GC cleans and moves objects when the Eden space gets filled up. New objects get allocated into the Eden space until it fills up. During the GC, live objects (reachable objects) in the Eden and Survivor space are copied to the other Survivor space. If any objects become "old enough," they are copied to the Old generation (i.e. they are tenured). -![Diagram: how a typical Young generation GC cleans and moves objects when the Eden space gets filled up. New objects get allocated into the Eden space until it fills up.](https://www.azul.com/wp-content/uploads/2022-Nov-Performance-Young-Old-Generation.jpg) +![Diagram: how a typical Young generation GC cleans and moves objects when the Eden space gets filled up. New objects get allocated into the Eden space until it fills up.](2022-Nov-Performance-Young-Old-Generatio-e909aece.jpg) You can take advantage of the young generation system by focusing on local variables within methods that have a short lifetime so the GC can focus on a subset of the heap that can quickly be handled. ## Types of Java Garbage Collectors Just like Java-the-language has evolved, the runtime and tools have evolved a lot, and different GCs have been part of the JRE. -![](https://www.azul.com/wp-content/uploads/garbage-collectors-table.png) Table overview of the different Garbage Collectors in Java +![](garbage-collectors-table-a4b7857b.png) Table overview of the different Garbage Collectors in Java {{< img src="deepak-sreedhar.png" alt="" class="alignleft quote-portrait" width="96" height="96" >}} @@ -185,7 +185,7 @@ In IT project management, there is a famous rule: "You need to choose between sp * Very high throughput * Lowest resource usage (CPU and memory) -![You need to pick two of the following: very low latency, very high throughput, or lowest resource usage.](https://www.azul.com/wp-content/uploads/2022-Nov-Performance-TwoOutOfThree.jpg) +![You need to pick two of the following: very low latency, very high throughput, or lowest resource usage.](2022-Nov-Performance-TwoOutOfThree-7643e571.jpg) But there is actually a fourth element we should add here: "Good Engineering!" Azul Platform Prime is living proof that there is no need to make those trade-offs. Only one example is the concurrency in the [C4 Garbage Collector](https://www.azul.com/products/components/pgc/), which is fundamentally more efficient compared to the traditional Stop-The-World GCs. diff --git a/content/posts/2023/02/06/foojay-io-at-fosdem-2023-trip-report/image-2-870x1024.jpg b/content/posts/2023/02/06/foojay-io-at-fosdem-2023-trip-report/image-2-870x1024.jpg new file mode 100644 index 000000000..2e4a2760f Binary files /dev/null and b/content/posts/2023/02/06/foojay-io-at-fosdem-2023-trip-report/image-2-870x1024.jpg differ diff --git a/content/posts/2023/02/06/foojay-io-at-fosdem-2023-trip-report/image-2-870x1024.png b/content/posts/2023/02/06/foojay-io-at-fosdem-2023-trip-report/image-2-870x1024.png deleted file mode 100644 index 354af85ad..000000000 Binary files a/content/posts/2023/02/06/foojay-io-at-fosdem-2023-trip-report/image-2-870x1024.png and /dev/null differ diff --git a/content/posts/2023/02/06/foojay-io-at-fosdem-2023-trip-report/index.md b/content/posts/2023/02/06/foojay-io-at-fosdem-2023-trip-report/index.md index 8da5dc47d..c365f7139 100644 --- a/content/posts/2023/02/06/foojay-io-at-fosdem-2023-trip-report/index.md +++ b/content/posts/2023/02/06/foojay-io-at-fosdem-2023-trip-report/index.md @@ -44,7 +44,7 @@ The program was split more or less into sections, the initial topics focusing mo There were also stickers, which hundreds must have received, they were going around the room, and there were none left by the end of it, designed by Gerrit Grunwald... -{{< img src="image-2-870x1024.png" class="size-large is-resized" width="277" height="325" >}} +{{< img src="image-2-870x1024.jpg" class="size-large is-resized" width="277" height="325" >}} ...and maybe next time there should be hats and t-shirts too! diff --git a/content/posts/2023/02/06/foojay-podcast-13/denver-and-boulder-jug-guests-1024x394-1.jpg b/content/posts/2023/02/06/foojay-podcast-13/denver-and-boulder-jug-guests-1024x394-1.jpg new file mode 100644 index 000000000..e542b2c0c Binary files /dev/null and b/content/posts/2023/02/06/foojay-podcast-13/denver-and-boulder-jug-guests-1024x394-1.jpg differ diff --git a/content/posts/2023/02/06/foojay-podcast-13/denver-and-boulder-jug-guests-1024x394-1.png b/content/posts/2023/02/06/foojay-podcast-13/denver-and-boulder-jug-guests-1024x394-1.png deleted file mode 100644 index 133900cb2..000000000 Binary files a/content/posts/2023/02/06/foojay-podcast-13/denver-and-boulder-jug-guests-1024x394-1.png and /dev/null differ diff --git a/content/posts/2023/02/06/foojay-podcast-13/index.md b/content/posts/2023/02/06/foojay-podcast-13/index.md index 33ebbed2c..67a9e60d1 100644 --- a/content/posts/2023/02/06/foojay-podcast-13/index.md +++ b/content/posts/2023/02/06/foojay-podcast-13/index.md @@ -5,7 +5,7 @@ lastmod: "2025-11-13T09:15:59+00:00" description: "Last month we were in Dubai... and now we are on the other side of the world in the US to meet the people behind the Denver and Boulder JUG." authors: - "frankdelporte" -image: "denver-and-boulder-jug-guests-1024x394-1.png" +image: "denver-and-boulder-jug-guests-1024x394-1.jpg" categories: - "JUGs" - "Podcast" diff --git a/content/posts/2023/02/08/jfr-timestamps-and-system-nanotime/index.md b/content/posts/2023/02/08/jfr-timestamps-and-system-nanotime/index.md index 5171e45be..81311a14a 100644 --- a/content/posts/2023/02/08/jfr-timestamps-and-system-nanotime/index.md +++ b/content/posts/2023/02/08/jfr-timestamps-and-system-nanotime/index.md @@ -5,7 +5,7 @@ lastmod: "2023-02-08T15:33:35+00:00" description: "Did you ever wonder whether JFR timestamps use the same time source as System.nanoTime? Come down the rabbit hole with me!" authors: - "johannes-bechberger" -image: "jfr.png" +image: "jfr.jpg" categories: - "JDK Flight Recorder" - "Performance" diff --git a/content/posts/2023/02/08/jfr-timestamps-and-system-nanotime/jfr.jpg b/content/posts/2023/02/08/jfr-timestamps-and-system-nanotime/jfr.jpg new file mode 100644 index 000000000..bf94413a7 Binary files /dev/null and b/content/posts/2023/02/08/jfr-timestamps-and-system-nanotime/jfr.jpg differ diff --git a/content/posts/2023/02/08/jfr-timestamps-and-system-nanotime/jfr.png b/content/posts/2023/02/08/jfr-timestamps-and-system-nanotime/jfr.png deleted file mode 100644 index 9506076f0..000000000 Binary files a/content/posts/2023/02/08/jfr-timestamps-and-system-nanotime/jfr.png and /dev/null differ diff --git a/content/posts/2023/02/09/how-gradle-works-startup/client-daemon-3d484e1a.png b/content/posts/2023/02/09/how-gradle-works-startup/client-daemon-3d484e1a.png new file mode 100644 index 000000000..ebe9c7824 Binary files /dev/null and b/content/posts/2023/02/09/how-gradle-works-startup/client-daemon-3d484e1a.png differ diff --git a/content/posts/2023/02/09/how-gradle-works-startup/ide-tapi-daemon-5ca5f9cc.png b/content/posts/2023/02/09/how-gradle-works-startup/ide-tapi-daemon-5ca5f9cc.png new file mode 100644 index 000000000..577bb2489 Binary files /dev/null and b/content/posts/2023/02/09/how-gradle-works-startup/ide-tapi-daemon-5ca5f9cc.png differ diff --git a/content/posts/2023/02/09/how-gradle-works-startup/index.md b/content/posts/2023/02/09/how-gradle-works-startup/index.md index 21baec258..3fe2d3f66 100644 --- a/content/posts/2023/02/09/how-gradle-works-startup/index.md +++ b/content/posts/2023/02/09/how-gradle-works-startup/index.md @@ -6,7 +6,7 @@ description: "This is the first of a series on how Gradle works! For example, ho canonical: "https://blog.gradle.org/how-gradle-works-1" authors: - "bo-zhang" -image: "local-distribution-startup.png" +image: "local-distribution-startup.jpg" categories: - "Gradle" - "Java Core" @@ -55,7 +55,7 @@ So the script's job is simple: it finds the `java` command, determines the param `exec` executes a command in the same process, i.e. replaces the current process with a JVM process. -![](https://blog.gradle.org/images/how-gradle-works/local-distribution-startup.png) +![](local-distribution-startup.jpg) The entry point of `Gradle Client JVM` is [`org.gradle.launcher.GradleMain` class](https://github.com/gradle/gradle/blob/acc6044325b11874e9626d98dec976a0e495cb62/subprojects/bootstrap/src/main/java/org/gradle/launcher/GradleMain.java). @@ -71,17 +71,17 @@ Later, 2. The `Gradle Daemon JVM` runs the build, and sends output (stdout/stderr) back to the `Gradle Client JVM`. 3. After the build finishes, the `Gradle Client JVM` will exit, but the `Gradle Daemon JVM` may stay running for some time. -![](https://blog.gradle.org/images/how-gradle-works/client-daemon.png) +![](client-daemon-3d484e1a.png) However, there is one exception for this workflow. If you pass `--no-daemon` to the Gradle build, the client JVM may convert itself into a daemon JVM if it is [compatible with build requirements](https://docs.gradle.org/current/userguide/gradle_daemon.html#compatibility). In this case, there is no daemon, no communication, no input/output forwarding at all - the build happens inside the single JVM: -![](https://blog.gradle.org/images/how-gradle-works/no-daemon.png) +![](no-daemon-51ddc5f4.png) But if `--no-daemon` is present and the client JVM is not compatible with build requirements, a new disposable JVM will still be started for the build and exit at the end of the build: -![](https://blog.gradle.org/images/how-gradle-works/no-daemon-not-compatible.png) +![](no-daemon-not-compatible-f89eb7bc.png) This is how local Gradle distribution starts up on UNIX OSes. On Windows, the mechanism is very similar - the only difference is that we invoke `/path/to/distribution/bin/gradle.bat` instead of `/path/to/distribution/bin/gradle`. @@ -95,7 +95,7 @@ If you open `gradlew` in a text editor, you'll find it very similar to what we h This JVM will locate or download a specific version of Gradle distribution declared in `gradle/wrapper/gradle-wrapper.properties`, then it will start Gradle inside the same JVM via Java reflection. After that, this tiny JVM acts as the `Gradle Client JVM `in the way explained in the last section. -![](https://blog.gradle.org/images/how-gradle-works/wrapper-daemon.png) +![](wrapper-daemon-19584a15.png) The entry point of `Gradle Wrapper JVM` is the [`org.gradle.wrapper.GradleWrapperMain` class](https://github.com/gradle/gradle/blob/acc6044325b11874e9626d98dec976a0e495cb62/subprojects/wrapper/src/main/java/org/gradle/wrapper/GradleWrapperMain.java). @@ -109,7 +109,7 @@ Gradle client can be a part of another JVM, i.e. a JVM that loads some Gradle ja This programmatic API is called [Tooling API](https://docs.gradle.org/current/userguide/third_party_integration.html#embedding). -![](https://blog.gradle.org/images/how-gradle-works/ide-tapi-daemon.png) +![](ide-tapi-daemon-5ca5f9cc.png) For example, when you click `Gradle Sync` button in IntelliJ IDEA, IDEA will start a special Gradle build to fetch necessary information (project structure, dependencies, tasks, etc.) of the project via the Tooling API. diff --git a/content/posts/2023/02/09/how-gradle-works-startup/local-distribution-startup.jpg b/content/posts/2023/02/09/how-gradle-works-startup/local-distribution-startup.jpg new file mode 100644 index 000000000..563b85cf6 Binary files /dev/null and b/content/posts/2023/02/09/how-gradle-works-startup/local-distribution-startup.jpg differ diff --git a/content/posts/2023/02/09/how-gradle-works-startup/local-distribution-startup.png b/content/posts/2023/02/09/how-gradle-works-startup/local-distribution-startup.png deleted file mode 100644 index f91305f28..000000000 Binary files a/content/posts/2023/02/09/how-gradle-works-startup/local-distribution-startup.png and /dev/null differ diff --git a/content/posts/2023/02/09/how-gradle-works-startup/no-daemon-51ddc5f4.png b/content/posts/2023/02/09/how-gradle-works-startup/no-daemon-51ddc5f4.png new file mode 100644 index 000000000..a8a30d2ec Binary files /dev/null and b/content/posts/2023/02/09/how-gradle-works-startup/no-daemon-51ddc5f4.png differ diff --git a/content/posts/2023/02/09/how-gradle-works-startup/no-daemon-not-compatible-f89eb7bc.png b/content/posts/2023/02/09/how-gradle-works-startup/no-daemon-not-compatible-f89eb7bc.png new file mode 100644 index 000000000..054cd554f Binary files /dev/null and b/content/posts/2023/02/09/how-gradle-works-startup/no-daemon-not-compatible-f89eb7bc.png differ diff --git a/content/posts/2023/02/09/how-gradle-works-startup/wrapper-daemon-19584a15.png b/content/posts/2023/02/09/how-gradle-works-startup/wrapper-daemon-19584a15.png new file mode 100644 index 000000000..5ccad77b2 Binary files /dev/null and b/content/posts/2023/02/09/how-gradle-works-startup/wrapper-daemon-19584a15.png differ diff --git a/content/posts/2023/02/13/null-safety-kotlin-vs-java/index.md b/content/posts/2023/02/13/null-safety-kotlin-vs-java/index.md index 2d6a8351f..cee506f7b 100644 --- a/content/posts/2023/02/13/null-safety-kotlin-vs-java/index.md +++ b/content/posts/2023/02/13/null-safety-kotlin-vs-java/index.md @@ -170,7 +170,7 @@ However, different libraries work in different ways: Thanks to [Sébastien Deleuze](https://mastodon.online/@sdeleuze) for mentioning [JSpecify](https://jspecify.dev/), which I didn't know previously. It's an [industry-wide effort](https://jspecify.dev/about) to deal with the current mess. Of course, the famous XKCD comic immediately comes to mind: -![How standards proliferate by XKCD](https://imgs.xkcd.com/comics/standards.png) +![How standards proliferate by XKCD](standards-d3945873.png) I still hope it will work out! diff --git a/content/posts/2023/02/13/null-safety-kotlin-vs-java/standards-d3945873.png b/content/posts/2023/02/13/null-safety-kotlin-vs-java/standards-d3945873.png new file mode 100644 index 000000000..5d3830377 Binary files /dev/null and b/content/posts/2023/02/13/null-safety-kotlin-vs-java/standards-d3945873.png differ diff --git a/content/posts/2023/02/13/package-checker-find-fix-vulnerabilities-with-intellij-idea-ultimate/index.md b/content/posts/2023/02/13/package-checker-find-fix-vulnerabilities-with-intellij-idea-ultimate/index.md index d2dd22494..a5e073ec9 100644 --- a/content/posts/2023/02/13/package-checker-find-fix-vulnerabilities-with-intellij-idea-ultimate/index.md +++ b/content/posts/2023/02/13/package-checker-find-fix-vulnerabilities-with-intellij-idea-ultimate/index.md @@ -71,7 +71,7 @@ We can also open the Vulnerable Dependencies tool window without having to open To open the Vulnerable Dependencies tool window straight from the main menu, go to **Code** \> **Analyze Code** \> **Show Vulnerable Dependencies**. -[![Open Vulnerable Dependencies tool window from menu](open-from-menu.png "Open Vulnerable Dependencies tool window from menu")](open-from-menu.png "Open Vulnerable Dependencies tool window from menu") +[![Open Vulnerable Dependencies tool window from menu](open-from-menu.jpg "Open Vulnerable Dependencies tool window from menu")](open-from-menu.jpg "Open Vulnerable Dependencies tool window from menu") The Vulnerable Dependencies tool window shows all the vulnerable dependencies for the project. For each vulnerability, we can see an indication of the severity. diff --git a/content/posts/2023/02/13/package-checker-find-fix-vulnerabilities-with-intellij-idea-ultimate/open-from-menu.jpg b/content/posts/2023/02/13/package-checker-find-fix-vulnerabilities-with-intellij-idea-ultimate/open-from-menu.jpg new file mode 100644 index 000000000..24c08fc84 Binary files /dev/null and b/content/posts/2023/02/13/package-checker-find-fix-vulnerabilities-with-intellij-idea-ultimate/open-from-menu.jpg differ diff --git a/content/posts/2023/02/13/package-checker-find-fix-vulnerabilities-with-intellij-idea-ultimate/open-from-menu.png b/content/posts/2023/02/13/package-checker-find-fix-vulnerabilities-with-intellij-idea-ultimate/open-from-menu.png deleted file mode 100644 index 634f33634..000000000 Binary files a/content/posts/2023/02/13/package-checker-find-fix-vulnerabilities-with-intellij-idea-ultimate/open-from-menu.png and /dev/null differ diff --git a/content/posts/2023/02/17/moving-security-into-the-jvm/Screen-Shot-2022-10-25-at-8.33.15-PM-102-64913526.jpg b/content/posts/2023/02/17/moving-security-into-the-jvm/Screen-Shot-2022-10-25-at-8.33.15-PM-102-64913526.jpg new file mode 100644 index 000000000..e1a2e6048 Binary files /dev/null and b/content/posts/2023/02/17/moving-security-into-the-jvm/Screen-Shot-2022-10-25-at-8.33.15-PM-102-64913526.jpg differ diff --git a/content/posts/2023/02/17/moving-security-into-the-jvm/avd-how-it-works-cropped-1024x706-a572fd91.jpg b/content/posts/2023/02/17/moving-security-into-the-jvm/avd-how-it-works-cropped-1024x706-a572fd91.jpg new file mode 100644 index 000000000..5bd54c1aa Binary files /dev/null and b/content/posts/2023/02/17/moving-security-into-the-jvm/avd-how-it-works-cropped-1024x706-a572fd91.jpg differ diff --git a/content/posts/2023/02/17/moving-security-into-the-jvm/index.md b/content/posts/2023/02/17/moving-security-into-the-jvm/index.md index 1e860c092..595bfd99c 100644 --- a/content/posts/2023/02/17/moving-security-into-the-jvm/index.md +++ b/content/posts/2023/02/17/moving-security-into-the-jvm/index.md @@ -28,7 +28,7 @@ For those who attack Java applications, their job has actually become easier. [E These modern attack payloads target the libraries themselves, not just the JVM. As [applets and client technologies have been deprecated](https://www.testingdocs.com/questions/java-applets-are-depricated/), the JVM's overall attack surface has gone down while the attack surface of libraries has gone up. Examples of Java library and application vulnerabilities in the last year include [OGNL injection](https://securitynews.sonicwall.com/xmlpost/atlassian-confluence-and-data-center-ognl-injection-vulnerability/#:~:text=An%20OGNL%20injection%20vulnerability%20exists%20in%20Atlassian%20Confluence.,string%20literal%20and%20append%20an%20arbitrary%20OGNL%20expression.) against a major application, [Log4J JNDI injections](https://www.cisa.gov/uscert/apache-log4j-vulnerability-guidance) against many application, and [Psychic Signatures](https://neilmadden.blog/2022/04/19/psychic-signatures-in-java/) attacks against cryptographic trust. -![Graphic: Existing approaches are valuable but leave a critical security in the JVM gap in secure supply chain strategy.](https://www.azul.com/wp-content/uploads/Screen-Shot-2022-10-25-at-8.33.15-PM-1024x516.png) Existing approaches are valuable but leave a critical gap in secure supply chain strategy. +![Graphic: Existing approaches are valuable but leave a critical security in the JVM gap in secure supply chain strategy.](Screen-Shot-2022-10-25-at-8.33.15-PM-102-64913526.jpg) Existing approaches are valuable but leave a critical gap in secure supply chain strategy. After more than 26 years of Java, there are so many active Java applications that organizations have difficulty tracking them. With the rise of attacks against libraries, teams are being asked to track and inventory the libraries that each application uses. @@ -81,7 +81,7 @@ The ultimate goal is to answer three questions: Using Azul Vulnerability Detection is simple – it's part of the JDK so there's nothing additional to install. You can turn it on locally via command flags or environment variables, or at scale through DNS. Flags offer direct control, DNS offers scale to engage JVMs that you cannot easily touch, such as vendor applications or existing containers. -![How Azul Vulnerability Detection works to provide security in the JVM.](https://www.azul.com/wp-content/uploads/avd-how-it-works-cropped-1024x706.png) +![How Azul Vulnerability Detection works to provide security in the JVM.](avd-how-it-works-cropped-1024x706-a572fd91.jpg) Each Azul JVM contains a low-overhead worker that communicates JVM-level information to a local connection manager (the Forwarder). The Forwarder helps encrypt all information and offloads cloud-connection overhead and firewall tuning from the JVMs, allowing them to operate at peak speed. diff --git a/content/posts/2023/02/20/foojay-podcast-14/index.md b/content/posts/2023/02/20/foojay-podcast-14/index.md index 9b0e4df4f..23257c62f 100644 --- a/content/posts/2023/02/20/foojay-podcast-14/index.md +++ b/content/posts/2023/02/20/foojay-podcast-14/index.md @@ -9,7 +9,7 @@ authors: - "marit-van-dijk" - "shai-almog" - "ties-van-de-ven" -image: "podcast-debugging-guests.png" +image: "podcast-debugging-guests.jpg" categories: - "Developer Tools" - "Java Core" diff --git a/content/posts/2023/02/20/foojay-podcast-14/podcast-debugging-guests.jpg b/content/posts/2023/02/20/foojay-podcast-14/podcast-debugging-guests.jpg new file mode 100644 index 000000000..d68fd798f Binary files /dev/null and b/content/posts/2023/02/20/foojay-podcast-14/podcast-debugging-guests.jpg differ diff --git a/content/posts/2023/02/20/foojay-podcast-14/podcast-debugging-guests.png b/content/posts/2023/02/20/foojay-podcast-14/podcast-debugging-guests.png deleted file mode 100644 index 1ae24b914..000000000 Binary files a/content/posts/2023/02/20/foojay-podcast-14/podcast-debugging-guests.png and /dev/null differ diff --git a/content/posts/2023/02/23/should-you-update-java-or-upgrade-and-which-version-should-you-use/FY23-Q4-Oracle-Compete-Educate-Java-Main-9ad031ef.jpg b/content/posts/2023/02/23/should-you-update-java-or-upgrade-and-which-version-should-you-use/FY23-Q4-Oracle-Compete-Educate-Java-Main-9ad031ef.jpg new file mode 100644 index 000000000..94071d2b2 Binary files /dev/null and b/content/posts/2023/02/23/should-you-update-java-or-upgrade-and-which-version-should-you-use/FY23-Q4-Oracle-Compete-Educate-Java-Main-9ad031ef.jpg differ diff --git a/content/posts/2023/02/23/should-you-update-java-or-upgrade-and-which-version-should-you-use/index.md b/content/posts/2023/02/23/should-you-update-java-or-upgrade-and-which-version-should-you-use/index.md index 4ce254dbe..f01169016 100644 --- a/content/posts/2023/02/23/should-you-update-java-or-upgrade-and-which-version-should-you-use/index.md +++ b/content/posts/2023/02/23/should-you-update-java-or-upgrade-and-which-version-should-you-use/index.md @@ -187,7 +187,7 @@ But once you have deployed a particular release, updating to newer versions beco Andrew Brygin, Staff Software Engineer, Azul Let's take a look at an example based on the [October 2022 Release Notes of Azul Zulu Builds of OpenJDK](https://docs.azul.com/core/zulu-openjdk/release-notes/october-2022). -![CHART: Quarterly release update for Azul Zulu Builds of OpenJDK version 19, 17, 15 13, 11, 8, 7, and 6.](https://www.azul.com/wp-content/uploads/FY23-Q4-Oracle-Compete-Educate-Java-Maintenance-pt2-table.png) *Versions info for Java 11 till 19 in the Azul Zulu Builds of OpenJDK Release Notes of October 2022* +![CHART: Quarterly release update for Azul Zulu Builds of OpenJDK version 19, 17, 15 13, 11, 8, 7, and 6.](FY23-Q4-Oracle-Compete-Educate-Java-Main-9ad031ef.jpg) *Versions info for Java 11 till 19 in the Azul Zulu Builds of OpenJDK Release Notes of October 2022* ## The Shortest Path to Deploying CVE Fixes in Your Environment diff --git a/content/posts/2023/02/24/porting-an-existing-javafx-app-to-ios/index.md b/content/posts/2023/02/24/porting-an-existing-javafx-app-to-ios/index.md index 316e41a0e..6eb3b4469 100644 --- a/content/posts/2023/02/24/porting-an-existing-javafx-app-to-ios/index.md +++ b/content/posts/2023/02/24/porting-an-existing-javafx-app-to-ios/index.md @@ -24,7 +24,7 @@ To give you an idea, I will take my little game called JArkanoid (a clone of the Here is a screenshot from one level to give you an idea: -![Games](https://github.com/HanSolo/jarkanoid/blob/main/resources/level1.png?raw=true) +![Games](level1-a2775c36.png) I wrote this game mainly by watching a video on YouTube that showed the original game from 1986. diff --git a/content/posts/2023/02/24/porting-an-existing-javafx-app-to-ios/level1-a2775c36.png b/content/posts/2023/02/24/porting-an-existing-javafx-app-to-ios/level1-a2775c36.png new file mode 100644 index 000000000..dc5c0a464 Binary files /dev/null and b/content/posts/2023/02/24/porting-an-existing-javafx-app-to-ios/level1-a2775c36.png differ diff --git a/content/posts/2023/02/28/javafx-links-of-february-2023/index.md b/content/posts/2023/02/28/javafx-links-of-february-2023/index.md index 2eba8e23b..43a603b3a 100644 --- a/content/posts/2023/02/28/javafx-links-of-february-2023/index.md +++ b/content/posts/2023/02/28/javafx-links-of-february-2023/index.md @@ -5,7 +5,7 @@ lastmod: "2023-02-28T11:25:04+00:00" description: "A lot of game and 3D development, releases, interesting ongoing development, and so much more to read. Enjoy reading and clicking!" authors: - "frankdelporte" -image: "newreleases.png" +image: "newreleases.jpg" categories: - "JavaFX" - "Release Notes" diff --git a/content/posts/2023/02/28/javafx-links-of-february-2023/newreleases.jpg b/content/posts/2023/02/28/javafx-links-of-february-2023/newreleases.jpg new file mode 100644 index 000000000..e44121414 Binary files /dev/null and b/content/posts/2023/02/28/javafx-links-of-february-2023/newreleases.jpg differ diff --git a/content/posts/2023/02/28/javafx-links-of-february-2023/newreleases.png b/content/posts/2023/02/28/javafx-links-of-february-2023/newreleases.png deleted file mode 100644 index ece214fe3..000000000 Binary files a/content/posts/2023/02/28/javafx-links-of-february-2023/newreleases.png and /dev/null differ diff --git a/content/posts/2023/03/01/do-you-trust-profilers-i-once-did-too/frame_problem-32e9522c.jpg b/content/posts/2023/03/01/do-you-trust-profilers-i-once-did-too/frame_problem-32e9522c.jpg new file mode 100644 index 000000000..04bf6a40f Binary files /dev/null and b/content/posts/2023/03/01/do-you-trust-profilers-i-once-did-too/frame_problem-32e9522c.jpg differ diff --git a/content/posts/2023/03/01/do-you-trust-profilers-i-once-did-too/index.md b/content/posts/2023/03/01/do-you-trust-profilers-i-once-did-too/index.md index 1a4384aa9..b757af65e 100644 --- a/content/posts/2023/03/01/do-you-trust-profilers-i-once-did-too/index.md +++ b/content/posts/2023/03/01/do-you-trust-profilers-i-once-did-too/index.md @@ -123,7 +123,7 @@ public class Main { } ``` -![](https://mostlynerdless.de/wp-content/uploads/2023/02/frame_problem.png) The expected flame graph is on the left (obtained after fixing the bug), and the actual flame graph is on the right. +![](frame_problem-32e9522c.jpg) The expected flame graph is on the left (obtained after fixing the bug), and the actual flame graph is on the right. So the only test case on AsyncGetCallTrace in the OpenJDK did not properly test the whole trace. This was not a problem when the test case was written. One can expect that its author checked the entire stack trace manually once and then created a small check test case to test the first frame, which is not implementation specific. But this is a problem for regression testing: diff --git a/content/posts/2023/03/06/foojay-podcast-15/index.md b/content/posts/2023/03/06/foojay-podcast-15/index.md index 3d92a6460..c5adcc65b 100644 --- a/content/posts/2023/03/06/foojay-podcast-15/index.md +++ b/content/posts/2023/03/06/foojay-podcast-15/index.md @@ -5,7 +5,7 @@ lastmod: "2025-11-13T09:13:40+00:00" description: "Last month we were in the US, and this time we travel to the other side of the world as we spoke with the organizers of the Japan JUG!" authors: - "frankdelporte" -image: "japan-jug-guests-1024x575-1.png" +image: "japan-jug-guests-1024x575-1.jpg" categories: - "JUGs" - "Podcast" diff --git a/content/posts/2023/03/06/foojay-podcast-15/japan-jug-guests-1024x575-1.jpg b/content/posts/2023/03/06/foojay-podcast-15/japan-jug-guests-1024x575-1.jpg new file mode 100644 index 000000000..d61bfcaeb Binary files /dev/null and b/content/posts/2023/03/06/foojay-podcast-15/japan-jug-guests-1024x575-1.jpg differ diff --git a/content/posts/2023/03/06/foojay-podcast-15/japan-jug-guests-1024x575-1.png b/content/posts/2023/03/06/foojay-podcast-15/japan-jug-guests-1024x575-1.png deleted file mode 100644 index 71604c55a..000000000 Binary files a/content/posts/2023/03/06/foojay-podcast-15/japan-jug-guests-1024x575-1.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/anonymous-bookmark.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/anonymous-bookmark.jpg new file mode 100644 index 000000000..090ddfde1 Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/anonymous-bookmark.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/anonymous-bookmark.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/anonymous-bookmark.png deleted file mode 100644 index b28b3213b..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/anonymous-bookmark.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/assign-mnemonic.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/assign-mnemonic.jpg new file mode 100644 index 000000000..ea8610cf8 Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/assign-mnemonic.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/assign-mnemonic.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/assign-mnemonic.png deleted file mode 100644 index ee3c3b848..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/assign-mnemonic.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-open-tabs.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-open-tabs.jpg new file mode 100644 index 000000000..e589764e0 Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-open-tabs.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-open-tabs.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-open-tabs.png deleted file mode 100644 index 7eb406cef..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-open-tabs.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-popup.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-popup.jpg new file mode 100644 index 000000000..8f985410b Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-popup.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-popup.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-popup.png deleted file mode 100644 index d654fdb4e..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-popup.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-project-item.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-project-item.jpg new file mode 100644 index 000000000..50da0c337 Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-project-item.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-project-item.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-project-item.png deleted file mode 100644 index 41c17e353..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/bookmark-project-item.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/breakpoints.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/breakpoints.jpg new file mode 100644 index 000000000..7cfb87965 Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/breakpoints.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/breakpoints.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/breakpoints.png deleted file mode 100644 index 3d26344e0..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/breakpoints.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/create-bookmark-list-popup.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/create-bookmark-list-popup.jpg new file mode 100644 index 000000000..1718b2bac Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/create-bookmark-list-popup.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/create-bookmark-list-popup.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/create-bookmark-list-popup.png deleted file mode 100644 index 7bcb03610..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/create-bookmark-list-popup.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/create-bookmark-list.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/create-bookmark-list.jpg new file mode 100644 index 000000000..655a40059 Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/create-bookmark-list.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/create-bookmark-list.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/create-bookmark-list.png deleted file mode 100644 index 7b5405757..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/create-bookmark-list.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/go-to-bookmark.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/go-to-bookmark.jpg new file mode 100644 index 000000000..e24a15e46 Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/go-to-bookmark.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/go-to-bookmark.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/go-to-bookmark.png deleted file mode 100644 index e96272cbd..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/go-to-bookmark.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/gutter-menu.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/gutter-menu.jpg new file mode 100644 index 000000000..6caf92c5c Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/gutter-menu.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/gutter-menu.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/gutter-menu.png deleted file mode 100644 index 5ee3981cd..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/gutter-menu.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/index.md b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/index.md index 0a0c524bd..15a05612d 100644 --- a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/index.md +++ b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/index.md @@ -33,15 +33,15 @@ This shortcut creates an anonymous line bookmark, marked with a Bookmark icon. If we don't remember the shortcut, we can right-click the gutter next to the line of code we want to bookmark and select **Add Bookmark**. -![Anonymous Bookmark](anonymous-bookmark.png) +![Anonymous Bookmark](anonymous-bookmark.jpg) -![Add bookmark from the gutter](gutter-menu.png) +![Add bookmark from the gutter](gutter-menu.jpg) We can also bookmark files, packages, folders, and modules. We can open the Project Tool Window (**⌘1** on macOS, or **Alt+1** on Windows/Linux) and add an anonymous bookmark. We can use the shortcut (**F3** on macOS, or **F11** on Windows/Linux) or we can also right-click the item we want to bookmark, and select **Bookmarks \| Add Bookmark**. Note that anonymous bookmarks don't have an identifier, and we can create as many anonymous bookmarks as we like. -![Bookmark project item](bookmark-project-item.png) +![Bookmark project item](bookmark-project-item.jpg) ## Add mnemonic bookmarks @@ -57,11 +57,11 @@ Optionally, we can provide a description for the new bookmark. We can double-cli Lines marked with mnemonic bookmarks have the corresponding digit or letter icon in a frame. -![Mnemonic Bookmark](mnemonic-bookmark.png) +![Mnemonic Bookmark](mnemonic-bookmark.jpg) If the selected digit or letter is already in use, IntelliJ IDEA will ask you whether you want to overwrite an existing bookmark with the new one. When we select the **Don't ask again** option, the IDE will silently overwrite mnemonics. -![Rewrite Mnemonic Bookmark](rewrite-mnemonic.png) +![Rewrite Mnemonic Bookmark](rewrite-mnemonic.jpg) ## Navigate to bookmarks @@ -71,15 +71,15 @@ There are several options to navigate to the bookmarks we have created. To see all **line** bookmarks that we have in the code, we can open the **Bookmarks** popup by pressing **⌘ F3** (on macOS) or **Shift+F11** (on Windows/Linux) or go to **Edit \| Bookmarks \| Show Line Bookmarks**. -![Show Line Bookmarks shortcut](show-line-bookmarks-shortcut.png) +![Show Line Bookmarks shortcut](show-line-bookmarks-shortcut.jpg) -![Show Line Bookmarks menu](show-line-bookmarks-menu.png) +![Show Line Bookmarks menu](show-line-bookmarks-menu.jpg) Notice that this list does not contain any project items like files or classes that we have bookmarked. We can select the bookmark we want to navigate to, either with up and down arrows and pressing **Return** (on macOS) or **Enter** (on Windows/Linux), or by double-clicking it with our mouse. For mnemonic bookmarks, we can select the corresponding digit or letter. -![Bookmark popup](bookmark-popup.png) +![Bookmark popup](bookmark-popup.jpg) ### Jump to mnemonic bookmark @@ -89,17 +89,17 @@ This doesn't work with anonymous bookmarks, but we can assign a mnemonic to an e This works in the **Bookmarks** popup too! -![Go to Bookmark](go-to-bookmark.png) +![Go to Bookmark](go-to-bookmark.jpg) -![Assign Mnemonic](assign-mnemonic.png) +![Assign Mnemonic](assign-mnemonic.jpg) ### Bookmarks tool window To see all our bookmarks, we can open the **Bookmarks** tool window by pressing **⌘ 2** (on macOS) or **Alt+2** (on Windows/Linux), or by selecting **View \| Tool Windows \| Bookmarks** from the main menu. -![Open Bookmark Tool Window shortcut](open-bookmarks-tool-window-shortcut.png) +![Open Bookmark Tool Window shortcut](open-bookmarks-tool-window-shortcut.jpg) -![Open Bookmark Tool Window menu](open-bookmarks-tool-window-menu.png) +![Open Bookmark Tool Window menu](open-bookmarks-tool-window-menu.jpg) IntelliJ IDEA adds your bookmarks to the predefined list in the Bookmarks tool window that is created automatically and has the same name as the project. In this example, multiple bookmarks in the same file are grouped together. @@ -113,23 +113,23 @@ Another option we do want to show you here is that you can create more lists. We can add a new list using the shortcut (**⌘ N** on macOS or **Alt+Insert** on Windows/Linux) or by clicking the **Create Bookmark List** button. We can add a name for the new list. -![Create Bookmark List](create-bookmark-list.png) +![Create Bookmark List](create-bookmark-list.jpg) If there are multiple lists, and we create a new bookmark, we can select which list to add it to in the **Add Bookmark** popup. We can also select the list to use as the default by checking the option **Use as default list**. -![Select Bookmark List](select-bookmark-list.png) +![Select Bookmark List](select-bookmark-list.jpg) In the Bookmarks tool window, we can move bookmarks to another list by dragging them to the other list. And we can sort bookmarks by selecting a bookmark and using Move down (**⌥ ⌘ ↓** on macOS, or **Control+Alt+↓** on Windows/Linux) or Move up (**⌥ ⌘ ↑** on macOS, or **Control+Alt+↑** on Windows/Linux). -![Move down](move-down.png) +![Move down](move-down.jpg) **Fun fact:** The Bookmarks tool window also shows all breakpoints that are automatically added to the dedicated list once you place them in your code. -![Breakpoints](breakpoints.png) +![Breakpoints](breakpoints.jpg) ### Bookmark editor tabs @@ -137,9 +137,9 @@ Finally, we can also bookmark editor tabs. Click the **...** to the right of the We can enter a name for this list in the **Create Bookmark List** popup. -![Bookmark Open Tabs](bookmark-open-tabs.png) +![Bookmark Open Tabs](bookmark-open-tabs.jpg) -![Create Bookmark List popup](create-bookmark-list-popup.png) +![Create Bookmark List popup](create-bookmark-list-popup.jpg) ## Summary and Shortcuts diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/mnemonic-bookmark.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/mnemonic-bookmark.jpg new file mode 100644 index 000000000..3d2f7764c Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/mnemonic-bookmark.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/mnemonic-bookmark.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/mnemonic-bookmark.png deleted file mode 100644 index a8a49885b..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/mnemonic-bookmark.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/move-down.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/move-down.jpg new file mode 100644 index 000000000..8dfac5eeb Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/move-down.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/move-down.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/move-down.png deleted file mode 100644 index be1e62f5b..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/move-down.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/open-bookmarks-tool-window-menu.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/open-bookmarks-tool-window-menu.jpg new file mode 100644 index 000000000..bc0ee4baa Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/open-bookmarks-tool-window-menu.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/open-bookmarks-tool-window-menu.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/open-bookmarks-tool-window-menu.png deleted file mode 100644 index 59d232ee1..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/open-bookmarks-tool-window-menu.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/open-bookmarks-tool-window-shortcut.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/open-bookmarks-tool-window-shortcut.jpg new file mode 100644 index 000000000..8647e586d Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/open-bookmarks-tool-window-shortcut.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/open-bookmarks-tool-window-shortcut.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/open-bookmarks-tool-window-shortcut.png deleted file mode 100644 index 9e87f122a..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/open-bookmarks-tool-window-shortcut.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/rewrite-mnemonic.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/rewrite-mnemonic.jpg new file mode 100644 index 000000000..6bd051757 Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/rewrite-mnemonic.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/rewrite-mnemonic.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/rewrite-mnemonic.png deleted file mode 100644 index 3bec2fe5e..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/rewrite-mnemonic.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/select-bookmark-list.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/select-bookmark-list.jpg new file mode 100644 index 000000000..af03e6c9d Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/select-bookmark-list.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/select-bookmark-list.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/select-bookmark-list.png deleted file mode 100644 index 30b8e7e65..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/select-bookmark-list.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/show-line-bookmarks-menu.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/show-line-bookmarks-menu.jpg new file mode 100644 index 000000000..6ba5e044a Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/show-line-bookmarks-menu.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/show-line-bookmarks-menu.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/show-line-bookmarks-menu.png deleted file mode 100644 index 0f0a72cd1..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/show-line-bookmarks-menu.png and /dev/null differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/show-line-bookmarks-shortcut.jpg b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/show-line-bookmarks-shortcut.jpg new file mode 100644 index 000000000..5f536a978 Binary files /dev/null and b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/show-line-bookmarks-shortcut.jpg differ diff --git a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/show-line-bookmarks-shortcut.png b/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/show-line-bookmarks-shortcut.png deleted file mode 100644 index 88700d2e8..000000000 Binary files a/content/posts/2023/03/07/using-bookmarks-in-intellij-idea/show-line-bookmarks-shortcut.png and /dev/null differ diff --git a/content/posts/2023/03/09/java-performance-ahead-of-time-versus-just-in-time/chart-speed-optimization-level.jpg b/content/posts/2023/03/09/java-performance-ahead-of-time-versus-just-in-time/chart-speed-optimization-level.jpg new file mode 100644 index 000000000..6033ee71a Binary files /dev/null and b/content/posts/2023/03/09/java-performance-ahead-of-time-versus-just-in-time/chart-speed-optimization-level.jpg differ diff --git a/content/posts/2023/03/09/java-performance-ahead-of-time-versus-just-in-time/chart-speed-optimization-level.png b/content/posts/2023/03/09/java-performance-ahead-of-time-versus-just-in-time/chart-speed-optimization-level.png deleted file mode 100644 index cdb3eb202..000000000 Binary files a/content/posts/2023/03/09/java-performance-ahead-of-time-versus-just-in-time/chart-speed-optimization-level.png and /dev/null differ diff --git a/content/posts/2023/03/09/java-performance-ahead-of-time-versus-just-in-time/index.md b/content/posts/2023/03/09/java-performance-ahead-of-time-versus-just-in-time/index.md index 76e7d4486..79d6796df 100644 --- a/content/posts/2023/03/09/java-performance-ahead-of-time-versus-just-in-time/index.md +++ b/content/posts/2023/03/09/java-performance-ahead-of-time-versus-just-in-time/index.md @@ -6,7 +6,7 @@ description: "The impact of the Just-In-Time (JIT) compiler should not be undere canonical: "https://www.azul.com/blog/jit-performance-ahead-of-time-versus-just-in-time/" authors: - "frankdelporte" -image: "chart-speed-optimization-level.png" +image: "chart-speed-optimization-level.jpg" categories: - "Java Core" - "Performance" diff --git a/content/posts/2023/03/13/from-law-degree-to-java-champion-geertjan-wielenga-on-the-success-of-java-and-navigating-the-software-industry/Wielenga.jpg b/content/posts/2023/03/13/from-law-degree-to-java-champion-geertjan-wielenga-on-the-success-of-java-and-navigating-the-software-industry/Wielenga.jpg new file mode 100644 index 000000000..3527a94dc Binary files /dev/null and b/content/posts/2023/03/13/from-law-degree-to-java-champion-geertjan-wielenga-on-the-success-of-java-and-navigating-the-software-industry/Wielenga.jpg differ diff --git a/content/posts/2023/03/13/from-law-degree-to-java-champion-geertjan-wielenga-on-the-success-of-java-and-navigating-the-software-industry/Wielenga.png b/content/posts/2023/03/13/from-law-degree-to-java-champion-geertjan-wielenga-on-the-success-of-java-and-navigating-the-software-industry/Wielenga.png deleted file mode 100644 index 72e008f78..000000000 Binary files a/content/posts/2023/03/13/from-law-degree-to-java-champion-geertjan-wielenga-on-the-success-of-java-and-navigating-the-software-industry/Wielenga.png and /dev/null differ diff --git a/content/posts/2023/03/13/from-law-degree-to-java-champion-geertjan-wielenga-on-the-success-of-java-and-navigating-the-software-industry/index.md b/content/posts/2023/03/13/from-law-degree-to-java-champion-geertjan-wielenga-on-the-success-of-java-and-navigating-the-software-industry/index.md index 50dc36bbf..0f3f27ce4 100644 --- a/content/posts/2023/03/13/from-law-degree-to-java-champion-geertjan-wielenga-on-the-success-of-java-and-navigating-the-software-industry/index.md +++ b/content/posts/2023/03/13/from-law-degree-to-java-champion-geertjan-wielenga-on-the-success-of-java-and-navigating-the-software-industry/index.md @@ -5,7 +5,7 @@ lastmod: "2023-03-13T17:13:57+00:00" description: "Discover insights from Geertjan Wielenga, a Java Champion and developer advocate, on how to succeed in the software industry and the importance of community involvement in the Java ecosystem." authors: - "bazlur-rahman" -image: "Wielenga.png" +image: "Wielenga.jpg" categories: - "Interviews" related_posts: diff --git a/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/client-connects-to-daemon-2726db30.png b/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/client-connects-to-daemon-2726db30.png new file mode 100644 index 000000000..0f722976e Binary files /dev/null and b/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/client-connects-to-daemon-2726db30.png differ diff --git a/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/configuration-build-script-execution-de5f9f21.jpg b/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/configuration-build-script-execution-de5f9f21.jpg new file mode 100644 index 000000000..80adba641 Binary files /dev/null and b/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/configuration-build-script-execution-de5f9f21.jpg differ diff --git a/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/creating-build-instances-40546b7f.jpg b/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/creating-build-instances-40546b7f.jpg new file mode 100644 index 000000000..ee0f26429 Binary files /dev/null and b/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/creating-build-instances-40546b7f.jpg differ diff --git a/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/daemon-execution-phase-493a3af5.jpg b/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/daemon-execution-phase-493a3af5.jpg new file mode 100644 index 000000000..5447eb922 Binary files /dev/null and b/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/daemon-execution-phase-493a3af5.jpg differ diff --git a/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/daemon-forks-test-jvms-c6d35982.png b/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/daemon-forks-test-jvms-c6d35982.png new file mode 100644 index 000000000..915518970 Binary files /dev/null and b/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/daemon-forks-test-jvms-c6d35982.png differ diff --git a/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/index.md b/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/index.md index 58f3fa30a..973db1466 100644 --- a/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/index.md +++ b/content/posts/2023/03/14/how-gradle-works-inside-the-daemon/index.md @@ -48,7 +48,7 @@ The daemon then starts running the build and sends build output (logging, stdout The communication happens via a local socket connection. -![](https://blog.gradle.org/images/how-gradle-works/client-connects-to-daemon.png) +![](client-connects-to-daemon-2726db30.png) But what exactly happens inside the daemon? @@ -66,7 +66,7 @@ The configuration required to configure the project hierarchy is represented by There is a [Project](https://github.com/gradle/gradle/blob/6121fa83ce4ac07a27ee043d8e69b0f5f99d1c49/subprojects/core-api/src/main/java/org/gradle/api/Project.java) instance corresponding to each project we're trying to build. -![](https://blog.gradle.org/images/how-gradle-works/creating-build-instances.png) +![](creating-build-instances-40546b7f.jpg) `Gradle`, `Settings` and `Project` are also the default delegation of init, settings and build script. @@ -92,7 +92,7 @@ Don't worry if you don't fully understand build script execution at this stage. For now, we can simply understand Gradle as [an interpreter](https://en.wikipedia.org/wiki/Interpreter_(computing)) that executes the build script line by line, top to bottom. -![](https://blog.gradle.org/images/how-gradle-works/configuration-build-script-execution.png) +![](configuration-build-script-execution-de5f9f21.jpg) The build script populates the data structures for the build inside the daemon JVM. @@ -118,7 +118,7 @@ After the configuration phase, Gradle has all the necessary data for the build s Then, it determines the subset of tasks to be executed by the arguments passed to the `gradle` command and executes each of the selected tasks. -![](https://blog.gradle.org/images/how-gradle-works/daemon-execution-phase.png) +![](daemon-execution-phase-493a3af5.jpg) Each `Task` has a list of actions made up of chunks of code to be executed. @@ -145,7 +145,7 @@ Another example of custom task actions forking extra JVMs is [`Test` task](https The `Test` task action is executed in the daemon JVM but during the execution, it forks a few JVMs and runs the test code inside the forked JVMs to avoid the test code interfering with the daemon JVM. -![](https://blog.gradle.org/images/how-gradle-works/daemon-forks-test-jvms.png) +![](daemon-forks-test-jvms-c6d35982.png) At the end of the build, the daemon will do some extra stuff, like executing callbacks, reporting errors, if any, publishing build scans, etc. diff --git a/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/Screen-Shot-2023-03-06-at-11.13.06-AM-1024x427.jpg b/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/Screen-Shot-2023-03-06-at-11.13.06-AM-1024x427.jpg new file mode 100644 index 000000000..efd562fa5 Binary files /dev/null and b/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/Screen-Shot-2023-03-06-at-11.13.06-AM-1024x427.jpg differ diff --git a/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/Screen-Shot-2023-03-06-at-11.13.06-AM-1024x427.png b/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/Screen-Shot-2023-03-06-at-11.13.06-AM-1024x427.png deleted file mode 100644 index 7c022a7aa..000000000 Binary files a/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/Screen-Shot-2023-03-06-at-11.13.06-AM-1024x427.png and /dev/null differ diff --git a/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/Screen-Shot-2023-03-06-at-11.15.11-AM-1024x422.jpg b/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/Screen-Shot-2023-03-06-at-11.15.11-AM-1024x422.jpg new file mode 100644 index 000000000..debeb3214 Binary files /dev/null and b/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/Screen-Shot-2023-03-06-at-11.15.11-AM-1024x422.jpg differ diff --git a/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/Screen-Shot-2023-03-06-at-11.15.11-AM-1024x422.png b/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/Screen-Shot-2023-03-06-at-11.15.11-AM-1024x422.png deleted file mode 100644 index 6ea02f23d..000000000 Binary files a/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/Screen-Shot-2023-03-06-at-11.15.11-AM-1024x422.png and /dev/null differ diff --git a/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/index.md b/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/index.md index 1c999afbd..5aedf978b 100644 --- a/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/index.md +++ b/content/posts/2023/03/15/efficient-memory-mapping-for-terabyte-sparse-files-in-java/index.md @@ -44,7 +44,7 @@ Using multiples of 10 for the shift makes them easier to read. ``` The virtual memory size of the above process is just over 8192 GiB at 8200.7 GiB, but the RSS (Resident Set Size) is only 122,060 KB, or 122 MB. -![](Screen-Shot-2023-03-06-at-11.13.06-AM-1024x427.png) +![](Screen-Shot-2023-03-06-at-11.13.06-AM-1024x427.jpg) *Figure 2. RES for Test 1* On disk, the extents reported are 8 TiB, however the amount of disk (and memory) actually used is just 20 KiB. @@ -59,7 +59,7 @@ The following test displays the main point of this article more clearly. In the The RSS (Resident Set Size) is only 129,272 KB, or 122 MB and the disk usage is only 4.0 MiB which indicates that only touched pages use memory. Although it seems the size of data is 16 KiB *1000 = 16 MiB but only 1 out of 4 pages have been touched so the actual disk usage is 4KiB* 1000 = 4.0 MiB -![](Screen-Shot-2023-03-06-at-11.15.11-AM-1024x422.png) +![](Screen-Shot-2023-03-06-at-11.15.11-AM-1024x422.jpg) *Figure 5. RES for Test 2* ![](Screen-Shot-2023-03-06-at-11.15.39-AM-1024x299.png) diff --git a/content/posts/2023/03/16/validating-java-profiling-apis/asgct_2-2000x1125-c8c811ba.jpg b/content/posts/2023/03/16/validating-java-profiling-apis/asgct_2-2000x1125-c8c811ba.jpg new file mode 100644 index 000000000..8b89c5c3b Binary files /dev/null and b/content/posts/2023/03/16/validating-java-profiling-apis/asgct_2-2000x1125-c8c811ba.jpg differ diff --git a/content/posts/2023/03/16/validating-java-profiling-apis/index.md b/content/posts/2023/03/16/validating-java-profiling-apis/index.md index dd834d796..c56be1e1b 100644 --- a/content/posts/2023/03/16/validating-java-profiling-apis/index.md +++ b/content/posts/2023/03/16/validating-java-profiling-apis/index.md @@ -36,7 +36,7 @@ I focus here on the AsyncGetCallTrace and GetStackTrace API, but due to the simi ## AsyncGetCallTrace and GetStackTrace A short recap from my series ["Writing a Profiler from Scratch"](https://mostlynerdless.de/blog/tag/writing-a-profiler-from-scratch/) -- both APIs return the stack trace for a given thread at a given point in time (A called B, which in turn called C, ...): -![](https://mostlynerdless.de/wp-content/uploads/2023/01/asgct_2-2000x1125.png) AsyncGetCallTrace +![](asgct_2-2000x1125-c8c811ba.jpg) AsyncGetCallTrace The only difference is that AsyncGetCallTrace (ASGCT) returns the stack trace at any point in the execution of the program and GetStackTrace (GST) only at specific safe points, where the state of the JVM is defined. @@ -61,7 +61,7 @@ This makes the correctness definition easier to test, as it lets us make the tra The idea is now to build our oracle in different layers. We are starting with basic assumptions and writing tests to verify that the layer above is probably correct too. This is leading us to our combined test of asynchronous AsyncGetCallTrace. This has the advantage that every check is relatively simple, which is essential because the whole oracle depends on how much we trust the basic assumptions and the tests that verify that a layer is correct. I describe the layers and checks in the following: -![](https://mostlynerdless.de/wp-content/uploads/2023/03/layers.png) Different layers of trace_validation +![](layers.png) Different layers of trace_validation ## Ground layer @@ -120,7 +120,7 @@ We aim to convince ourselves that AsyncGetCallTrace is safe at non-safepoints, a The trace stack data structure allows the pushing and popping of stack traces on method entry and exit. It consists of a large frames array that contains the current frames: the index 0 has the bottom frame, and the index top contains the top most frame (the reverse order compared to AsyncGetCallTrace). The array is large enough, here 1024 entries, to store stack traces of all relevant sizes. It is augmented by a `previous` array that contains the index of the top frame of the most recent transitive caller frame of the current top frame. -![](https://mostlynerdless.de/wp-content/uploads/2023/03/trace_stack.png) Trace stack data structure used to store the stack of stack traces +![](trace_stack-fe6718b5.png) Trace stack data structure used to store the stack of stack traces We assume here that the caller trace is a sub-trace of the current trace, with only the caller frame differing in the location (`lineno` here). This is due to the caller frame location being the beginning of the method where we obtained the trace. The calls to other methods have different locations. Therefore, we mark the top frame location with a magic number to state that this information changes during the execution of the method. diff --git a/content/posts/2023/03/16/validating-java-profiling-apis/trace_stack-fe6718b5.png b/content/posts/2023/03/16/validating-java-profiling-apis/trace_stack-fe6718b5.png new file mode 100644 index 000000000..db9185abf Binary files /dev/null and b/content/posts/2023/03/16/validating-java-profiling-apis/trace_stack-fe6718b5.png differ diff --git a/content/posts/2023/03/20/foojay-podcast-16/index.md b/content/posts/2023/03/20/foojay-podcast-16/index.md index 9e5b6ed97..5ea920a4a 100644 --- a/content/posts/2023/03/20/foojay-podcast-16/index.md +++ b/content/posts/2023/03/20/foojay-podcast-16/index.md @@ -7,7 +7,7 @@ authors: - "frankdelporte" - "miro-wengner" - "simonritter" -image: "podcast-java-20-guests-1024x576-1.png" +image: "podcast-java-20-guests-1024x576-1.jpg" categories: - "Java Core" - "Podcast" diff --git a/content/posts/2023/03/20/foojay-podcast-16/podcast-java-20-guests-1024x576-1.jpg b/content/posts/2023/03/20/foojay-podcast-16/podcast-java-20-guests-1024x576-1.jpg new file mode 100644 index 000000000..eb09945b0 Binary files /dev/null and b/content/posts/2023/03/20/foojay-podcast-16/podcast-java-20-guests-1024x576-1.jpg differ diff --git a/content/posts/2023/03/20/foojay-podcast-16/podcast-java-20-guests-1024x576-1.png b/content/posts/2023/03/20/foojay-podcast-16/podcast-java-20-guests-1024x576-1.png deleted file mode 100644 index b841683e8..000000000 Binary files a/content/posts/2023/03/20/foojay-podcast-16/podcast-java-20-guests-1024x576-1.png and /dev/null differ diff --git a/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/3750862963_A_group_of_developers_gathered_around_a_computer__laughing_as_they_discover_the_cause_of_their_netwo.jpg b/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/3750862963_A_group_of_developers_gathered_around_a_computer__laughing_as_they_discover_the_cause_of_their_netwo.jpg new file mode 100644 index 000000000..8572ccac3 Binary files /dev/null and b/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/3750862963_A_group_of_developers_gathered_around_a_computer__laughing_as_they_discover_the_cause_of_their_netwo.jpg differ diff --git a/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/3750862963_A_group_of_developers_gathered_around_a_computer__laughing_as_they_discover_the_cause_of_their_netwo.png b/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/3750862963_A_group_of_developers_gathered_around_a_computer__laughing_as_they_discover_the_cause_of_their_netwo.png deleted file mode 100644 index 9fd2e28bd..000000000 Binary files a/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/3750862963_A_group_of_developers_gathered_around_a_computer__laughing_as_they_discover_the_cause_of_their_netwo.png and /dev/null differ diff --git a/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/Steve-Poole.jpg b/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/Steve-Poole.jpg new file mode 100644 index 000000000..bba98f5f3 Binary files /dev/null and b/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/Steve-Poole.jpg differ diff --git a/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/Steve-Poole.png b/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/Steve-Poole.png deleted file mode 100644 index bb36b99b7..000000000 Binary files a/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/Steve-Poole.png and /dev/null differ diff --git a/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/index.md b/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/index.md index 34eb64f62..ae884ef61 100644 --- a/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/index.md +++ b/content/posts/2023/03/20/from-assembler-to-chat-gpt-steve-poole-on-the-shifting-landscape-of-programming/index.md @@ -5,7 +5,7 @@ lastmod: "2023-03-21T11:35:42+00:00" description: "Discover insights from seasoned Java developer Steve Poole on the ever-evolving software landscape, career growth, and lessons learned throughout his remarkable journey in the tech industry." authors: - "bazlur-rahman" -image: "Steve-Poole.png" +image: "Steve-Poole.jpg" categories: - "Interviews" related_posts: @@ -152,7 +152,7 @@ For weeks and weeks, we tried different things to capture the problem until some Unfortunately, we just made assumptions before we'd even started about the problem - rather than stepping back and understanding the situation, we just allowed a rogue screen saver to eat all the CPU right in front of us! That taught me a great deal about how to really diagnose problems and avoid pre-emptive guessing and assumptions. -{{< img src="3750862963_A_group_of_developers_gathered_around_a_computer__laughing_as_they_discover_the_cause_of_their_netwo.png" class="alignright size-full is-resized" width="256" height="256" >}} +{{< img src="3750862963_A_group_of_developers_gathered_around_a_computer__laughing_as_they_discover_the_cause_of_their_netwo.jpg" class="alignright size-full is-resized" width="256" height="256" >}} **Editor's note:** *Steve's anecdote emphasizes the importance of thorough diagnosis and avoiding assumptions when tackling problems. This lesson highlights the need to step back, understand the situation, and remain open to possibilities, which is applicable across various problem-solving contexts.* diff --git a/content/posts/2023/03/21/java-on-visual-studio-code-update-february-2023/filter-43f3c857.gif b/content/posts/2023/03/21/java-on-visual-studio-code-update-february-2023/filter-43f3c857.gif new file mode 100644 index 000000000..26f67cf18 Binary files /dev/null and b/content/posts/2023/03/21/java-on-visual-studio-code-update-february-2023/filter-43f3c857.gif differ diff --git a/content/posts/2023/03/21/java-on-visual-studio-code-update-february-2023/index.md b/content/posts/2023/03/21/java-on-visual-studio-code-update-february-2023/index.md index bf426f805..b04754683 100644 --- a/content/posts/2023/03/21/java-on-visual-studio-code-update-february-2023/index.md +++ b/content/posts/2023/03/21/java-on-visual-studio-code-update-february-2023/index.md @@ -34,7 +34,7 @@ In our latest release, we have supported the parallel testing feature in Visual To learn about more about parallel testing in JUnit 5, you can visit the [official documentation.](https://junit.org/junit5/docs/snapshot/user-guide/#writing-tests-parallel-execution) Here's a demo of this feature. -![Parallel Testing](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/02/parallel-test.gif) +![Parallel Testing](parallel-test.gif) #### Filter Widget in Spring Boot Dashboard Extension @@ -44,7 +44,7 @@ You can either use the exact filter or "fuzzy match" to search for the phrase yo Overall, the filter widget allows developers to efficiently manage their application's endpoints and improve their development process. Here's a demo for this feature. -![Spring Boot filter](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/02/filter.gif) +![Spring Boot filter](filter-43f3c857.gif) #### GitHub Copilot AI Tech Upgraded and Generates 61% of Java Code @@ -56,11 +56,11 @@ Even though Java is a verbose programming languages, it sill shows that Java dev To use all features mentioned above, please download and install [Extension Pack for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) on Visual Studio Code. -[![Extension pack for Java](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png) +[![Extension pack for Java](javapack-892c0338.png)](javapack-892c0338.png) If you are a Spring developer working on a Spring Boot application, you can also download the [Spring Boot Extension Pack](https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-boot-dev-pack) for specialized Spring experience. -[![Spring boot extension pack](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png) +[![Spring boot extension pack](spring-ac42cb4c.png)](spring-ac42cb4c.png) Feedback and suggestions diff --git a/content/posts/2023/03/21/java-on-visual-studio-code-update-february-2023/javapack-892c0338.png b/content/posts/2023/03/21/java-on-visual-studio-code-update-february-2023/javapack-892c0338.png new file mode 100644 index 000000000..c05f90e30 Binary files /dev/null and b/content/posts/2023/03/21/java-on-visual-studio-code-update-february-2023/javapack-892c0338.png differ diff --git a/content/posts/2023/03/21/java-on-visual-studio-code-update-february-2023/spring-ac42cb4c.png b/content/posts/2023/03/21/java-on-visual-studio-code-update-february-2023/spring-ac42cb4c.png new file mode 100644 index 000000000..c3d38f0a6 Binary files /dev/null and b/content/posts/2023/03/21/java-on-visual-studio-code-update-february-2023/spring-ac42cb4c.png differ diff --git a/content/posts/2023/03/23/event-driven-order-processing-program/Screen-Shot-2023-03-13-at-2.53.19-PM-1024x651.jpg b/content/posts/2023/03/23/event-driven-order-processing-program/Screen-Shot-2023-03-13-at-2.53.19-PM-1024x651.jpg new file mode 100644 index 000000000..b29ce069d Binary files /dev/null and b/content/posts/2023/03/23/event-driven-order-processing-program/Screen-Shot-2023-03-13-at-2.53.19-PM-1024x651.jpg differ diff --git a/content/posts/2023/03/23/event-driven-order-processing-program/Screen-Shot-2023-03-13-at-2.53.19-PM-1024x651.png b/content/posts/2023/03/23/event-driven-order-processing-program/Screen-Shot-2023-03-13-at-2.53.19-PM-1024x651.png deleted file mode 100644 index f23944b18..000000000 Binary files a/content/posts/2023/03/23/event-driven-order-processing-program/Screen-Shot-2023-03-13-at-2.53.19-PM-1024x651.png and /dev/null differ diff --git a/content/posts/2023/03/23/event-driven-order-processing-program/index.md b/content/posts/2023/03/23/event-driven-order-processing-program/index.md index ec9866898..fda3cea8a 100644 --- a/content/posts/2023/03/23/event-driven-order-processing-program/index.md +++ b/content/posts/2023/03/23/event-driven-order-processing-program/index.md @@ -85,7 +85,7 @@ Using the queues in an asynchronous mode achieves similar latencies to in memory *Comparing using tmpfs as in-memory and ext4 on an M.2 NVMe drive.* -![](Screen-Shot-2023-03-13-at-2.53.19-PM-1024x651.png) +![](Screen-Shot-2023-03-13-at-2.53.19-PM-1024x651.jpg) ### Chronicle Enterprise Extensions diff --git a/content/posts/2023/03/24/mitigating-path-traversal-vulnerabilities-in-java/index.md b/content/posts/2023/03/24/mitigating-path-traversal-vulnerabilities-in-java/index.md index a9c763271..8c4af8bc7 100644 --- a/content/posts/2023/03/24/mitigating-path-traversal-vulnerabilities-in-java/index.md +++ b/content/posts/2023/03/24/mitigating-path-traversal-vulnerabilities-in-java/index.md @@ -53,7 +53,7 @@ public String uploadImage (Model model, @RequestParam("image") MultipartFile fil Web forms are a very common to upload images. When uploading, we use the `originalFilename` from the incoming `MultipartFile`. If we intercept and inspect the HTTP post call, we see that `filename` is just metadata in this HTTP request shown on line 24. -![blog-mitigating-path-traversal-jsession-id](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1678125740%2Fblog-mitigating-path-traversal-jsession-id.jpg&w=960&q=75) +![blog-mitigating-path-traversal-jsession-id](snyk-io-1d57dc7c.jpg) With the right tools, it is easy to change the filename to anything we want! When we change the filename to `../../../../../../../etc/passwd`, our code will upload the file to `images/profiles/../../../../../../../etc/passwd`. @@ -64,7 +64,7 @@ The path will be traversed to the root, and the file will be overwriting `/etc/p Snyk Code is a real-time SAST tool that helps Java developers identify vulnerabilities in their applications — including path traversal in file uploads. The tool uses a static analysis based on an advanced machine learning model to scan your code and identify potential security risks. Regarding path traversal, [++Snyk Code++](https://docs.snyk.io/scan-application-code/snyk-code) can help you identify places in your code where user-specified file paths are used and proper validation is not in place. For example, when connecting my GitHub repository to Snyk, Snyk Code found the path traversal issue for me in [++the Web UI++](https://docs.snyk.io/scan-application-code/snyk-code/exploring-and-working-with-the-snyk-code-results). -![blog-mitigating-path-traversal-snyk-code-ui](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1678125740%2Fblog-mitigating-path-traversal-snyk-code-ui.jpg&w=2560&q=75) +![blog-mitigating-path-traversal-snyk-code-ui](snyk-io-094e2de7.jpg) Next, I'm using the [++Snyk plugin for IntelliJ IDEA++](https://docs.snyk.io/ide-tools/jetbrains-plugins) with Snyk Code enabled. Scanning on my local machine during development already pinpointed the path traversal problem in my file upload. diff --git a/content/posts/2023/03/24/mitigating-path-traversal-vulnerabilities-in-java/snyk-io-094e2de7.jpg b/content/posts/2023/03/24/mitigating-path-traversal-vulnerabilities-in-java/snyk-io-094e2de7.jpg new file mode 100644 index 000000000..73ebd25f0 Binary files /dev/null and b/content/posts/2023/03/24/mitigating-path-traversal-vulnerabilities-in-java/snyk-io-094e2de7.jpg differ diff --git a/content/posts/2023/03/24/mitigating-path-traversal-vulnerabilities-in-java/snyk-io-1d57dc7c.jpg b/content/posts/2023/03/24/mitigating-path-traversal-vulnerabilities-in-java/snyk-io-1d57dc7c.jpg new file mode 100644 index 000000000..bc98e7e7b Binary files /dev/null and b/content/posts/2023/03/24/mitigating-path-traversal-vulnerabilities-in-java/snyk-io-1d57dc7c.jpg differ diff --git a/content/posts/2023/03/27/foojay-podcast-17/index.md b/content/posts/2023/03/27/foojay-podcast-17/index.md index f41bc2466..35a771907 100644 --- a/content/posts/2023/03/27/foojay-podcast-17/index.md +++ b/content/posts/2023/03/27/foojay-podcast-17/index.md @@ -8,7 +8,7 @@ authors: - "frankdelporte" - "jakob-jenkov" - "thanos-stratikopoulos" -image: "podcast-guests-tornadovm-1024x384-1.png" +image: "podcast-guests-tornadovm-1024x384-1.jpg" categories: - "Performance" - "Podcast" @@ -63,7 +63,7 @@ You can listen and subscribe to the Foojay Podcast on: * * -![](podcast-guests-tornadovm-1024x384.png) +![](podcast-guests-tornadovm-1024x384.jpg) ## **Content** diff --git a/content/posts/2023/03/27/foojay-podcast-17/podcast-guests-tornadovm-1024x384-1.jpg b/content/posts/2023/03/27/foojay-podcast-17/podcast-guests-tornadovm-1024x384-1.jpg new file mode 100644 index 000000000..b363951e8 Binary files /dev/null and b/content/posts/2023/03/27/foojay-podcast-17/podcast-guests-tornadovm-1024x384-1.jpg differ diff --git a/content/posts/2023/03/27/foojay-podcast-17/podcast-guests-tornadovm-1024x384-1.png b/content/posts/2023/03/27/foojay-podcast-17/podcast-guests-tornadovm-1024x384-1.png deleted file mode 100644 index 82c94ff20..000000000 Binary files a/content/posts/2023/03/27/foojay-podcast-17/podcast-guests-tornadovm-1024x384-1.png and /dev/null differ diff --git a/content/posts/2023/03/27/foojay-podcast-17/podcast-guests-tornadovm-1024x384.jpg b/content/posts/2023/03/27/foojay-podcast-17/podcast-guests-tornadovm-1024x384.jpg new file mode 100644 index 000000000..2050d2905 Binary files /dev/null and b/content/posts/2023/03/27/foojay-podcast-17/podcast-guests-tornadovm-1024x384.jpg differ diff --git a/content/posts/2023/03/27/foojay-podcast-17/podcast-guests-tornadovm-1024x384.png b/content/posts/2023/03/27/foojay-podcast-17/podcast-guests-tornadovm-1024x384.png deleted file mode 100644 index 21b05709b..000000000 Binary files a/content/posts/2023/03/27/foojay-podcast-17/podcast-guests-tornadovm-1024x384.png and /dev/null differ diff --git a/content/posts/2023/03/27/navigating-the-challenges-of-modern-software-development-an-exclusive-interview-with-shai-almog/Steve-Poole-1.jpg b/content/posts/2023/03/27/navigating-the-challenges-of-modern-software-development-an-exclusive-interview-with-shai-almog/Steve-Poole-1.jpg new file mode 100644 index 000000000..593cbace2 Binary files /dev/null and b/content/posts/2023/03/27/navigating-the-challenges-of-modern-software-development-an-exclusive-interview-with-shai-almog/Steve-Poole-1.jpg differ diff --git a/content/posts/2023/03/27/navigating-the-challenges-of-modern-software-development-an-exclusive-interview-with-shai-almog/Steve-Poole-1.png b/content/posts/2023/03/27/navigating-the-challenges-of-modern-software-development-an-exclusive-interview-with-shai-almog/Steve-Poole-1.png deleted file mode 100644 index 6e4f08040..000000000 Binary files a/content/posts/2023/03/27/navigating-the-challenges-of-modern-software-development-an-exclusive-interview-with-shai-almog/Steve-Poole-1.png and /dev/null differ diff --git a/content/posts/2023/03/27/navigating-the-challenges-of-modern-software-development-an-exclusive-interview-with-shai-almog/index.md b/content/posts/2023/03/27/navigating-the-challenges-of-modern-software-development-an-exclusive-interview-with-shai-almog/index.md index 9deee08c5..f72041fca 100644 --- a/content/posts/2023/03/27/navigating-the-challenges-of-modern-software-development-an-exclusive-interview-with-shai-almog/index.md +++ b/content/posts/2023/03/27/navigating-the-challenges-of-modern-software-development-an-exclusive-interview-with-shai-almog/index.md @@ -5,7 +5,7 @@ lastmod: "2023-03-27T17:10:44+00:00" description: "Join our interview with Java expert Shai Almog, as he shares his journey and offers valuable advice for developers, discussing mentorship and overcoming challenges in the software industry." authors: - "bazlur-rahman" -image: "Steve-Poole-1.png" +image: "Steve-Poole-1.jpg" categories: - "Interviews" related_posts: diff --git a/content/posts/2023/03/27/using-bots-to-keep-dependencies-updated/Snyk-Open-Source-Start-free.jpg b/content/posts/2023/03/27/using-bots-to-keep-dependencies-updated/Snyk-Open-Source-Start-free.jpg new file mode 100644 index 000000000..357d2885d Binary files /dev/null and b/content/posts/2023/03/27/using-bots-to-keep-dependencies-updated/Snyk-Open-Source-Start-free.jpg differ diff --git a/content/posts/2023/03/27/using-bots-to-keep-dependencies-updated/Snyk-Open-Source-Start-free.png b/content/posts/2023/03/27/using-bots-to-keep-dependencies-updated/Snyk-Open-Source-Start-free.png deleted file mode 100644 index 27d1b1a3f..000000000 Binary files a/content/posts/2023/03/27/using-bots-to-keep-dependencies-updated/Snyk-Open-Source-Start-free.png and /dev/null differ diff --git a/content/posts/2023/03/27/using-bots-to-keep-dependencies-updated/index.md b/content/posts/2023/03/27/using-bots-to-keep-dependencies-updated/index.md index a455ad50c..8fe8c14b5 100644 --- a/content/posts/2023/03/27/using-bots-to-keep-dependencies-updated/index.md +++ b/content/posts/2023/03/27/using-bots-to-keep-dependencies-updated/index.md @@ -141,7 +141,7 @@ Snyk Open Source is available from [Snyk](https://snyk.io/). There are more step You will need to **Authorize snyk** on your GitHub profile, select repository access (either **Public and private repos** or **Public repos only** ), select other available features you want to use, and provide a **Personal access token** on GitHub. -![Snyk Open Source Start free](Snyk-Open-Source-Start-free.png) +![Snyk Open Source Start free](Snyk-Open-Source-Start-free.jpg) ## Features diff --git a/content/posts/2023/04/01/analyzing-and-tuning-warm-up-of-the-jvm-with-azul-zulu-prime-builds-of-openjdk/button-information-d15fa965.png b/content/posts/2023/04/01/analyzing-and-tuning-warm-up-of-the-jvm-with-azul-zulu-prime-builds-of-openjdk/button-information-d15fa965.png new file mode 100644 index 000000000..ee7187d5c Binary files /dev/null and b/content/posts/2023/04/01/analyzing-and-tuning-warm-up-of-the-jvm-with-azul-zulu-prime-builds-of-openjdk/button-information-d15fa965.png differ diff --git a/content/posts/2023/04/01/analyzing-and-tuning-warm-up-of-the-jvm-with-azul-zulu-prime-builds-of-openjdk/index.md b/content/posts/2023/04/01/analyzing-and-tuning-warm-up-of-the-jvm-with-azul-zulu-prime-builds-of-openjdk/index.md index ef90c373c..2ce4e0852 100644 --- a/content/posts/2023/04/01/analyzing-and-tuning-warm-up-of-the-jvm-with-azul-zulu-prime-builds-of-openjdk/index.md +++ b/content/posts/2023/04/01/analyzing-and-tuning-warm-up-of-the-jvm-with-azul-zulu-prime-builds-of-openjdk/index.md @@ -122,7 +122,7 @@ This test application is run on a small machine to see the impact of threads on ### System Information -Let's look at an example GC log. Open the log by running `java -jar GCLogAnalyzer2.jar gc.log`. Click the ![](https://docs.azul.com/prime/images/warmup/button-information.png) button to see the overall information about the process: +Let's look at an example GC log. Open the log by running `java -jar GCLogAnalyzer2.jar gc.log`. Click the ![](button-information-d15fa965.png) button to see the overall information about the process: ![](screenshot-system-info-1024x242.png) System information of an application without additional flags. You can see that the process is running on 6 threads overall. Scrolling down to the bottom, you see the following for the test without additional parameters: diff --git a/content/posts/2023/04/03/foojay-podcast-18/atlantajug-screenshot-zoom-1024x577-1.jpg b/content/posts/2023/04/03/foojay-podcast-18/atlantajug-screenshot-zoom-1024x577-1.jpg new file mode 100644 index 000000000..1cc643628 Binary files /dev/null and b/content/posts/2023/04/03/foojay-podcast-18/atlantajug-screenshot-zoom-1024x577-1.jpg differ diff --git a/content/posts/2023/04/03/foojay-podcast-18/atlantajug-screenshot-zoom-1024x577-1.png b/content/posts/2023/04/03/foojay-podcast-18/atlantajug-screenshot-zoom-1024x577-1.png deleted file mode 100644 index 82163a209..000000000 Binary files a/content/posts/2023/04/03/foojay-podcast-18/atlantajug-screenshot-zoom-1024x577-1.png and /dev/null differ diff --git a/content/posts/2023/04/03/foojay-podcast-18/atlantajug-screenshot-zoom-1024x577.jpg b/content/posts/2023/04/03/foojay-podcast-18/atlantajug-screenshot-zoom-1024x577.jpg new file mode 100644 index 000000000..1cc643628 Binary files /dev/null and b/content/posts/2023/04/03/foojay-podcast-18/atlantajug-screenshot-zoom-1024x577.jpg differ diff --git a/content/posts/2023/04/03/foojay-podcast-18/atlantajug-screenshot-zoom-1024x577.png b/content/posts/2023/04/03/foojay-podcast-18/atlantajug-screenshot-zoom-1024x577.png deleted file mode 100644 index 82163a209..000000000 Binary files a/content/posts/2023/04/03/foojay-podcast-18/atlantajug-screenshot-zoom-1024x577.png and /dev/null differ diff --git a/content/posts/2023/04/03/foojay-podcast-18/index.md b/content/posts/2023/04/03/foojay-podcast-18/index.md index 98c086f14..a9a8945cc 100644 --- a/content/posts/2023/04/03/foojay-podcast-18/index.md +++ b/content/posts/2023/04/03/foojay-podcast-18/index.md @@ -5,7 +5,7 @@ lastmod: "2025-11-13T09:10:57+00:00" description: "Today we travel back to the US to learn more about the Atlanta JUG, mainly because this week, they are organizing the DevNexus conference!" authors: - "frankdelporte" -image: "atlantajug-screenshot-zoom-1024x577-1.png" +image: "atlantajug-screenshot-zoom-1024x577-1.jpg" categories: - "JUGs" - "Podcast" @@ -49,7 +49,7 @@ You can listen and subscribe to the Foojay Podcast on: * * -![](atlantajug-screenshot-zoom-1024x577.png) +![](atlantajug-screenshot-zoom-1024x577.jpg) ## Links diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/4zcw8x9ewk46fiscbsh0-de9492ee.jpg b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/4zcw8x9ewk46fiscbsh0-de9492ee.jpg new file mode 100644 index 000000000..f04f80ccf Binary files /dev/null and b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/4zcw8x9ewk46fiscbsh0-de9492ee.jpg differ diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/5fw44ovhuu1vxc1fi78s-2575a439.jpg b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/5fw44ovhuu1vxc1fi78s-2575a439.jpg new file mode 100644 index 000000000..9ee5415de Binary files /dev/null and b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/5fw44ovhuu1vxc1fi78s-2575a439.jpg differ diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/5slo646yq76r6seezn8x-d9a99bc5.png b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/5slo646yq76r6seezn8x-d9a99bc5.png new file mode 100644 index 000000000..a94c2fb05 Binary files /dev/null and b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/5slo646yq76r6seezn8x-d9a99bc5.png differ diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/6b3ztzm2vzv1qqs7ylvw-5336c895.jpg b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/6b3ztzm2vzv1qqs7ylvw-5336c895.jpg new file mode 100644 index 000000000..113012ac4 Binary files /dev/null and b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/6b3ztzm2vzv1qqs7ylvw-5336c895.jpg differ diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/86xva5t54e1sqt8a5uxo-6dfc88bb.jpg b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/86xva5t54e1sqt8a5uxo-6dfc88bb.jpg new file mode 100644 index 000000000..3074edd3a Binary files /dev/null and b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/86xva5t54e1sqt8a5uxo-6dfc88bb.jpg differ diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/b7wqwjiadkmpwlrdc9dd-04b58893.jpg b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/b7wqwjiadkmpwlrdc9dd-04b58893.jpg new file mode 100644 index 000000000..80a85c2c3 Binary files /dev/null and b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/b7wqwjiadkmpwlrdc9dd-04b58893.jpg differ diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/fewyrpheterrdpqxz4c0-3134c481.jpg b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/fewyrpheterrdpqxz4c0-3134c481.jpg new file mode 100644 index 000000000..0b5adc96f Binary files /dev/null and b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/fewyrpheterrdpqxz4c0-3134c481.jpg differ diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/index.md b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/index.md index 6802450d8..d9baf0b3b 100644 --- a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/index.md +++ b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/index.md @@ -148,15 +148,15 @@ This product is a relatively new contender in the field, it is not as flexible a To test GitHub Actions, we need a new project which in this case I generated using [JHipster](https://www.jhipster.tech/) with the configuration seen here: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fewyrpheterrdpqxz4c0.png) +![Image description](fewyrpheterrdpqxz4c0-3134c481.jpg) I created a separate project that demonstrates the use of GitHub Actions here. Notice you can follow this with any project, although we include maven instructions in this case, the concept is very simple. Once the project is created, we can open the project page on GitHub and move to the actions tab. We will see something like this: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r3rftiu9dl2k4jj8ei3n.png) +![Image description](r3rftiu9dl2k4jj8ei3n-03394933.jpg) In the bottom right corner, we can see the Java with Maven project type. Once we pick this type, we move to the creation of a `maven.yml` file as shown here: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/owxs0cycqo2ehw0z0ust.png) +![Image description](owxs0cycqo2ehw0z0ust-ff66d119.jpg) Unfortunately, the default maven.yml suggested by GitHub includes a problem. This is the code we see in this image: @@ -200,19 +200,19 @@ This is effectively a standard unix command line. Sometimes it makes sense to cr We can see the [successful pull request](https://github.com/shai-almog/HelloJHipster/pull/4) here: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6b3ztzm2vzv1qqs7ylvw.png) +![Image description](6b3ztzm2vzv1qqs7ylvw-5336c895.jpg) To test this out, we can add a bug to the code by [changing the `"/api"` endpoint to `"/myapi"`](https://github.com/shai-almog/HelloJHipster/pull/7). This produces the failure shown below. It also triggers an error email sent to the author of the commit. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4zcw8x9ewk46fiscbsh0.png) +![Image description](4zcw8x9ewk46fiscbsh0-de9492ee.jpg) When such a failure occurs, we can click the "Details" link on the right side. This takes us directly to the error message you see here: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t2m7zx4phijajmp7tvr2.png) +![Image description](t2m7zx4phijajmp7tvr2-547057cd.jpg) Unfortunately, this is typically a useless message that does not provide help in the issue resolution. However, scrolling up will show the actual failure which is usually conveniently highlighted for us as seen here: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kxzfbfx3tk37ovnnrihn.png) +![Image description](kxzfbfx3tk37ovnnrihn-c3b92c0a.jpg) Note that there are often multiple failures so it would be prudent to scroll up further. In this error, we can see the failure was an assertion in line `394` of AccountResourceIT which you can see here, note that the line numbers do not match. In this case, line `394` is the last line of the method: @@ -249,27 +249,27 @@ On the other hand, SonarQube is an open-source platform that provides static cod Both SonarCloud and SonarQube provide similar functionalities, but SonarCloud is a cloud-based service and requires a subscription, while SonarQube is an open-source platform that can be installed on-premise or on a cloud server. For simplicity's sake, we will use SonarCloud but SonarQube should work just fine. To get started we go to [sonarcloud.io](https://sonarcloud.io), and sign up. Ideally with our GitHub account. We are then presented with an option to add a repository for monitoring by Sonar Cloud as shown here: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5slo646yq76r6seezn8x.png) +![Image description](5slo646yq76r6seezn8x-d9a99bc5.png) When we select the Analyze new page option, we need to authorize access to our GitHub repository. The next step is selecting the projects we wish to add to Sonar Cloud as shown here: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b7wqwjiadkmpwlrdc9dd.png) +![Image description](b7wqwjiadkmpwlrdc9dd-04b58893.jpg) Once we select and proceed to the setup process, we need to pick the analysis method. Since we use GitHub Actions, we need to pick that option in the following stage as seen here: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uumt6h0rl9hayjtivhr4.png) +![Image description](uumt6h0rl9hayjtivhr4-ba1b2d7c.jpg) Once this is set, we enter the final stage within the Sonar Cloud wizard as seen in the following image. We receive a token that we can copy (entry 2 that is blurred in the image), we will use that shortly. Notice there are also default instructions to use with maven that appear once you click the button labeled "Maven". -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kctu5kbc7fnq4bmpo86r.png) +![Image description](kctu5kbc7fnq4bmpo86r-f90d52c4.jpg) Going back to the project in GitHub we can move to the project settings tab (not to be confused with the account settings in the top menu). Here we select "Secrets and variables" as shown here: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/86xva5t54e1sqt8a5uxo.png) +![Image description](86xva5t54e1sqt8a5uxo-6dfc88bb.jpg) In this section we can add a new repository secret, specifically the SONAR_TOKEN key and value we copied from the SonarCloud as you can see here: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rwo75glyurcn0haj3i4s.png) +![Image description](rwo75glyurcn0haj3i4s-bf16051e.png) GitHub Repository Secrets are a feature that allows developers to securely store sensitive information associated with a GitHub repository, such as API keys, tokens, and passwords, which are required to authenticate and authorize access to various third-party services or platforms used by the repository. @@ -300,11 +300,11 @@ After this we can replace the "Build with Maven" portion of the `maven.yml` file Once we do that, SonarCloud will provide reports for every pull request merged into the system as shown here: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5fw44ovhuu1vxc1fi78s.png) +![Image description](5fw44ovhuu1vxc1fi78s-2575a439.jpg) We can see a report that includes the list of bugs, vulnerabilities, smells, and security issues. Clicking every one of those issues leads us to something like this: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zzzmx9vbqt3gikp2wa76.png) +![Image description](zzzmx9vbqt3gikp2wa76-0a33aa6d.jpg) Notice that we have tabs that explain exactly why the issue is a problem, how to fix it and more. This is a remarkably powerful tool that serves as one of the most valuable code reviewers in the team. diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/kctu5kbc7fnq4bmpo86r-f90d52c4.jpg b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/kctu5kbc7fnq4bmpo86r-f90d52c4.jpg new file mode 100644 index 000000000..4feabccd5 Binary files /dev/null and b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/kctu5kbc7fnq4bmpo86r-f90d52c4.jpg differ diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/kxzfbfx3tk37ovnnrihn-c3b92c0a.jpg b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/kxzfbfx3tk37ovnnrihn-c3b92c0a.jpg new file mode 100644 index 000000000..e4a4f77e1 Binary files /dev/null and b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/kxzfbfx3tk37ovnnrihn-c3b92c0a.jpg differ diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/owxs0cycqo2ehw0z0ust-ff66d119.jpg b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/owxs0cycqo2ehw0z0ust-ff66d119.jpg new file mode 100644 index 000000000..d64ef4bfe Binary files /dev/null and b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/owxs0cycqo2ehw0z0ust-ff66d119.jpg differ diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/r3rftiu9dl2k4jj8ei3n-03394933.jpg b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/r3rftiu9dl2k4jj8ei3n-03394933.jpg new file mode 100644 index 000000000..5cb40b0b7 Binary files /dev/null and b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/r3rftiu9dl2k4jj8ei3n-03394933.jpg differ diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/rwo75glyurcn0haj3i4s-bf16051e.png b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/rwo75glyurcn0haj3i4s-bf16051e.png new file mode 100644 index 000000000..e0a1490b0 Binary files /dev/null and b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/rwo75glyurcn0haj3i4s-bf16051e.png differ diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/t2m7zx4phijajmp7tvr2-547057cd.jpg b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/t2m7zx4phijajmp7tvr2-547057cd.jpg new file mode 100644 index 000000000..24074c3f7 Binary files /dev/null and b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/t2m7zx4phijajmp7tvr2-547057cd.jpg differ diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/uumt6h0rl9hayjtivhr4-ba1b2d7c.jpg b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/uumt6h0rl9hayjtivhr4-ba1b2d7c.jpg new file mode 100644 index 000000000..568298347 Binary files /dev/null and b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/uumt6h0rl9hayjtivhr4-ba1b2d7c.jpg differ diff --git a/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/zzzmx9vbqt3gikp2wa76-0a33aa6d.jpg b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/zzzmx9vbqt3gikp2wa76-0a33aa6d.jpg new file mode 100644 index 000000000..2ebac0d85 Binary files /dev/null and b/content/posts/2023/04/04/devops-for-developers-continuous-integration-github-actions-and-sonar-cloud/zzzmx9vbqt3gikp2wa76-0a33aa6d.jpg differ diff --git a/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888-1.jpg b/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888-1.jpg new file mode 100644 index 000000000..cfd6869bb Binary files /dev/null and b/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888-1.jpg differ diff --git a/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888-1.png b/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888-1.png deleted file mode 100644 index 56dd0d036..000000000 Binary files a/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888-1.png and /dev/null differ diff --git a/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888.jpg b/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888.jpg new file mode 100644 index 000000000..6db99f877 Binary files /dev/null and b/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888.jpg differ diff --git a/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888.png b/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888.png deleted file mode 100644 index 6aaf46a21..000000000 Binary files a/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888.png and /dev/null differ diff --git a/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/index.md b/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/index.md index 7dc359259..8c2bd953d 100644 --- a/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/index.md +++ b/content/posts/2023/04/07/chronicle-fix-designed-not-to-skip-a-message-even-if-your-data-centre-fails/index.md @@ -5,7 +5,7 @@ lastmod: "2024-01-09T12:59:47+00:00" description: "High availability is achieved in Chronicle FIX by failover, where workload is transferred in the event of a primary engine failure." authors: - "forough-goudarzi" -image: "Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888-1.png" +image: "Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888-1.jpg" categories: - "Jakarta EE" - "JavaFX" @@ -40,7 +40,7 @@ Outgoing messages and sequence numbers from the acceptor are logged in a Chronic Since the secondary acceptor already has the state of the failed session, it can continue to exchange messages with the initiator from the state before the failure. -![](Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888.png) +![](Screen-Shot-2023-03-27-at-3.33.54-PM-1024x888.jpg) *Figure 1. A high-level view of the Chronicle FIX failover mechanism and components* As Figure 1. shows, all the necessary components for failover are provided natively by Chronicle Software. diff --git a/content/posts/2023/04/08/instrumenting-java-code-to-find-and-handle-unused-classes/dead-code-workflow-f1b005fb.png b/content/posts/2023/04/08/instrumenting-java-code-to-find-and-handle-unused-classes/dead-code-workflow-f1b005fb.png new file mode 100644 index 000000000..84f7e6d2b Binary files /dev/null and b/content/posts/2023/04/08/instrumenting-java-code-to-find-and-handle-unused-classes/dead-code-workflow-f1b005fb.png differ diff --git a/content/posts/2023/04/08/instrumenting-java-code-to-find-and-handle-unused-classes/index.md b/content/posts/2023/04/08/instrumenting-java-code-to-find-and-handle-unused-classes/index.md index 2dc0ffec4..7a4d9d9ed 100644 --- a/content/posts/2023/04/08/instrumenting-java-code-to-find-and-handle-unused-classes/index.md +++ b/content/posts/2023/04/08/instrumenting-java-code-to-find-and-handle-unused-classes/index.md @@ -94,7 +94,7 @@ The tool consists of two main parts: * Instrumenting Agent: This agent is similar to the Instrumenter but is implemented as an instrumenting Java agent. Both instrumentation methods have advantages and disadvantages, which I will explain later. This leads us to the following workflow: -![](https://mostlynerdless.de/wp-content/uploads/2023/04/dead-code-workflow.png) Workflow of the dead-code analyzer +![](dead-code-workflow-f1b005fb.png) Workflow of the dead-code analyzer ## Usage diff --git a/content/posts/2023/04/11/hidden-beauties-of-java-enums/enumspic.jpg b/content/posts/2023/04/11/hidden-beauties-of-java-enums/enumspic.jpg new file mode 100644 index 000000000..573ad4204 Binary files /dev/null and b/content/posts/2023/04/11/hidden-beauties-of-java-enums/enumspic.jpg differ diff --git a/content/posts/2023/04/11/hidden-beauties-of-java-enums/enumspic.png b/content/posts/2023/04/11/hidden-beauties-of-java-enums/enumspic.png deleted file mode 100644 index 7ea7e7573..000000000 Binary files a/content/posts/2023/04/11/hidden-beauties-of-java-enums/enumspic.png and /dev/null differ diff --git a/content/posts/2023/04/11/hidden-beauties-of-java-enums/index.md b/content/posts/2023/04/11/hidden-beauties-of-java-enums/index.md index 8cd60b9a6..cd28a3636 100644 --- a/content/posts/2023/04/11/hidden-beauties-of-java-enums/index.md +++ b/content/posts/2023/04/11/hidden-beauties-of-java-enums/index.md @@ -6,7 +6,7 @@ description: "Java enums can contain much more than just a list of definitions, canonical: "https://webtechie.be/post/2023-03-22-hidden-beauties-of-java-enums/" authors: - "frankdelporte" -image: "enumspic.png" +image: "enumspic.jpg" categories: - "Java Beginner" - "JBang" diff --git a/content/posts/2023/04/11/hidden-beauties-of-java-enums/pi4j.jpg b/content/posts/2023/04/11/hidden-beauties-of-java-enums/pi4j.jpg new file mode 100644 index 000000000..0757f884e Binary files /dev/null and b/content/posts/2023/04/11/hidden-beauties-of-java-enums/pi4j.jpg differ diff --git a/content/posts/2023/04/11/hidden-beauties-of-java-enums/pi4j.png b/content/posts/2023/04/11/hidden-beauties-of-java-enums/pi4j.png deleted file mode 100644 index 4fc005fec..000000000 Binary files a/content/posts/2023/04/11/hidden-beauties-of-java-enums/pi4j.png and /dev/null differ diff --git a/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.04.05-PM-1024x614.jpg b/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.04.05-PM-1024x614.jpg new file mode 100644 index 000000000..c7fab9c66 Binary files /dev/null and b/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.04.05-PM-1024x614.jpg differ diff --git a/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.04.05-PM-1024x614.png b/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.04.05-PM-1024x614.png deleted file mode 100644 index 0fe93fedd..000000000 Binary files a/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.04.05-PM-1024x614.png and /dev/null differ diff --git a/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.04.38-PM-1024x706.jpg b/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.04.38-PM-1024x706.jpg new file mode 100644 index 000000000..c43b0e63a Binary files /dev/null and b/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.04.38-PM-1024x706.jpg differ diff --git a/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.04.38-PM-1024x706.png b/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.04.38-PM-1024x706.png deleted file mode 100644 index f6dbe82f3..000000000 Binary files a/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.04.38-PM-1024x706.png and /dev/null differ diff --git a/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.05.05-PM-1024x639.jpg b/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.05.05-PM-1024x639.jpg new file mode 100644 index 000000000..9ec10de4d Binary files /dev/null and b/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.05.05-PM-1024x639.jpg differ diff --git a/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.05.05-PM-1024x639.png b/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.05.05-PM-1024x639.png deleted file mode 100644 index bdf25d276..000000000 Binary files a/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.05.05-PM-1024x639.png and /dev/null differ diff --git a/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.08.13-PM-1024x678.jpg b/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.08.13-PM-1024x678.jpg new file mode 100644 index 000000000..fbd5cbc3b Binary files /dev/null and b/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.08.13-PM-1024x678.jpg differ diff --git a/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.08.13-PM-1024x678.png b/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.08.13-PM-1024x678.png deleted file mode 100644 index c799443e9..000000000 Binary files a/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/Screen-Shot-2023-04-03-at-2.08.13-PM-1024x678.png and /dev/null differ diff --git a/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/index.md b/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/index.md index a1924581a..2c730b933 100644 --- a/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/index.md +++ b/content/posts/2023/04/12/chronicle-fix-much-more-than-a-quick-fix/index.md @@ -55,7 +55,7 @@ Chronicle FIX is trusted by some of the world's largest financial institutions, The below diagram speaks for itself and shows Chronicle FIX multiple times faster than QuickFIX/J, with the ratio particularly noticeable at higher percentiles. -![](Screen-Shot-2023-04-03-at-2.04.05-PM-1024x614.png) +![](Screen-Shot-2023-04-03-at-2.04.05-PM-1024x614.jpg) Note: the benchmark exercises a full round trip i.e. it generates a NewOrderSingle (NOS) and sends it out from one FIX engine to another engine over localhost. @@ -69,7 +69,7 @@ Chronicle FIX has support for transparent session failover for initiators and ac We have customers who – as part of their standard deployment process, failover between FIX engines in milliseconds with no message loss. -![](Screen-Shot-2023-04-03-at-2.04.38-PM-1024x706.png) +![](Screen-Shot-2023-04-03-at-2.04.38-PM-1024x706.jpg) Additionally, there is a lightweight proxy component which supports common patterns such as load-balancing, transparent SSL etc. @@ -79,7 +79,7 @@ Chronicle FIX leverages Chronicle Queue Enterprise replication to achieve HA/DR, The below graph shows the send/ack round-trip/latency impact on the sender as the number of outstanding messages (u) varies. u=0 is fully synchronous replication. -![](Screen-Shot-2023-04-03-at-2.05.05-PM-1024x639.png) +![](Screen-Shot-2023-04-03-at-2.05.05-PM-1024x639.jpg) ### Features @@ -105,7 +105,7 @@ And all FIX messages are stored, indexed and are searchable with a sophisticated All important metrics, including latency numbers, are exposed via the monitoring features and can be surfaced in your monitoring tool of choice, e.g. [Grafana](https://grafana.com/ "Grafana") -![](Screen-Shot-2023-04-03-at-2.08.13-PM-1024x678.png) +![](Screen-Shot-2023-04-03-at-2.08.13-PM-1024x678.jpg) ### Commercial Support diff --git a/content/posts/2023/04/14/boldness-in-refactoring/Trapped-657x510.jpg b/content/posts/2023/04/14/boldness-in-refactoring/Trapped-657x510.jpg new file mode 100644 index 000000000..d876b12c1 Binary files /dev/null and b/content/posts/2023/04/14/boldness-in-refactoring/Trapped-657x510.jpg differ diff --git a/content/posts/2023/04/14/boldness-in-refactoring/Trapped-657x510.png b/content/posts/2023/04/14/boldness-in-refactoring/Trapped-657x510.png deleted file mode 100644 index 2e5c1be80..000000000 Binary files a/content/posts/2023/04/14/boldness-in-refactoring/Trapped-657x510.png and /dev/null differ diff --git a/content/posts/2023/04/14/boldness-in-refactoring/index.md b/content/posts/2023/04/14/boldness-in-refactoring/index.md index 76032e967..0fd800d81 100644 --- a/content/posts/2023/04/14/boldness-in-refactoring/index.md +++ b/content/posts/2023/04/14/boldness-in-refactoring/index.md @@ -30,7 +30,7 @@ It's more like a bad apple in a barrel. Bad code and forbidden zones tend to gro When we have a flexible team with a relatively small and familiar code base, touching everything isn't challenging. It's easy in that case. -[![](Trapped-657x510.png)](https://www.goodtechthings.com/locked-in/) +[![](Trapped-657x510.jpg)](https://www.goodtechthings.com/locked-in/) ## The Legacy Project diff --git a/content/posts/2023/04/17/foojay-podcast-19/index.md b/content/posts/2023/04/17/foojay-podcast-19/index.md index 08d485acf..dfb5c888d 100644 --- a/content/posts/2023/04/17/foojay-podcast-19/index.md +++ b/content/posts/2023/04/17/foojay-podcast-19/index.md @@ -8,7 +8,7 @@ authors: - "lukas-eder" - "mthmulders" - "timtebeek" -image: "podcast-guests-rich-and-famous-1024x577-1.png" +image: "podcast-guests-rich-and-famous-1024x577-1.jpg" categories: - "Developer Tools" - "Interviews" @@ -60,7 +60,7 @@ You can listen and subscribe to the Foojay Podcast on: * * -![](podcast-guests-rich-and-famous-1024x577.png) +![](podcast-guests-rich-and-famous-1024x577.jpg) ## Content diff --git a/content/posts/2023/04/17/foojay-podcast-19/podcast-guests-rich-and-famous-1024x577-1.jpg b/content/posts/2023/04/17/foojay-podcast-19/podcast-guests-rich-and-famous-1024x577-1.jpg new file mode 100644 index 000000000..944ecf4e9 Binary files /dev/null and b/content/posts/2023/04/17/foojay-podcast-19/podcast-guests-rich-and-famous-1024x577-1.jpg differ diff --git a/content/posts/2023/04/17/foojay-podcast-19/podcast-guests-rich-and-famous-1024x577-1.png b/content/posts/2023/04/17/foojay-podcast-19/podcast-guests-rich-and-famous-1024x577-1.png deleted file mode 100644 index 9c17f20a8..000000000 Binary files a/content/posts/2023/04/17/foojay-podcast-19/podcast-guests-rich-and-famous-1024x577-1.png and /dev/null differ diff --git a/content/posts/2023/04/17/foojay-podcast-19/podcast-guests-rich-and-famous-1024x577.jpg b/content/posts/2023/04/17/foojay-podcast-19/podcast-guests-rich-and-famous-1024x577.jpg new file mode 100644 index 000000000..944ecf4e9 Binary files /dev/null and b/content/posts/2023/04/17/foojay-podcast-19/podcast-guests-rich-and-famous-1024x577.jpg differ diff --git a/content/posts/2023/04/17/foojay-podcast-19/podcast-guests-rich-and-famous-1024x577.png b/content/posts/2023/04/17/foojay-podcast-19/podcast-guests-rich-and-famous-1024x577.png deleted file mode 100644 index 9c17f20a8..000000000 Binary files a/content/posts/2023/04/17/foojay-podcast-19/podcast-guests-rich-and-famous-1024x577.png and /dev/null differ diff --git a/content/posts/2023/04/18/not-your-grandfathers-logs-a-java-librarys-new-approach-to-observability/index.md b/content/posts/2023/04/18/not-your-grandfathers-logs-a-java-librarys-new-approach-to-observability/index.md index bad9fab84..277a58493 100644 --- a/content/posts/2023/04/18/not-your-grandfathers-logs-a-java-librarys-new-approach-to-observability/index.md +++ b/content/posts/2023/04/18/not-your-grandfathers-logs-a-java-librarys-new-approach-to-observability/index.md @@ -26,7 +26,7 @@ We need a new metaphor, I argued, as traditional logging is prone to anti-patter More generally speaking, they don't offer a good way to specify intent. As a result, the logs become muddled with debugging messages, excavation attempts, warnings, and notices, to the point where we actually need AI systems to try and make sense of our mess. -[![](twitter-362x510.png)](https://twitter.com/PR0GRAMMERHUM0R/status/1634902085228539905?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1634902085228539905%7Ctwgr%5E3f7b17a90d093b9c894fa7947b4e563a79dc5ad2%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fcdn.embedly.com%2Fwidgets%2Fmedia.html%3Ftype%3Dtext2Fhtmlkey%3Da19fcc184b9711e1b4764040d3dc5c07schema%3Dtwitterurl%3Dhttps3A%2F%2Ftwitter.com%2FPR0GRAMMERHUM0R%2Fstatus%2F16349020852285399053Fs3D20image%3Dhttps3A%2F%2Fi.embed.ly%2F1%2Fimage3Furl3Dhttps253A252F252Fabs.twimg.com252Ferrors252Flogo46x38.png26key3Da19fcc184b9711e1b4764040d3dc5c07 "![](https://foojay.io/wp-content/uploads/2023/04/twitter-362x510.png)") +[![](twitter-362x510.png)](https://twitter.com/PR0GRAMMERHUM0R/status/1634902085228539905?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1634902085228539905%7Ctwgr%5E3f7b17a90d093b9c894fa7947b4e563a79dc5ad2%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fcdn.embedly.com%2Fwidgets%2Fmedia.html%3Ftype%3Dtext2Fhtmlkey%3Da19fcc184b9711e1b4764040d3dc5c07schema%3Dtwitterurl%3Dhttps3A%2F%2Ftwitter.com%2FPR0GRAMMERHUM0R%2Fstatus%2F16349020852285399053Fs3D20image%3Dhttps3A%2F%2Fi.embed.ly%2F1%2Fimage3Furl3Dhttps253A252F252Fabs.twimg.com252Ferrors252Flogo46x38.png26key3Da19fcc184b9711e1b4764040d3dc5c07 "![](twitter-362x510.png)") Newer standards such as OTEL have introduced new ways by which to holistically view logging, tracing, and metrics. These seem to demand similar innovation in the verbs and metaphors we use in our code in using them. diff --git a/content/posts/2023/04/20/automatically-creating-microservices-architecture-diagrams/chronicle-sd-tool.jpg b/content/posts/2023/04/20/automatically-creating-microservices-architecture-diagrams/chronicle-sd-tool.jpg new file mode 100644 index 000000000..312ea45f3 Binary files /dev/null and b/content/posts/2023/04/20/automatically-creating-microservices-architecture-diagrams/chronicle-sd-tool.jpg differ diff --git a/content/posts/2023/04/20/automatically-creating-microservices-architecture-diagrams/chronicle-sd-tool.png b/content/posts/2023/04/20/automatically-creating-microservices-architecture-diagrams/chronicle-sd-tool.png deleted file mode 100644 index 5a176aac5..000000000 Binary files a/content/posts/2023/04/20/automatically-creating-microservices-architecture-diagrams/chronicle-sd-tool.png and /dev/null differ diff --git a/content/posts/2023/04/20/automatically-creating-microservices-architecture-diagrams/index.md b/content/posts/2023/04/20/automatically-creating-microservices-architecture-diagrams/index.md index 28e387578..a3bb60072 100644 --- a/content/posts/2023/04/20/automatically-creating-microservices-architecture-diagrams/index.md +++ b/content/posts/2023/04/20/automatically-creating-microservices-architecture-diagrams/index.md @@ -5,7 +5,7 @@ lastmod: "2023-06-29T06:38:44+00:00" description: "Upload a JAR, search for YAML, create a DOT, convert this to a PNG, all taking place behind the scenes, with just a click of a button." authors: - "jasmine-taylor" -image: "chronicle-sd-tool.png" +image: "chronicle-sd-tool.jpg" categories: - "Chronicle Software" - "Cloud" diff --git a/content/posts/2023/04/24/foojay-podcast-20/guests-podcast-functional-programming-1024x575-1.jpg b/content/posts/2023/04/24/foojay-podcast-20/guests-podcast-functional-programming-1024x575-1.jpg new file mode 100644 index 000000000..22605da19 Binary files /dev/null and b/content/posts/2023/04/24/foojay-podcast-20/guests-podcast-functional-programming-1024x575-1.jpg differ diff --git a/content/posts/2023/04/24/foojay-podcast-20/guests-podcast-functional-programming-1024x575-1.png b/content/posts/2023/04/24/foojay-podcast-20/guests-podcast-functional-programming-1024x575-1.png deleted file mode 100644 index 902a9b79b..000000000 Binary files a/content/posts/2023/04/24/foojay-podcast-20/guests-podcast-functional-programming-1024x575-1.png and /dev/null differ diff --git a/content/posts/2023/04/24/foojay-podcast-20/guests-podcast-functional-programming-1024x575.jpg b/content/posts/2023/04/24/foojay-podcast-20/guests-podcast-functional-programming-1024x575.jpg new file mode 100644 index 000000000..22605da19 Binary files /dev/null and b/content/posts/2023/04/24/foojay-podcast-20/guests-podcast-functional-programming-1024x575.jpg differ diff --git a/content/posts/2023/04/24/foojay-podcast-20/guests-podcast-functional-programming-1024x575.png b/content/posts/2023/04/24/foojay-podcast-20/guests-podcast-functional-programming-1024x575.png deleted file mode 100644 index 902a9b79b..000000000 Binary files a/content/posts/2023/04/24/foojay-podcast-20/guests-podcast-functional-programming-1024x575.png and /dev/null differ diff --git a/content/posts/2023/04/24/foojay-podcast-20/index.md b/content/posts/2023/04/24/foojay-podcast-20/index.md index ddc5f218c..af858ef22 100644 --- a/content/posts/2023/04/24/foojay-podcast-20/index.md +++ b/content/posts/2023/04/24/foojay-podcast-20/index.md @@ -8,7 +8,7 @@ authors: - "deepu-sasidharan" - "frankdelporte" - "ties-van-de-ven" -image: "guests-podcast-functional-programming-1024x575-1.png" +image: "guests-podcast-functional-programming-1024x575-1.jpg" categories: - "Opinion" - "Podcast" @@ -58,7 +58,7 @@ You can listen and subscribe to the Foojay Podcast on: * * -![](guests-podcast-functional-programming-1024x575.png) +![](guests-podcast-functional-programming-1024x575.jpg) ## Links diff --git a/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/image-1-fd7a5009.jpg b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/image-1-fd7a5009.jpg new file mode 100644 index 000000000..f5e53dc82 Binary files /dev/null and b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/image-1-fd7a5009.jpg differ diff --git a/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/image-2-666fcf0e.jpg b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/image-2-666fcf0e.jpg new file mode 100644 index 000000000..5499cccc1 Binary files /dev/null and b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/image-2-666fcf0e.jpg differ diff --git a/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/image-d169e5c3.png b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/image-d169e5c3.png new file mode 100644 index 000000000..449ebd968 Binary files /dev/null and b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/image-d169e5c3.png differ diff --git a/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/index.md b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/index.md index b43e0aaab..0dbcd53ce 100644 --- a/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/index.md +++ b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/index.md @@ -20,10 +20,10 @@ frozen: false I'm keenly interested in everything related to profiling on the JVM, especially if it is related to AsyncGetCallTrace, this tiny unofficial API that powers most profilers out there, heck, I'm even in the process of adding an [improved version to the OpenJDK](https://mostlynerdless.de/blog/2023/01/19/asyncgetstacktrace-a-better-stack-trace-api-for-the-jvm/), AsyncGetStackTrace. During the discussions on the related JDK enhancement proposal and PRs fixing AsyncGetCallTrace bugs, one thing often arises: Why is AsyncGetCallTrace always called in the signal handler on top of the stack that we want to walk (like in my [Writing a Profiler from Scratch](https://mostlynerdless.de/blog/tag/writing-a-profiler-from-scratch/) series)? -![](https://mostlynerdless.de/wp-content/uploads/2023/04/wall-clock-sampling-sequence.drawio-1.svg) Interaction between the wall-clock sampler thread and the different signal handlers, as currently implemented in async-profiler. +![](wall-clock-sampling-sequence.drawio-1-9a4c0a1c.svg) Interaction between the wall-clock sampler thread and the different signal handlers, as currently implemented in async-profiler. JDK Flight Recorder (JFR) does not do this; it instead [walks the stack in the sampler thread](https://github.com/openjdk/jdk/blob/d8af7a6014055295355a1242db6c2872299c6398/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTrace.cpp#L232) while pausing the sampled thread (implemented with a [SuspendedThreadTask](https://github.com/openjdk/jdk/blob/4539899c55c77771b951d005c17550ef9ac94819/src/hotspot/os/posix/signals_posix.cpp#L1833)). -![](https://mostlynerdless.de/wp-content/uploads/2023/04/wall-clock-sampling-sequence-Page-2.drawio-1.svg) Interaction between the sampler thread and the signal handlers, as currently implemented in JFR. +![](wall-clock-sampling-sequence-Page-2.draw-a9a45d92.svg) Interaction between the sampler thread and the signal handlers, as currently implemented in JFR. *Update after talks on the JEP: The recommended way to use AsyncGetStackTrace will be to call it in a separate thread.* @@ -246,7 +246,7 @@ This ensures that the `_thread_data` is only set if it is null. Such operations Coming back to the signal handler implementation: The `waitWhile` method is a helper method that busy waits until the passed predicate does return false or the optional timeout is exhausted, ensuring that the profiler does not hang if something goes wrong. The implementation uses the `_thread_data` variable to implement its synchronization protocol: -![](https://mostlynerdless.de/wp-content/uploads/2023/04/wall-clock-sampling-sequence-Page-3.drawio1.svg) Interaction between the sampler thread and the signal handler. +![](wall-clock-sampling-sequence-Page-3.draw-8cc5c75a.svg) Interaction between the sampler thread and the signal handler. You can find the implementation in my [async-profiler fork](https://github.com/parttimenerd/async-profiler/tree/dont_use_thread_current), but as with my OpenJDK fork: It's only a rough implementation. @@ -397,20 +397,20 @@ This prevents all crashes related to walking the stack from crashing the JVM, wh Back to this peculiar case: The implementation in async-profiler is slightly more complex than just removing the busy waiting at the end. First, we must copy the ucontext in the signal handler because the ucontext pointer only points to a valid ucontext while the thread is stopped. Furthermore, we have to disable the native stack walking in the async-profiler, as it isn't wrapped in code that catches crashes. We also have, for unknown reasons, to set the `safemode` option of async-profiler to 0. The implementation of the signal handler is simple (just remove the wait from the previous version). It results in the following sequence diagram: -![](https://mostlynerdless.de/wp-content/uploads/2023/04/wall-clock-sampling-sequence-Copy-of-Page-3.drawio.svg) Interaction between the sampler thread and the signal handlers when not blocking the sampled thread during the stack walking. +![](wall-clock-sampling-sequence-Copy-of-Pag-ffbd8ce2.svg) Interaction between the sampler thread and the signal handlers when not blocking the sampled thread during the stack walking. You can find the implementation on [GitHub](https://github.com/parttimenerd/async-profiler/tree/dont_use_thread_current2_experimental), albeit with known concurrency problems, but these are out-of-scope for this blog post and related to copying the ucontext atomically. And now to the important question: How often did AsyncGetCallTrace crash? In the renaissance finagle-http benchmark (with a sampling interval of 10ms), it crashed in 592 of around 808000 calls, a crash rate of 0.07% and far better than expected. The main problem can be seen when we look at the flame graphs (set the environment variable `SKIP_WAIT` to enable the modification): -![](https://mostlynerdless.de/wp-content/uploads/2023/04/image.png) +![](image-d169e5c3.png) Which looks not too dissimilar to the flame graph with busy waiting: -![](https://mostlynerdless.de/wp-content/uploads/2023/04/image-1.png) +![](image-1-fd7a5009.jpg) Many traces (the left part of the graph) are broken and do not appear in the second flame graph. Many of these traces seem to be aborted: -![](https://mostlynerdless.de/wp-content/uploads/2023/04/image-2.png) +![](image-2-666fcf0e.jpg) But this was an interesting experiment, and the implementation seems to be possible, albeit creating a safe and accurate profiler would be hard and probably not worthwhile: Catching the segmentation faults seems to be quite expensive: The runtime for the renaissance finagle-http benchmark is 83 seconds for the version with busy waiting and 84 seconds without, despite producing worse results. @@ -427,10 +427,10 @@ java -agentpath:./build/lib/libasyncProfiler.so=start,\ ``` The shorter interval will make the performance impact of changes to the profiling more impactful. I'm profiling with my Threadripper 3995WX on Ubuntu using [hyperfine](https://github.com/sharkdp/hyperfine) (one warm-up run and ten measured runs each). The standard deviation is less than 0.4% in the following diagram, which shows the wall-clock time: -![](https://mostlynerdless.de/wp-content/uploads/2023/04/re_dotty_wc-2.svg) +![](re_dotty_wc-2-c6dee35e.svg) The number of obtained samples is roughly the same overall profiler runs, except for the experimental implementation, which produces around 12% fewer samples. All approaches seem to have a comparable overhead when considering wall-clock time. It's different considering the user-time: -![](https://mostlynerdless.de/wp-content/uploads/2023/04/re_dotty_ut-1.svg) +![](re_dotty_ut-1-e521db68.svg) This shows that there is a significant user-time performance penalty when not using the original approach. This is expected, as we're engaging two threads into one during the sampling of a specific threadTherefore, the wall-clock timings might. diff --git a/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/re_dotty_ut-1-e521db68.svg b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/re_dotty_ut-1-e521db68.svg new file mode 100644 index 000000000..ff4aee925 --- /dev/null +++ b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/re_dotty_ut-1-e521db68.svg @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0% + + + 5.0% + + + 10.0% + + + 15.0% + + + 20.0% + + + 25.0% + + + 1ms interval + + + 10ms interval + + + renaissance dotty user + + + - + + + time overhead + + + + + + original + + + + + + approach 1 + + + + + + approach 2 + + + + + + experiment + + + diff --git a/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/re_dotty_wc-2-c6dee35e.svg b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/re_dotty_wc-2-c6dee35e.svg new file mode 100644 index 000000000..ba395a8a6 --- /dev/null +++ b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/re_dotty_wc-2-c6dee35e.svg @@ -0,0 +1,239 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0% + + + 1.0% + + + 2.0% + + + 3.0% + + + 4.0% + + + 5.0% + + + 6.0% + + + 1ms interval + + + 10ms interval + + + renaissance dotty overhead + + + + + + original + + + + + + approach 1 + + + + + + approach 2 + + + + + + experiment + + + diff --git a/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/wall-clock-sampling-sequence-Copy-of-Pag-ffbd8ce2.svg b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/wall-clock-sampling-sequence-Copy-of-Pag-ffbd8ce2.svg new file mode 100644 index 000000000..c3b39357f --- /dev/null +++ b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/wall-clock-sampling-sequence-Copy-of-Pag-ffbd8ce2.svg @@ -0,0 +1,84 @@ + + + + + + + + + + Thread 1 + + + + + + + Thread 2 + + + + + + + Sampler + + + + + + walk thread 1 + + + + + + + + wait + + + + + + + + _uncontext = ... + + + + + + + signal + + + + + + + + _ucontext = null + + + + + + walk thread 1 + + + + + + + ... + + + + + + + Text is not SVG - cannot display + + + diff --git a/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/wall-clock-sampling-sequence-Page-2.draw-a9a45d92.svg b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/wall-clock-sampling-sequence-Page-2.draw-a9a45d92.svg new file mode 100644 index 000000000..dc05ff3e2 --- /dev/null +++ b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/wall-clock-sampling-sequence-Page-2.draw-a9a45d92.svg @@ -0,0 +1,112 @@ + + + + + + + + + + Thread 1 + + + + + + + block + + + + + + + signal + + + + + + + unblock + + + + + + + Thread 2 + + + + + + + Sampler + + + + + + + + walk thread 1 + + + + + + + signal + + + + + + + ... + + + + + + + unblock + + + + + + + + block + + + + + + walk thread 2 + + + + + + + blocked + + + + + + + blocked + + + + + + + Text is not SVG - cannot display + + + diff --git a/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/wall-clock-sampling-sequence-Page-3.draw-8cc5c75a.svg b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/wall-clock-sampling-sequence-Page-3.draw-8cc5c75a.svg new file mode 100644 index 000000000..262afb315 --- /dev/null +++ b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/wall-clock-sampling-sequence-Page-3.draw-8cc5c75a.svg @@ -0,0 +1,99 @@ + + + + + + + + + + Thread 1 + + + + + + + Thread 2 + + + + + + + Sampler + + + + + + walk thread 1 + + + + + + + + + + wait + + + + + + + + _data = ... + + + + + + + signal + + + + + + + + _data = null + + + + + + _data = null + + + + + + + wait + + + + + + walk thread 1 + + + + + + + ... + + + + + + + Text is not SVG - cannot display + + + diff --git a/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/wall-clock-sampling-sequence.drawio-1-9a4c0a1c.svg b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/wall-clock-sampling-sequence.drawio-1-9a4c0a1c.svg new file mode 100644 index 000000000..712caa6ec --- /dev/null +++ b/content/posts/2023/04/25/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/wall-clock-sampling-sequence.drawio-1-9a4c0a1c.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + Thread 1 + + + + + + + + Walk Stack + + + + + + + signal + + + + + + + Thread 2 + + + + + + + Walk Stack + + + + + + + Sampler + + + + + + + + sleep + + + + + + + signal + + + + + + signal + + + + + + + ... + + + + + + + Text is not SVG - cannot display + + + diff --git a/content/posts/2023/04/26/fuchs-2023-fepcos-j-01/fuchs2023fepcos-j-toy-robots-are-parts-of-current-test-and-development-environment.jpg b/content/posts/2023/04/26/fuchs-2023-fepcos-j-01/fuchs2023fepcos-j-toy-robots-are-parts-of-current-test-and-development-environment.jpg new file mode 100644 index 000000000..cda3266d8 Binary files /dev/null and b/content/posts/2023/04/26/fuchs-2023-fepcos-j-01/fuchs2023fepcos-j-toy-robots-are-parts-of-current-test-and-development-environment.jpg differ diff --git a/content/posts/2023/04/26/fuchs-2023-fepcos-j-01/fuchs2023fepcos-j-toy-robots-are-parts-of-current-test-and-development-environment.png b/content/posts/2023/04/26/fuchs-2023-fepcos-j-01/fuchs2023fepcos-j-toy-robots-are-parts-of-current-test-and-development-environment.png deleted file mode 100644 index aa4a51a91..000000000 Binary files a/content/posts/2023/04/26/fuchs-2023-fepcos-j-01/fuchs2023fepcos-j-toy-robots-are-parts-of-current-test-and-development-environment.png and /dev/null differ diff --git a/content/posts/2023/04/26/fuchs-2023-fepcos-j-01/index.md b/content/posts/2023/04/26/fuchs-2023-fepcos-j-01/index.md index c4ef7ec98..7fe1216b2 100644 --- a/content/posts/2023/04/26/fuchs-2023-fepcos-j-01/index.md +++ b/content/posts/2023/04/26/fuchs-2023-fepcos-j-01/index.md @@ -5,7 +5,7 @@ lastmod: "2023-04-26T08:29:52+00:00" description: "FEPCOS-J implements a Java-language extension that frees a Java-developer from network programming and supports cross-system concurrency." authors: - "gerhard-fuchs" -image: "fuchs2023fepcos-j-toy-robots-are-parts-of-current-test-and-development-environment.png" +image: "fuchs2023fepcos-j-toy-robots-are-parts-of-current-test-and-development-environment.jpg" categories: - "Developer Tools" - "Raspberry Pi" @@ -29,7 +29,7 @@ You can contribute so that FEPCOS-J becomes *Free/Libre and Open-Source Software When I was a child, I loved to create things out of building blocks — this has never changed (Fig. 1). It is a pleasure for me to compose parts into a new whole. This also applies for programming. -{{< img src="fuchs2023fepcos-j-toy-robots-are-parts-of-current-test-and-development-environment.png" class="aligncenter size-full is-resized" alt="See two toy robots that are constructed out of building blocks. A Raspberry Pi Model 3B that is installed on each robot controls them. The robots run Linux, OpenJDK 17, and FEPCOS-J." width="540" height="432" caption="Fig. 1) Parts of the current test environment for FEPCOS-J: I have built these two toy robots to test and demonstrate the use of FEPCOS-J. The two robots can be used independently of each other. In addition, they can be composed into a swarm. Both each individual robot and the swarm are example systems. FEPCOS-J enables a developer to declaratively program those systems so that they are controllable via an IPv4-network." >}} +{{< img src="fuchs2023fepcos-j-toy-robots-are-parts-of-current-test-and-development-environment.jpg" class="aligncenter size-full is-resized" alt="See two toy robots that are constructed out of building blocks. A Raspberry Pi Model 3B that is installed on each robot controls them. The robots run Linux, OpenJDK 17, and FEPCOS-J." width="540" height="432" caption="Fig. 1) Parts of the current test environment for FEPCOS-J: I have built these two toy robots to test and demonstrate the use of FEPCOS-J. The two robots can be used independently of each other. In addition, they can be composed into a swarm. Both each individual robot and the swarm are example systems. FEPCOS-J enables a developer to declaratively program those systems so that they are controllable via an IPv4-network." >}} I am a computer scientist who has researched and worked in the field of robot sensor networks since 2004. A network I have worked on was based on Java-programmable SunSPOTs (spots). \[[1,2,3](#references)\]. diff --git a/content/posts/2023/04/27/java-developer-vs-chatgpt-part-i-writing-a-spring-boot-microservice/grid_0-700x350-1.jpg b/content/posts/2023/04/27/java-developer-vs-chatgpt-part-i-writing-a-spring-boot-microservice/grid_0-700x350-1.jpg new file mode 100644 index 000000000..a0148c230 Binary files /dev/null and b/content/posts/2023/04/27/java-developer-vs-chatgpt-part-i-writing-a-spring-boot-microservice/grid_0-700x350-1.jpg differ diff --git a/content/posts/2023/04/27/java-developer-vs-chatgpt-part-i-writing-a-spring-boot-microservice/grid_0-700x350-1.png b/content/posts/2023/04/27/java-developer-vs-chatgpt-part-i-writing-a-spring-boot-microservice/grid_0-700x350-1.png deleted file mode 100644 index 8596ea88c..000000000 Binary files a/content/posts/2023/04/27/java-developer-vs-chatgpt-part-i-writing-a-spring-boot-microservice/grid_0-700x350-1.png and /dev/null differ diff --git a/content/posts/2023/04/27/java-developer-vs-chatgpt-part-i-writing-a-spring-boot-microservice/index.md b/content/posts/2023/04/27/java-developer-vs-chatgpt-part-i-writing-a-spring-boot-microservice/index.md index f6627f84f..013f5f79a 100644 --- a/content/posts/2023/04/27/java-developer-vs-chatgpt-part-i-writing-a-spring-boot-microservice/index.md +++ b/content/posts/2023/04/27/java-developer-vs-chatgpt-part-i-writing-a-spring-boot-microservice/index.md @@ -5,7 +5,7 @@ lastmod: "2023-05-03T07:43:19+00:00" description: "Pitting a seasoned Java developer against the all-knowing generative AI to find out... can AI generate a Java microservice end-to-end?" authors: - "roni-dover" -image: "grid_0-700x350-1.png" +image: "grid_0-700x350-1.jpg" categories: - "Cloud" - "Microservices" diff --git a/content/posts/2023/05/01/foojay-podcast-21/index.md b/content/posts/2023/05/01/foojay-podcast-21/index.md index e306e73e1..fda812890 100644 --- a/content/posts/2023/05/01/foojay-podcast-21/index.md +++ b/content/posts/2023/05/01/foojay-podcast-21/index.md @@ -54,7 +54,7 @@ You can listen and subscribe to the Foojay Podcast on: * [@frankdelporte@foojay.social](https://foojay.social/@frankdelporte) * -![](podcast-guests-brazil-jug-1024x577.png) +![](podcast-guests-brazil-jug-1024x577.jpg) ## Links diff --git a/content/posts/2023/05/01/foojay-podcast-21/podcast-guests-brazil-jug-1024x577.jpg b/content/posts/2023/05/01/foojay-podcast-21/podcast-guests-brazil-jug-1024x577.jpg new file mode 100644 index 000000000..3e480ea39 Binary files /dev/null and b/content/posts/2023/05/01/foojay-podcast-21/podcast-guests-brazil-jug-1024x577.jpg differ diff --git a/content/posts/2023/05/01/foojay-podcast-21/podcast-guests-brazil-jug-1024x577.png b/content/posts/2023/05/01/foojay-podcast-21/podcast-guests-brazil-jug-1024x577.png deleted file mode 100644 index f963305a8..000000000 Binary files a/content/posts/2023/05/01/foojay-podcast-21/podcast-guests-brazil-jug-1024x577.png and /dev/null differ diff --git a/content/posts/2023/05/02/optaplanner-continues-as-timefold/index.md b/content/posts/2023/05/02/optaplanner-continues-as-timefold/index.md index b7dfa80d4..e8ec78001 100644 --- a/content/posts/2023/05/02/optaplanner-continues-as-timefold/index.md +++ b/content/posts/2023/05/02/optaplanner-continues-as-timefold/index.md @@ -5,7 +5,7 @@ lastmod: "2023-05-02T15:24:37+00:00" description: "Timefold continues OptaPlanner, open source project optimizing operational planning, saving thousands of organizations time, money, resources." authors: - "geoffrey-de-smet" -image: "timefold.png" +image: "timefold.jpg" categories: - "Machine Learning" - "Press" diff --git a/content/posts/2023/05/02/optaplanner-continues-as-timefold/timefold.jpg b/content/posts/2023/05/02/optaplanner-continues-as-timefold/timefold.jpg new file mode 100644 index 000000000..4699931c8 Binary files /dev/null and b/content/posts/2023/05/02/optaplanner-continues-as-timefold/timefold.jpg differ diff --git a/content/posts/2023/05/02/optaplanner-continues-as-timefold/timefold.png b/content/posts/2023/05/02/optaplanner-continues-as-timefold/timefold.png deleted file mode 100644 index 7701bff0e..000000000 Binary files a/content/posts/2023/05/02/optaplanner-continues-as-timefold/timefold.png and /dev/null differ diff --git a/content/posts/2023/05/04/using-async-profiler-and-jattach-programmatically-with-ap-loader/Untitled2.jpg b/content/posts/2023/05/04/using-async-profiler-and-jattach-programmatically-with-ap-loader/Untitled2.jpg new file mode 100644 index 000000000..677a5f0a5 Binary files /dev/null and b/content/posts/2023/05/04/using-async-profiler-and-jattach-programmatically-with-ap-loader/Untitled2.jpg differ diff --git a/content/posts/2023/05/04/using-async-profiler-and-jattach-programmatically-with-ap-loader/Untitled2.png b/content/posts/2023/05/04/using-async-profiler-and-jattach-programmatically-with-ap-loader/Untitled2.png deleted file mode 100644 index 06a78aaa5..000000000 Binary files a/content/posts/2023/05/04/using-async-profiler-and-jattach-programmatically-with-ap-loader/Untitled2.png and /dev/null differ diff --git a/content/posts/2023/05/04/using-async-profiler-and-jattach-programmatically-with-ap-loader/index.md b/content/posts/2023/05/04/using-async-profiler-and-jattach-programmatically-with-ap-loader/index.md index 1e04fec7a..d3ef8bd4b 100644 --- a/content/posts/2023/05/04/using-async-profiler-and-jattach-programmatically-with-ap-loader/index.md +++ b/content/posts/2023/05/04/using-async-profiler-and-jattach-programmatically-with-ap-loader/index.md @@ -5,7 +5,7 @@ lastmod: "2023-05-04T11:45:22+00:00" description: "AP-Loader wraps async-profiler and its tools with an API in a cross-platform JAR. This article is about the API." authors: - "johannes-bechberger" -image: "Untitled2.png" +image: "Untitled2.jpg" categories: - "Performance" - "Tools" @@ -22,7 +22,7 @@ Using [async-profiler](https://github.com/jvm-profiling-tools/async-profilerhttp It gets worse if you want to embed it into your library, agent, or application. Library developers cannot just use maven dependency but have to create wrapper code and build scripts that deal with packaging the binaries themselves, or worse, they depend on a preinstalled version which they do not control. In November 2022, I started the ap-loader project to remedy this situation: I wrapped async-profiler and jattach in a platform-independent JAR which can be pulled from maven central. I already wrote an article on its essential features: [AP-Loader: A new way to use and embed async-profiler](https://mostlynerdless.de/blog/2022/11/21/ap-loader-a-new-way-to-use-and-embed-async-profiler/). -![Flamegraph for a recording of profiling data for the dacapo benchmark suite](https://mostlynerdless.de/wp-content/uploads/2022/11/Untitled2.png) +![Flamegraph for a recording of profiling data for the dacapo benchmark suite](Untitled2.jpg) In this article, I'm focusing on its programmatic usage: Async-profiler can be used in a library to gather profiling data of the current or a different process, but the profiler distribution contains more: It contains converters to convert from JFR to flamegraphs, and [jattach](https://github.com/jattach/jattach) to attach a native agent dynamically to (potentially the current) JVM and send commands to it. diff --git a/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/3dgraphics-970x1024.jpg b/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/3dgraphics-970x1024.jpg new file mode 100644 index 000000000..c536af1e6 Binary files /dev/null and b/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/3dgraphics-970x1024.jpg differ diff --git a/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/3dgraphics-970x1024.png b/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/3dgraphics-970x1024.png deleted file mode 100644 index bc6d7a0da..000000000 Binary files a/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/3dgraphics-970x1024.png and /dev/null differ diff --git a/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/index.md b/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/index.md index 41965e01c..921378423 100644 --- a/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/index.md +++ b/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/index.md @@ -26,7 +26,7 @@ aliases: {{< gallery >}} rubikscube-319x510.png 3dcar-415x510.png -minecraft-645x510.png +minecraft-645x510.jpg {{< /gallery >}} ***Let's start with the first mystery... Who is behind the @Orango_Mango account? Can you introduce yourself?*** @@ -58,7 +58,7 @@ For example, Minecraft is made in Java, and was my inspiration for a 3D engine. {{< gallery >}} minecraft-trees.png minecraft-water.png -3dgraphics-970x1024.png +3dgraphics-970x1024.jpg {{< /gallery >}} ***Java and JavaFX on mobile is indeed a very nice approach and doesn't get the amount of attention it deserves. I guess you know the work Gluon is doing on this topic? If not, please take a look at [their docs](https://docs.gluonhq.com/#platforms_android).*** diff --git a/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/minecraft-645x510.jpg b/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/minecraft-645x510.jpg new file mode 100644 index 000000000..ae6a20cd9 Binary files /dev/null and b/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/minecraft-645x510.jpg differ diff --git a/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/minecraft-645x510.png b/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/minecraft-645x510.png deleted file mode 100644 index 8f73275f3..000000000 Binary files a/content/posts/2023/05/08/interview-with-paul-kocian-aka-orango_mango/minecraft-645x510.png and /dev/null differ diff --git a/content/posts/2023/05/08/presenting-xpipe/230098966-000596ca-8167-4cb8-8ada-f6b3a7-9cbb5fc0.jpg b/content/posts/2023/05/08/presenting-xpipe/230098966-000596ca-8167-4cb8-8ada-f6b3a7-9cbb5fc0.jpg new file mode 100644 index 000000000..65ce481fa Binary files /dev/null and b/content/posts/2023/05/08/presenting-xpipe/230098966-000596ca-8167-4cb8-8ada-f6b3a7-9cbb5fc0.jpg differ diff --git a/content/posts/2023/05/08/presenting-xpipe/230100929-4476f76c-ea81-43d9-ac4a-b3b02d-28c4c83b.png b/content/posts/2023/05/08/presenting-xpipe/230100929-4476f76c-ea81-43d9-ac4a-b3b02d-28c4c83b.png new file mode 100644 index 000000000..19097bf19 Binary files /dev/null and b/content/posts/2023/05/08/presenting-xpipe/230100929-4476f76c-ea81-43d9-ac4a-b3b02d-28c4c83b.png differ diff --git a/content/posts/2023/05/08/presenting-xpipe/index.md b/content/posts/2023/05/08/presenting-xpipe/index.md index 235522016..22aca8673 100644 --- a/content/posts/2023/05/08/presenting-xpipe/index.md +++ b/content/posts/2023/05/08/presenting-xpipe/index.md @@ -177,7 +177,7 @@ The initial work went into a remote connection management feature that allows yo Any stored sensitive login information is encrypted and can also be locked behind a master password, similar to password managers. -![Connection manager](https://user-images.githubusercontent.com/72509152/230098966-000596ca-8167-4cb8-8ada-f6b3a7d482e2.png) +![Connection manager](230098966-000596ca-8167-4cb8-8ada-f6b3a7-9cbb5fc0.jpg) ### Remote file management @@ -187,7 +187,7 @@ For this reason, there are already plenty of established remote file managers ou So why not take our remote process handling implementation and also try to apply it to file management? By using file system related commands such as `ls`, `rm`, `touch`, etc. and its equivalents, we can realize a functional file manager that can connect to essentially every system and doesn't require any setup. This is exactly what you can see in action here: -![Remote file explorer](https://user-images.githubusercontent.com/72509152/230100929-4476f76c-ea81-43d9-ac4a-b3b02df2334e.png) +![Remote file explorer](230100929-4476f76c-ea81-43d9-ac4a-b3b02d-28c4c83b.png) ### Integrating with the user's toolbox diff --git a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/drop-focus.jpg b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/drop-focus.jpg new file mode 100644 index 000000000..ee9b1d1ef Binary files /dev/null and b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/drop-focus.jpg differ diff --git a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/drop-focus.png b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/drop-focus.png deleted file mode 100644 index 8aefbad01..000000000 Binary files a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/drop-focus.png and /dev/null differ diff --git a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/gradle-dependencies.jpg b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/gradle-dependencies.jpg new file mode 100644 index 000000000..59de03a5c Binary files /dev/null and b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/gradle-dependencies.jpg differ diff --git a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/gradle-dependencies.png b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/gradle-dependencies.png deleted file mode 100644 index 2dd4134e1..000000000 Binary files a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/gradle-dependencies.png and /dev/null differ diff --git a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/index.md b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/index.md index 2ec788dad..ed20006dc 100644 --- a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/index.md +++ b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/index.md @@ -58,13 +58,13 @@ We can view the dependencies as a tree by clicking the **Show as Tree** button a We can also click the **View Options** button and toggle **Show GroupId**, to show the GroupId for dependencies or not. -![View Options](view-options.png) +![View Options](view-options.jpg) ## Finding a specific dependency To see where we are getting a specific version of a particular library, we can search for that dependency. For example, when we search for "log4j" we see that we are only getting it via this spring-boot-starter, and it's a version newer than the one where log4shell was fixed. -![Search for a specific dependency](search.png) +![Search for a specific dependency](search.jpg) ## Finding conflicts @@ -76,7 +76,7 @@ Fortunately, it's been resolved; we see that one version is greyed out. If we go ![Show Conflicts Only result](show-conflicts-only-result.png) -![Omitted for conflict](omitted-for-conflict.png) +![Omitted for conflict](omitted-for-conflict.jpg) ## Selecting scopes @@ -108,7 +108,7 @@ We can hide all tool windows (**⇧⌘F12** on macOS / **Control+Shift+F12** on ![Diagrams | Show Diagrams](show-diagram.png) -![Gradle Dependencies](gradle-dependencies.png) +![Gradle Dependencies](gradle-dependencies.jpg) ## Zoom in @@ -146,7 +146,7 @@ This will give you several options. In this example, we'll look at both directio ![Focus View On Node Neighbourhood](focus-view.png) -![Drop Focus](drop-focus.png) +![Drop Focus](drop-focus.jpg) ## Select scopes diff --git a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/omitted-for-conflict.jpg b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/omitted-for-conflict.jpg new file mode 100644 index 000000000..df0caf48d Binary files /dev/null and b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/omitted-for-conflict.jpg differ diff --git a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/omitted-for-conflict.png b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/omitted-for-conflict.png deleted file mode 100644 index 7fa97e9db..000000000 Binary files a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/omitted-for-conflict.png and /dev/null differ diff --git a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/search.jpg b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/search.jpg new file mode 100644 index 000000000..6355ed708 Binary files /dev/null and b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/search.jpg differ diff --git a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/search.png b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/search.png deleted file mode 100644 index bca80483a..000000000 Binary files a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/search.png and /dev/null differ diff --git a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/view-options.jpg b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/view-options.jpg new file mode 100644 index 000000000..d9027786a Binary files /dev/null and b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/view-options.jpg differ diff --git a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/view-options.png b/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/view-options.png deleted file mode 100644 index 717db99f1..000000000 Binary files a/content/posts/2023/05/11/analyzing-dependencies-in-intellij-idea/view-options.png and /dev/null differ diff --git a/content/posts/2023/05/16/managing-data-residency-concepts-theory/decide-proxy-system-1024x744.jpg b/content/posts/2023/05/16/managing-data-residency-concepts-theory/decide-proxy-system-1024x744.jpg new file mode 100644 index 000000000..8b4efea7b Binary files /dev/null and b/content/posts/2023/05/16/managing-data-residency-concepts-theory/decide-proxy-system-1024x744.jpg differ diff --git a/content/posts/2023/05/16/managing-data-residency-concepts-theory/decide-proxy-system-1024x744.png b/content/posts/2023/05/16/managing-data-residency-concepts-theory/decide-proxy-system-1024x744.png deleted file mode 100644 index 6c8c3bfb2..000000000 Binary files a/content/posts/2023/05/16/managing-data-residency-concepts-theory/decide-proxy-system-1024x744.png and /dev/null differ diff --git a/content/posts/2023/05/16/managing-data-residency-concepts-theory/index.md b/content/posts/2023/05/16/managing-data-residency-concepts-theory/index.md index 92e7ddd77..ccbe068b5 100644 --- a/content/posts/2023/05/16/managing-data-residency-concepts-theory/index.md +++ b/content/posts/2023/05/16/managing-data-residency-concepts-theory/index.md @@ -81,7 +81,7 @@ For example, the Apache ShardingSphere project provides a JVM database driver wi The proxy approach is similar to the library/framework approach above; the difference comes from the former running inside the application, while the latter is a dedicated component. -![](decide-proxy-system-1024x744.png) +![](decide-proxy-system-1024x744.jpg) The responsibility of keeping track of the databases falls now on the proxy's shoulders. diff --git a/content/posts/2023/05/16/reduce-java-application-startup-and-warmup-times-with-crac/CleanShot-2023-05-15-at-08.03.52-8f6247f9.webp b/content/posts/2023/05/16/reduce-java-application-startup-and-warmup-times-with-crac/CleanShot-2023-05-15-at-08.03.52-8f6247f9.webp new file mode 100644 index 000000000..e686b553e Binary files /dev/null and b/content/posts/2023/05/16/reduce-java-application-startup-and-warmup-times-with-crac/CleanShot-2023-05-15-at-08.03.52-8f6247f9.webp differ diff --git a/content/posts/2023/05/16/reduce-java-application-startup-and-warmup-times-with-crac/CleanShot-2023-05-15-at-08.04.13-702712eb.webp b/content/posts/2023/05/16/reduce-java-application-startup-and-warmup-times-with-crac/CleanShot-2023-05-15-at-08.04.13-702712eb.webp new file mode 100644 index 000000000..dc9b8725b Binary files /dev/null and b/content/posts/2023/05/16/reduce-java-application-startup-and-warmup-times-with-crac/CleanShot-2023-05-15-at-08.04.13-702712eb.webp differ diff --git a/content/posts/2023/05/16/reduce-java-application-startup-and-warmup-times-with-crac/index.md b/content/posts/2023/05/16/reduce-java-application-startup-and-warmup-times-with-crac/index.md index 133052def..2b0f15cab 100644 --- a/content/posts/2023/05/16/reduce-java-application-startup-and-warmup-times-with-crac/index.md +++ b/content/posts/2023/05/16/reduce-java-application-startup-and-warmup-times-with-crac/index.md @@ -40,10 +40,10 @@ The builds are commercially supported as part of [Azul Platform Core](https://ww > "***CRaC has generated immense interest among the Java developer community and provides a compelling, resource-efficient approach for improving startup and warmup times** . **Azul is well known for originating this project, so it came as no surprise that they would also deliver the world's first production-ready builds of OpenJDK with commercial CRaC support.***" > — Sergio del Amo, Micronaut Product Development Lead. -![Time to first operation for Micronaut improved from 1 second without CRaC to 46 milliseconds with CRaC.](https://www.azul.com/wp-content/uploads/CleanShot-2023-05-15-at-08.03.52.gif) **"** ***Project CRaC's checkpoint restore approach is very promising for the immediate startup of Spring applications on the JVM. Our collaboration with Azul delivered some great initial results already**.*" +![Time to first operation for Micronaut improved from 1 second without CRaC to 46 milliseconds with CRaC.](CleanShot-2023-05-15-at-08.03.52-8f6247f9.webp) **"** ***Project CRaC's checkpoint restore approach is very promising for the immediate startup of Spring applications on the JVM. Our collaboration with Azul delivered some great initial results already**.*" > — Juergen Hoeller, project lead and co-founder of the Spring Framework project. -![Time to first operation for Spring Boot improved from 4 seconds without CRaC to 38 milliseconds with CRaC.](https://www.azul.com/wp-content/uploads/CleanShot-2023-05-15-at-08.04.13.gif) +![Time to first operation for Spring Boot improved from 4 seconds without CRaC to 38 milliseconds with CRaC.](CleanShot-2023-05-15-at-08.04.13-702712eb.webp) ## What Does CRaC Do? diff --git a/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/index.md b/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/index.md index 848030d8b..1e68c6bb6 100644 --- a/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/index.md +++ b/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/index.md @@ -50,7 +50,7 @@ Before I start with discussing the ways you can force methods to be compiled, in 4. There are four different compilation levels, but I'm subsuming all C1 variants under the C1 label because some of my used techniques only work on the C1/C2/inlined level. You can read more on tiered compilation in articles like [Tiered Compilation in JVM](https://www.baeldung.com/jvm-tiered-compilation) on Baeldung. Now that I finished the obligatory disclaimer: What are the stages in the life of a method with a tiered JIT? -![](https://mostlynerdless.de/wp-content/uploads/2023/05/tiered_states-3-2000x1415.png) +![](tiered_states-3-2000x1415-558543fc.jpg) The first time the JVM executes a method, the method's byte code is interpreted without compilation. This allows the JVM to gather information on the method, as C1 and C2 are profile guided. @@ -63,10 +63,10 @@ Every compiler can decide to inline called methods of a currently compiled metho ## What we want and what we get The ideal would be to tell the JVM to just use a method in its compiled version, e.g.: -![](https://mostlynerdless.de/wp-content/uploads/2023/05/tiered_states3-2000x474.png) +![](tiered_states3-2000x474-80dbe9b3.png) But this is not possible, as the JVM does not have any information it needs for compilation before the first execution of a method. We, therefore, have first to execute the method (or the benchmark) and then set the compilation level: -![](https://mostlynerdless.de/wp-content/uploads/2023/05/tiered_states2-2000x470.png) +![](tiered_states2-2000x470-e1664a1a.jpg) ## How do we get it? @@ -76,7 +76,7 @@ We can split the task of forcing a method to be compiled (or inlined, for that m 2. Force the JIT to never compile a method with a different compiler (→ Compiler Control) The following is the modified state diagram when forcing a method to be C1 compiled: -![](https://mostlynerdless.de/wp-content/uploads/2023/05/tiered_states4-2000x1415.png) +![](tiered_states4-2000x1415-ccc71e45.jpg) In the following, I'll discuss how to use both the WhiteBox API and Compiler Control to facilitate the wanted behavior. diff --git a/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/tiered_states-3-2000x1415-558543fc.jpg b/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/tiered_states-3-2000x1415-558543fc.jpg new file mode 100644 index 000000000..c1713c3f2 Binary files /dev/null and b/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/tiered_states-3-2000x1415-558543fc.jpg differ diff --git a/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/tiered_states2-2000x470-e1664a1a.jpg b/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/tiered_states2-2000x470-e1664a1a.jpg new file mode 100644 index 000000000..01c3a7f6c Binary files /dev/null and b/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/tiered_states2-2000x470-e1664a1a.jpg differ diff --git a/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/tiered_states3-2000x474-80dbe9b3.png b/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/tiered_states3-2000x474-80dbe9b3.png new file mode 100644 index 000000000..af78c3866 Binary files /dev/null and b/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/tiered_states3-2000x474-80dbe9b3.png differ diff --git a/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/tiered_states4-2000x1415-ccc71e45.jpg b/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/tiered_states4-2000x1415-ccc71e45.jpg new file mode 100644 index 000000000..3a7bf6000 Binary files /dev/null and b/content/posts/2023/05/19/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/tiered_states4-2000x1415-ccc71e45.jpg differ diff --git a/content/posts/2023/05/22/announcing-the-digma-beta-first-runtime-linter-for-java-code/doppleware_a_hipster_developer_following_a_yarn_thread_connecte_0aadda36-bf51-4283-90c5-54ff5f976af7-1-1024x512.jpg b/content/posts/2023/05/22/announcing-the-digma-beta-first-runtime-linter-for-java-code/doppleware_a_hipster_developer_following_a_yarn_thread_connecte_0aadda36-bf51-4283-90c5-54ff5f976af7-1-1024x512.jpg new file mode 100644 index 000000000..12b6b0e8a Binary files /dev/null and b/content/posts/2023/05/22/announcing-the-digma-beta-first-runtime-linter-for-java-code/doppleware_a_hipster_developer_following_a_yarn_thread_connecte_0aadda36-bf51-4283-90c5-54ff5f976af7-1-1024x512.jpg differ diff --git a/content/posts/2023/05/22/announcing-the-digma-beta-first-runtime-linter-for-java-code/doppleware_a_hipster_developer_following_a_yarn_thread_connecte_0aadda36-bf51-4283-90c5-54ff5f976af7-1-1024x512.png b/content/posts/2023/05/22/announcing-the-digma-beta-first-runtime-linter-for-java-code/doppleware_a_hipster_developer_following_a_yarn_thread_connecte_0aadda36-bf51-4283-90c5-54ff5f976af7-1-1024x512.png deleted file mode 100644 index 924486536..000000000 Binary files a/content/posts/2023/05/22/announcing-the-digma-beta-first-runtime-linter-for-java-code/doppleware_a_hipster_developer_following_a_yarn_thread_connecte_0aadda36-bf51-4283-90c5-54ff5f976af7-1-1024x512.png and /dev/null differ diff --git a/content/posts/2023/05/22/announcing-the-digma-beta-first-runtime-linter-for-java-code/index.md b/content/posts/2023/05/22/announcing-the-digma-beta-first-runtime-linter-for-java-code/index.md index b88e6b14f..9be7bf4c4 100644 --- a/content/posts/2023/05/22/announcing-the-digma-beta-first-runtime-linter-for-java-code/index.md +++ b/content/posts/2023/05/22/announcing-the-digma-beta-first-runtime-linter-for-java-code/index.md @@ -18,7 +18,7 @@ related_posts: frozen: true --- -![](doppleware_a_hipster_developer_following_a_yarn_thread_connecte_0aadda36-bf51-4283-90c5-54ff5f976af7-1-1024x512.png) +![](doppleware_a_hipster_developer_following_a_yarn_thread_connecte_0aadda36-bf51-4283-90c5-54ff5f976af7-1-1024x512.jpg) ## Call for Developers diff --git a/content/posts/2023/05/22/foojay-podcast-23/index.md b/content/posts/2023/05/22/foojay-podcast-23/index.md index ebb02311e..884fb0bf9 100644 --- a/content/posts/2023/05/22/foojay-podcast-23/index.md +++ b/content/posts/2023/05/22/foojay-podcast-23/index.md @@ -6,7 +6,7 @@ description: "There are challenges with Java profiling, and the need for profili authors: - "frankdelporte" - "hirt" -image: "podcast-guests-profiling-and-performance-1024x404-1.png" +image: "podcast-guests-profiling-and-performance-1024x404-1.jpg" categories: - "DevOps" - "Java Core" diff --git a/content/posts/2023/05/22/foojay-podcast-23/podcast-guests-profiling-and-performance-1024x404-1.jpg b/content/posts/2023/05/22/foojay-podcast-23/podcast-guests-profiling-and-performance-1024x404-1.jpg new file mode 100644 index 000000000..225fa0dcc Binary files /dev/null and b/content/posts/2023/05/22/foojay-podcast-23/podcast-guests-profiling-and-performance-1024x404-1.jpg differ diff --git a/content/posts/2023/05/22/foojay-podcast-23/podcast-guests-profiling-and-performance-1024x404-1.png b/content/posts/2023/05/22/foojay-podcast-23/podcast-guests-profiling-and-performance-1024x404-1.png deleted file mode 100644 index 87c7d9374..000000000 Binary files a/content/posts/2023/05/22/foojay-podcast-23/podcast-guests-profiling-and-performance-1024x404-1.png and /dev/null differ diff --git a/content/posts/2023/05/24/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/BTROLL1-SM-a84b67b0.png b/content/posts/2023/05/24/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/BTROLL1-SM-a84b67b0.png new file mode 100644 index 000000000..a743a5bee Binary files /dev/null and b/content/posts/2023/05/24/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/BTROLL1-SM-a84b67b0.png differ diff --git a/content/posts/2023/05/24/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/BTROLL2-SM-b24634f4.png b/content/posts/2023/05/24/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/BTROLL2-SM-b24634f4.png new file mode 100644 index 000000000..b0750a6da Binary files /dev/null and b/content/posts/2023/05/24/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/BTROLL2-SM-b24634f4.png differ diff --git a/content/posts/2023/05/24/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/BTROLL3-SM-9b248357.png b/content/posts/2023/05/24/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/BTROLL3-SM-9b248357.png new file mode 100644 index 000000000..46a221b3a Binary files /dev/null and b/content/posts/2023/05/24/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/BTROLL3-SM-9b248357.png differ diff --git a/content/posts/2023/05/24/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/index.md b/content/posts/2023/05/24/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/index.md index 998e43825..eb55bb470 100644 --- a/content/posts/2023/05/24/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/index.md +++ b/content/posts/2023/05/24/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/index.md @@ -5,7 +5,7 @@ lastmod: "2023-06-04T18:02:23+00:00" description: "We introduce a linear algorithm for rolling binary trees and implement it in Java, by demonstrating the use of common design patterns." authors: - "george-tanev" -image: "https://i.postimg.cc/q7ZXwMfj/BTROLL1-SM.png" +image: "BTROLL1-SM-a84b67b0.png" categories: - "Java Core" - "Maven" @@ -40,15 +40,15 @@ We can deduce that the two roll variants are **inverse** to one another, i.e., a Below is a simple illustration of a binary tree (T1) and its clockwise-rolled counterpart (T2) to its right. Due to the inverse nature of the roll variants, we can also say that T1 is the counterclockwise-rolled counterpart of T2. -{{< img src="https://i.postimg.cc/q7ZXwMfj/BTROLL1-SM.png" class="size-medium" alt="binary_tree_roll_example_1" width="790" height="480" >}} +{{< img src="BTROLL1-SM-a84b67b0.png" class="size-medium" alt="binary_tree_roll_example_1" width="790" height="480" >}} In some cases, when the topology of the tree is such that when viewed at a ±90° angle it appears as though certain nodes have two parents, the visual effect of the roll transformation may lose its acuity. Nevertheless, **the equivalence between the correlated traversals always holds**. For instance, consider the binary tree T2 from the previous example and its clockwise-rolled counterpart T3 shown below. -{{< img src="https://i.postimg.cc/BQhDPrtJ/BTROLL2-SM.png" class="size-medium" alt="binary_tree_example_2" width="790" height="608" >}} +{{< img src="BTROLL2-SM-b24634f4.png" class="size-medium" alt="binary_tree_example_2" width="790" height="608" >}} If we compare T3 to a literal -90° view of T2, the subtrees rooted at nodes **④** and **⑥** appear to be "pulled down" to create a proper binary tree structure. A similar thing happens when we take T3 from the example above and roll it clockwise. -{{< img src="https://i.postimg.cc/9FXZMmmx/BTROLL3-SM.png" class="size-medium" alt="binary_tree_example_3" width="790" height="609" >}} +{{< img src="BTROLL3-SM-9b248357.png" class="size-medium" alt="binary_tree_example_3" width="790" height="609" >}} This time we get a rolled tree that has the same root as the original tree, since T3's root node is also its leftmost node. And the subtrees rooted at **④** and **⑥** appear to be adjusted again, to correct for the aforementioned double-parent "anomaly." diff --git a/content/posts/2023/05/26/revolutionize-json-parsing-in-java-with-manifold/index.md b/content/posts/2023/05/26/revolutionize-json-parsing-in-java-with-manifold/index.md index a222d9866..f85afa2e4 100644 --- a/content/posts/2023/05/26/revolutionize-json-parsing-in-java-with-manifold/index.md +++ b/content/posts/2023/05/26/revolutionize-json-parsing-in-java-with-manifold/index.md @@ -36,7 +36,7 @@ To begin, you'll need to install the Manifold plugin, which is currently only av We can install the plugin from IntelliJ/IDEAs settings UI by navigating to the marketplace and searching for Manifold. The plugin makes sure the IDE doesn't collide with the work done by the Maven/Gradle plugin. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wj7zcz7c66ggh6fcvlu7.png) +![Image description](wj7zcz7c66ggh6fcvlu7-9b86b9c9.jpg) Manifold consists of multiple smaller projects, each offering a custom language extension. Today, we'll discuss one such extension, but there's much more to explore. diff --git a/content/posts/2023/05/26/revolutionize-json-parsing-in-java-with-manifold/wj7zcz7c66ggh6fcvlu7-9b86b9c9.jpg b/content/posts/2023/05/26/revolutionize-json-parsing-in-java-with-manifold/wj7zcz7c66ggh6fcvlu7-9b86b9c9.jpg new file mode 100644 index 000000000..c1f0a09e0 Binary files /dev/null and b/content/posts/2023/05/26/revolutionize-json-parsing-in-java-with-manifold/wj7zcz7c66ggh6fcvlu7-9b86b9c9.jpg differ diff --git a/content/posts/2023/05/30/boosting-similarity-search-with-real-time-stream-processing/index.md b/content/posts/2023/05/30/boosting-similarity-search-with-real-time-stream-processing/index.md index 255510262..9c3bcf66a 100644 --- a/content/posts/2023/05/30/boosting-similarity-search-with-real-time-stream-processing/index.md +++ b/content/posts/2023/05/30/boosting-similarity-search-with-real-time-stream-processing/index.md @@ -5,7 +5,7 @@ lastmod: "2023-05-30T12:42:36+00:00" description: "Combining the strengths of vector databases and real-time stream processing is an efficient way of processing data in real-time at scale." authors: - "fawaz-ghali" -image: "qdrant.png" +image: "qdrant.jpg" categories: - "Hazelcast" - "Tutorials" diff --git a/content/posts/2023/05/30/boosting-similarity-search-with-real-time-stream-processing/qdrant.jpg b/content/posts/2023/05/30/boosting-similarity-search-with-real-time-stream-processing/qdrant.jpg new file mode 100644 index 000000000..4e68ec29d Binary files /dev/null and b/content/posts/2023/05/30/boosting-similarity-search-with-real-time-stream-processing/qdrant.jpg differ diff --git a/content/posts/2023/05/30/boosting-similarity-search-with-real-time-stream-processing/qdrant.png b/content/posts/2023/05/30/boosting-similarity-search-with-real-time-stream-processing/qdrant.png deleted file mode 100644 index af6de66e3..000000000 Binary files a/content/posts/2023/05/30/boosting-similarity-search-with-real-time-stream-processing/qdrant.png and /dev/null differ diff --git a/content/posts/2023/06/03/class-loader-hierarchies/image-1-2000x1507-b82633f2.jpg b/content/posts/2023/06/03/class-loader-hierarchies/image-1-2000x1507-b82633f2.jpg new file mode 100644 index 000000000..4cc763e36 Binary files /dev/null and b/content/posts/2023/06/03/class-loader-hierarchies/image-1-2000x1507-b82633f2.jpg differ diff --git a/content/posts/2023/06/03/class-loader-hierarchies/image-3-2000x1500-dcdab984.jpg b/content/posts/2023/06/03/class-loader-hierarchies/image-3-2000x1500-dcdab984.jpg new file mode 100644 index 000000000..7a0f15089 Binary files /dev/null and b/content/posts/2023/06/03/class-loader-hierarchies/image-3-2000x1500-dcdab984.jpg differ diff --git a/content/posts/2023/06/03/class-loader-hierarchies/image-7f19353f.jpg b/content/posts/2023/06/03/class-loader-hierarchies/image-7f19353f.jpg new file mode 100644 index 000000000..943a3e0ed Binary files /dev/null and b/content/posts/2023/06/03/class-loader-hierarchies/image-7f19353f.jpg differ diff --git a/content/posts/2023/06/03/class-loader-hierarchies/index.md b/content/posts/2023/06/03/class-loader-hierarchies/index.md index b404269a9..49bfee142 100644 --- a/content/posts/2023/06/03/class-loader-hierarchies/index.md +++ b/content/posts/2023/06/03/class-loader-hierarchies/index.md @@ -29,7 +29,7 @@ Class loaders are responsible for (possibly dynamically) loading classes, and th > [ClassLoader Documentation](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/ClassLoader.html) An application has multiple class loaders: -![](https://mostlynerdless.de/wp-content/uploads/2023/06/image.png) +![](image-7f19353f.jpg) A typical Java application has a bootstrap class loader (internal JDK classes and the ClassLoader class itself, implemented in C++ code), a platform classloader (all other JDK classes), and an application/system class loader (application classes): > * Bootstrap class loader. It is the virtual machine's built-in class loader, typically represented as `null`, and does not have a parent. @@ -131,10 +131,10 @@ Feel free to try this agent on your applications; maybe you gain some new insigh Understanding class loader hierarchies helps to understand subtle problems in writing instrumenting agents. Knowing how to write small agents can empower you to write simple tools to understand the properties of your application. I hope this blog post helped you to understand class loader hierarchies and agents a little bit better. I'm writing it in a lovely park in Milan: -![](https://mostlynerdless.de/wp-content/uploads/2023/06/image-1-2000x1507.png) +![](image-1-2000x1507-b82633f2.jpg) After giving [a talk at JUG Milano on profiling](http://www.jugmilano.it/meeting-145.html) on Wednesday: -![](https://mostlynerdless.de/wp-content/uploads/2023/06/image-3-2000x1500.png) +![](image-3-2000x1500-dcdab984.jpg) Next week, I will write a short article on my talk (with slides and the [recording](https://www.youtube.com/watch?v=DhYDzff6UCE&t=348s)). If you live near Munich, you can attend my talk [Write your own Java Profiler in 240 lines of pure Java](https://www.meetup.com/openvaluemuenchen/events/293736106/) on Monday, June 5th. diff --git a/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/index.md b/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/index.md index 304a4c788..aa07e0182 100644 --- a/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/index.md +++ b/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/index.md @@ -6,7 +6,7 @@ description: "By taking a proactive approach to XSS prevention and using the rig canonical: "https://snyk.io/blog/preventing-xss-snyk-code/" authors: - "bmvermeer" -image: "snykvulnxxcode-1.png" +image: "snykvulnxxcode-1.jpg" categories: - "Security" - "Snyk" @@ -68,17 +68,17 @@ When closely looking at the function above, you might already recognize at least There are multiple ways to leverage Snyk Code. Let's take a look at three different examples. The most direct way of getting feedback from Snyk Code to a developer is by installing a plugin in the IDE. We have plugins for many different IDE's available. In the following example, I show how the IntelliJ plugin helps me find XSS problems during development. Intellij plugin output: -![blog-preventing-xss-product-controller](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1682439081%2Fblog-preventing-xss-product-controller.jpg&w=2560&q=75) +![blog-preventing-xss-product-controller](snyk-io-19d60081.jpg) Another option is to run Snyk Code using the Snyk CLI. Running command `snyk code test` from the terminal will give you an output like below. This method is useful on your local machine or as part of your automatic build in a CI/CD pipeline. CLI output: -![blog-preventing-xss-high-vulns](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1682439081%2Fblog-preventing-xss-high-vulns.jpg&w=2560&q=75) +![blog-preventing-xss-high-vulns](snyk-io-0c433204.jpg) The third option I want to show you, is the web UI. For this output I used the git integration with Snyk and connected my GitHub repository to the Snyk Web UI using the dashboard at [++https://app.snyk.io++](https://app.snyk.io/). This solution scan's the code that is committed to my repository for security vulnerabilities. Web UI output: -![blog-preventing-xss-snyk-code-report](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1682439081%2Fblog-preventing-xss-snyk-code-report.jpg&w=2560&q=75) +![blog-preventing-xss-snyk-code-report](snyk-io-48e9ee38.jpg) All three different scanning options show me that there are two distinct XSS security issues I need to address — with Snyk Code pinpointing their exact location in my code. Let's break them down and see how we can mitigate them. @@ -109,7 +109,7 @@ Snyk Code pointed out this potential XSS problem on line 103, where we insert th ## Mitigating XSS vulnerabilities with Snyk Code To prevent XSS vulnerabilities, it is important to properly validate and sanitize user input before writing it to the response. Snyk Code already helps us by pointing out possible solutions. One way to do this is to use a library like [++Apache Commons Text++](https://commons.apache.org/proper/commons-text/)to encode the input and prevent malicious code from being executed. -![blog-preventing-xss-string-path](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1682439081%2Fblog-preventing-xss-string-path.jpg&w=2560&q=75) +![blog-preventing-xss-string-path](snyk-io-4662ff86.jpg) Using the `escapeHtml4()` function, we can make sure that code in both reflective and stored XSS is escaped so that it will not be executed when loading the page. diff --git a/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snyk-io-0c433204.jpg b/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snyk-io-0c433204.jpg new file mode 100644 index 000000000..671363e5e Binary files /dev/null and b/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snyk-io-0c433204.jpg differ diff --git a/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snyk-io-19d60081.jpg b/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snyk-io-19d60081.jpg new file mode 100644 index 000000000..7a433c03d Binary files /dev/null and b/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snyk-io-19d60081.jpg differ diff --git a/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snyk-io-4662ff86.jpg b/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snyk-io-4662ff86.jpg new file mode 100644 index 000000000..1ff40ad3c Binary files /dev/null and b/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snyk-io-4662ff86.jpg differ diff --git a/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snyk-io-48e9ee38.jpg b/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snyk-io-48e9ee38.jpg new file mode 100644 index 000000000..0e74769b4 Binary files /dev/null and b/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snyk-io-48e9ee38.jpg differ diff --git a/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snykvulnxxcode-1.jpg b/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snykvulnxxcode-1.jpg new file mode 100644 index 000000000..6b4d2b7c1 Binary files /dev/null and b/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snykvulnxxcode-1.jpg differ diff --git a/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snykvulnxxcode-1.png b/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snykvulnxxcode-1.png deleted file mode 100644 index 3e5641795..000000000 Binary files a/content/posts/2023/06/09/preventing-cross-site-scripting-xss-in-java-applications-with-snyk-code/snykvulnxxcode-1.png and /dev/null differ diff --git a/content/posts/2023/06/12/breaking-the-code-how-chris-newland-is-changing-the-game-in-jvm-performance/chris.jpg b/content/posts/2023/06/12/breaking-the-code-how-chris-newland-is-changing-the-game-in-jvm-performance/chris.jpg new file mode 100644 index 000000000..e208e923c Binary files /dev/null and b/content/posts/2023/06/12/breaking-the-code-how-chris-newland-is-changing-the-game-in-jvm-performance/chris.jpg differ diff --git a/content/posts/2023/06/12/breaking-the-code-how-chris-newland-is-changing-the-game-in-jvm-performance/chris.png b/content/posts/2023/06/12/breaking-the-code-how-chris-newland-is-changing-the-game-in-jvm-performance/chris.png deleted file mode 100644 index 5dd761d2a..000000000 Binary files a/content/posts/2023/06/12/breaking-the-code-how-chris-newland-is-changing-the-game-in-jvm-performance/chris.png and /dev/null differ diff --git a/content/posts/2023/06/12/breaking-the-code-how-chris-newland-is-changing-the-game-in-jvm-performance/index.md b/content/posts/2023/06/12/breaking-the-code-how-chris-newland-is-changing-the-game-in-jvm-performance/index.md index b8588e42a..161b564f3 100644 --- a/content/posts/2023/06/12/breaking-the-code-how-chris-newland-is-changing-the-game-in-jvm-performance/index.md +++ b/content/posts/2023/06/12/breaking-the-code-how-chris-newland-is-changing-the-game-in-jvm-performance/index.md @@ -6,7 +6,7 @@ description: "Dive into an exclusive interview with Chris Newland, the creator o authors: - "bazlur-rahman" - "chriswhocodes" -image: "chris.png" +image: "chris.jpg" categories: - "Interviews" - "Performance" @@ -18,7 +18,7 @@ related_posts: frozen: false --- -{{< img src="chris.png" class="alignright size-full is-resized" width="384" height="384" >}} +{{< img src="chris.jpg" class="alignright size-full is-resized" width="384" height="384" >}} We're excited to introduce you to Chris Newland, an industry veteran and dedicated JVM performance specialist. @@ -117,7 +117,7 @@ The steady progress of the Java ecosystem through the OpenJDK project, Java Comm **Chris:** One of my favourites was an issue someone raised on JITWatch, where they reported that the PrintAssembly native code for a Java method was missing. After some investigation, it turned out that the method in question (a series of mathematical operations on its inputs) was being tested with parameters such that the HotSpot C2 JIT compiler was able to reduce the entire method down to **mov $0xe, eax** (return 14). **Bazlur: That's fascinating! Speaking of JIT optimizations, could you tell us how these optimizations actually work? And what are some of the most common optimizations that the JIT compiler performs? -Chris:** You can learn all about how the JVM achieves excellent runtime performance in the book Optimizing Java ([https://optimizingjava.com](https://optimizingjava.com/)) by Ben Evans, James Gough, and Chris Newland ![:wink:](https://lh5.googleusercontent.com/rb3I4_IQDF4B9jr_Wez3Sll7XFgn7IK957K3LGkOiffPcciWWmhuKdBvE7JM8PFIb0wns2JIpyyua5X2X1DE9VX6s161r2dcyZIDrhQOvwa7CGpN6_upbpDiGsa8Hq29oK8lHJaLuNWTzLBt4Kepd7w) but in a nutshell, the JVM builds a profile of the running bytecode and looks for frequently executed "hot spots" (hence the name of the HotSpot JVM) by counting method invocations and loop back-edges. When these counters cross a threshold, the method (or loop) is queued for compilation. +Chris:** You can learn all about how the JVM achieves excellent runtime performance in the book Optimizing Java ([https://optimizingjava.com](https://optimizingjava.com/)) by Ben Evans, James Gough, and Chris Newland ![:wink:](rb3I4_IQDF4B9jr_Wez3Sll7XFgn7IK957K3LGkO-85a48b96.png) but in a nutshell, the JVM builds a profile of the running bytecode and looks for frequently executed "hot spots" (hence the name of the HotSpot JVM) by counting method invocations and loop back-edges. When these counters cross a threshold, the method (or loop) is queued for compilation. The JIT compilers (HotSpot contains two compilers; one simple, one advanced) take methods from the compilation queue and, using the collected profile, transform the bytecode into optimized native code. HotSpot JIT optimizations include ***method call devirtualisation, method inlining, dead code elimination, common subexpression elimination, branch prediction, lock coarsening and lock elision, escape analysis and many more***. The native code is stored in a special memory region of the JVM called the code cache, and further calls to the method will execute the optimized native code and not the interpreted bytecode. diff --git a/content/posts/2023/06/12/breaking-the-code-how-chris-newland-is-changing-the-game-in-jvm-performance/rb3I4_IQDF4B9jr_Wez3Sll7XFgn7IK957K3LGkO-85a48b96.png b/content/posts/2023/06/12/breaking-the-code-how-chris-newland-is-changing-the-game-in-jvm-performance/rb3I4_IQDF4B9jr_Wez3Sll7XFgn7IK957K3LGkO-85a48b96.png new file mode 100644 index 000000000..a133f6350 Binary files /dev/null and b/content/posts/2023/06/12/breaking-the-code-how-chris-newland-is-changing-the-game-in-jvm-performance/rb3I4_IQDF4B9jr_Wez3Sll7XFgn7IK957K3LGkO-85a48b96.png differ diff --git a/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/index.md b/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/index.md index 7e9792e27..da0814f4f 100644 --- a/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/index.md +++ b/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/index.md @@ -26,7 +26,7 @@ frozen: false * Java General -- Provides a good starting point for all general Java work. * Java Spring -- Provides a good starting point for Spring developers -[![Profile template dropdown](https://code.visualstudio.com/assets/updates/1_78/profile-template-dropdown.png)](https://code.visualstudio.com/assets/updates/1_78/profile-template-dropdown.png) +[![Profile template dropdown](profile-template-dropdown-8784ff13.png)](profile-template-dropdown-8784ff13.png) Once you switch to these profiles, you can easily get started for your Java projects and customize the profiles further. Please let us know if these templates can be improved at [https://github.com/Microsoft/vscode-java-pack.](https://github.com/Microsoft/vscode-java-pack) @@ -42,7 +42,7 @@ We introduced our new Java Project Explorer UI last month, and we have been maki Here's a demo that covers all the features above. Please let us know if you have any [feedback](https://github.com/Microsoft/vscode-java-pack) regarding these UI updates. -![Java Project Explorer New UX](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/05/projectexplorer.gif) +![Java Project Explorer New UX](projectexplorer.webp) #### Whitelist for exception types @@ -50,7 +50,7 @@ We have also added a debugging feature that allows you to specify a white list o You can set these exception types using this setting: "java.debug.settings.exceptionBreakpoint.exceptionTypes". Here's a quick demo. -![Excpetion Type](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/05/whitelist.gif) +![Excpetion Type](whitelist-e3935a43.webp) #### Project import time improvement using Maven parallel download @@ -71,17 +71,17 @@ Lastly, we want to share an update for Spring Boot dashboard. Profiles are a cor In our latest release, we have supported starting a Spring Boot application with a selected Spring profile from the Spring Boot dashboard directly using the UI. The way to use this feature is to right click on a Spring application in the Apps panel and select "Run with Profile". Here's a demo. -![Spring profile](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/05/springprofile.gif) +![Spring profile](springprofile-43812cf9.gif) #### Install Extension Pack for Java To use all features mentioned above, please download and install [Extension Pack for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) on Visual Studio Code. -[![Extension pack for Java](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png) +[![Extension pack for Java](javapack-892c0338.png)](javapack-892c0338.png) If you are a Spring developer working on a Spring Boot application, you can also download the [Spring Boot Extension Pack](https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-boot-dev-pack) for specialized Spring experience. -[![Spring boot extension pack](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png) +[![Spring boot extension pack](spring-ac42cb4c.png)](spring-ac42cb4c.png) Feedback and suggestions diff --git a/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/javapack-892c0338.png b/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/javapack-892c0338.png new file mode 100644 index 000000000..c05f90e30 Binary files /dev/null and b/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/javapack-892c0338.png differ diff --git a/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/profile-template-dropdown-8784ff13.png b/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/profile-template-dropdown-8784ff13.png new file mode 100644 index 000000000..3bb149372 Binary files /dev/null and b/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/profile-template-dropdown-8784ff13.png differ diff --git a/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/spring-ac42cb4c.png b/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/spring-ac42cb4c.png new file mode 100644 index 000000000..c3d38f0a6 Binary files /dev/null and b/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/spring-ac42cb4c.png differ diff --git a/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/springprofile-43812cf9.gif b/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/springprofile-43812cf9.gif new file mode 100644 index 000000000..e7d303b14 Binary files /dev/null and b/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/springprofile-43812cf9.gif differ diff --git a/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/whitelist-e3935a43.webp b/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/whitelist-e3935a43.webp new file mode 100644 index 000000000..6ae97e2f4 Binary files /dev/null and b/content/posts/2023/06/13/java-on-visual-studio-code-may-2023/whitelist-e3935a43.webp differ diff --git a/content/posts/2023/06/14/unique-identifiers-based-on-timestamps-in-distributed-applications/Screenshot-2023-06-06-at-1.19.15-PM-1013x1024.jpg b/content/posts/2023/06/14/unique-identifiers-based-on-timestamps-in-distributed-applications/Screenshot-2023-06-06-at-1.19.15-PM-1013x1024.jpg new file mode 100644 index 000000000..e0387c6e3 Binary files /dev/null and b/content/posts/2023/06/14/unique-identifiers-based-on-timestamps-in-distributed-applications/Screenshot-2023-06-06-at-1.19.15-PM-1013x1024.jpg differ diff --git a/content/posts/2023/06/14/unique-identifiers-based-on-timestamps-in-distributed-applications/Screenshot-2023-06-06-at-1.19.15-PM-1013x1024.png b/content/posts/2023/06/14/unique-identifiers-based-on-timestamps-in-distributed-applications/Screenshot-2023-06-06-at-1.19.15-PM-1013x1024.png deleted file mode 100644 index 5dddf3841..000000000 Binary files a/content/posts/2023/06/14/unique-identifiers-based-on-timestamps-in-distributed-applications/Screenshot-2023-06-06-at-1.19.15-PM-1013x1024.png and /dev/null differ diff --git a/content/posts/2023/06/14/unique-identifiers-based-on-timestamps-in-distributed-applications/index.md b/content/posts/2023/06/14/unique-identifiers-based-on-timestamps-in-distributed-applications/index.md index 014ae2481..af4eca1c3 100644 --- a/content/posts/2023/06/14/unique-identifiers-based-on-timestamps-in-distributed-applications/index.md +++ b/content/posts/2023/06/14/unique-identifiers-based-on-timestamps-in-distributed-applications/index.md @@ -82,7 +82,7 @@ This loop looks for the next possible timestamp (with the hostId) and attempts t With JMH, benchmarking this utility in a single-threaded manner is pretty easy. -![](Screenshot-2023-06-06-at-1.19.15-PM-1013x1024.png) +![](Screenshot-2023-06-06-at-1.19.15-PM-1013x1024.jpg) After less than five minutes, we get the following result on a windows laptop. You can get better results on a high-end server or desktop. diff --git a/content/posts/2023/06/16/report-of-my-small-tour-deurope/IMG_1398-2-1500x2000-9496534d.jpeg b/content/posts/2023/06/16/report-of-my-small-tour-deurope/IMG_1398-2-1500x2000-9496534d.jpeg new file mode 100644 index 000000000..ccc862d6e Binary files /dev/null and b/content/posts/2023/06/16/report-of-my-small-tour-deurope/IMG_1398-2-1500x2000-9496534d.jpeg differ diff --git a/content/posts/2023/06/16/report-of-my-small-tour-deurope/image-4-c544d5c1.jpg b/content/posts/2023/06/16/report-of-my-small-tour-deurope/image-4-c544d5c1.jpg new file mode 100644 index 000000000..7ff8b1fd4 Binary files /dev/null and b/content/posts/2023/06/16/report-of-my-small-tour-deurope/image-4-c544d5c1.jpg differ diff --git a/content/posts/2023/06/16/report-of-my-small-tour-deurope/image-5-78e9bb32.jpg b/content/posts/2023/06/16/report-of-my-small-tour-deurope/image-5-78e9bb32.jpg new file mode 100644 index 000000000..a5343c270 Binary files /dev/null and b/content/posts/2023/06/16/report-of-my-small-tour-deurope/image-5-78e9bb32.jpg differ diff --git a/content/posts/2023/06/16/report-of-my-small-tour-deurope/index.md b/content/posts/2023/06/16/report-of-my-small-tour-deurope/index.md index 401b4fcdd..bbe2aa7f1 100644 --- a/content/posts/2023/06/16/report-of-my-small-tour-deurope/index.md +++ b/content/posts/2023/06/16/report-of-my-small-tour-deurope/index.md @@ -23,7 +23,7 @@ Between 31st May and 14th June, I was on tour, giving seven talks in 4 cities in * 10th and 11th of June: [Gulasch Programmier Nacht Karlsruhe](https://cfp.gulas.ch/gpn21/speaker/9ZMNT9/) * 14th of June: [Karlsruher Entwicklertag](https://www.entwicklertag.de/2023/conference_day.html) -{{< img src="https://mostlynerdless.de/wp-content/uploads/2023/06/image-7.png" class="size-full is-resized" width="372" height="507" caption="A visualization of all the cities I visited, but I took the train for all transits (except for the Arnhem to Nieuwegein route, where Ties van de Ven drove me in his Tesla)." >}} +{{< img src="image-7.jpg" class="size-full is-resized" width="372" height="507" caption="A visualization of all the cities I visited, but I took the train for all transits (except for the Arnhem to Nieuwegein route, where Ties van de Ven drove me in his Tesla)." >}} It was an exciting trip, and I had the pleasure of visiting friends in Zurich and Augsburg and a [grain mill shop](https://www.muehlen-kaiser.de/) in Munich. @@ -42,15 +42,15 @@ Being in Milan for the first time was fantastic. I was able to stay with Mario F ## [OpenValue Munich Meetup: Writing a Profiler in 240 Lines of Pure Java](https://www.meetup.com/openvaluemuenchen/events/293736106/) I then went on to give a talk at the OpenValue Munich Meetup, based on the previous talk and my [Writing a Profiler in 240 Lines of Pure Java](https://mostlynerdless.de/blog/2023/03/27/writing-a-profiler-in-240-lines-of-pure-java/) article: -![](https://mostlynerdless.de/wp-content/uploads/2023/06/image-4.png) +![](image-4-c544d5c1.jpg) But before this, I stayed with friends in Augsburg and Zurich: -![](https://mostlynerdless.de/wp-content/uploads/2023/06/IMG_1398-2-1500x2000.jpeg) Wooden tower near Oerlikon, nearby Zurich +![](IMG_1398-2-1500x2000-9496534d.jpeg) Wooden tower near Oerlikon, nearby Zurich ## [JDriven Full Stack Conference](https://jdriven.com/full-stack-conference-2023) I gave a similar talk, only with a little more information on why you shouldn't trust profilers ([see](https://mostlynerdless.de/blog/2023/02/20/do-you-trust-profilers-i-once-did-too/)), in [Nieuwegein](https://jdriven.com/full-stack-conference-2023): -![](https://mostlynerdless.de/wp-content/uploads/2023/06/image-5.png) +![](image-5-78e9bb32.jpg) This concluded my three talks outside of Karlsruhe. diff --git a/content/posts/2023/06/16/the-anatomy-of-a-jvm/11-23-garbage-1024x400-9e55d6e6.jpg b/content/posts/2023/06/16/the-anatomy-of-a-jvm/11-23-garbage-1024x400-9e55d6e6.jpg new file mode 100644 index 000000000..4dbd35312 Binary files /dev/null and b/content/posts/2023/06/16/the-anatomy-of-a-jvm/11-23-garbage-1024x400-9e55d6e6.jpg differ diff --git a/content/posts/2023/06/16/the-anatomy-of-a-jvm/chart-speed-optimization-level-1024x538-8ad0e1a4.jpg b/content/posts/2023/06/16/the-anatomy-of-a-jvm/chart-speed-optimization-level-1024x538-8ad0e1a4.jpg new file mode 100644 index 000000000..cada96a43 Binary files /dev/null and b/content/posts/2023/06/16/the-anatomy-of-a-jvm/chart-speed-optimization-level-1024x538-8ad0e1a4.jpg differ diff --git a/content/posts/2023/06/16/the-anatomy-of-a-jvm/index.md b/content/posts/2023/06/16/the-anatomy-of-a-jvm/index.md index 7cd3d915e..ee2b7559b 100644 --- a/content/posts/2023/06/16/the-anatomy-of-a-jvm/index.md +++ b/content/posts/2023/06/16/the-anatomy-of-a-jvm/index.md @@ -72,7 +72,7 @@ To achieve this, your Java code needs to be converted to bytecode. This is your To achieve this, the JVM bytecode has to be "translated" for each of the supported operating systems and platforms where specific native code is required. This means all the different implementations you, as a developer, would need to write to support different platforms are already handled by the developers of the Java system. You can take a look at the source code to see how this is done within the Java project. All this code is freely available on GitHub. For example, on [this link](https://github.com/openjdk/jdk/tree/master/src/hotspot), you can find the different implementations of the HotSpot, as shown in a few screenshots of the project below. -![Screenshot: JVMbytecode on GitHub](https://www.azul.com/wp-content/uploads/openjdk_sources_hotspot_os-1024x287.png) ![Screenshot: JVMbytecode on GitHub](https://www.azul.com/wp-content/uploads/openjdk_hotspot_cpu-1024x345.png) +![Screenshot: JVMbytecode on GitHub](openjdk_sources_hotspot_os-1024x287-4a7f013d.png) ![Screenshot: JVMbytecode on GitHub](openjdk_hotspot_cpu-1024x345-e80f12dc.png) ### 2. Just-In-Time compilation @@ -92,7 +92,7 @@ But simultaneously, the JVM immediately tracks how often each method is called. When looking at the graph below, we can see how the speed of the application improves when shifting from interpreted bytecode (yellow), to the first optimized code (C1, green), resulting in the best performance with the optimized code (C2, blue). More info about this topic and how an application can be "tuned" to improve these different steps is available on "[Analyzing and Tuning Warm-up](https://docs.azul.com/prime/analyzing-tuning-warmup#an-introduction-to-jit-compilation)". -![CHART: the speed of an application improves when shifting from interpreted bytecode (yellow), to the first optimized code (C1, green), resulting in the best performance with the optimized code (C2, blue).](https://www.azul.com/wp-content/uploads/chart-speed-optimization-level-1024x538.png) +![CHART: the speed of an application improves when shifting from interpreted bytecode (yellow), to the first optimized code (C1, green), resulting in the best performance with the optimized code (C2, blue).](chart-speed-optimization-level-1024x538-8ad0e1a4.jpg) JIT is the opposite of **Ahead-Of-Time (AOT)** and typically behaves better when the produced native code gets optimized for what it exactly needs to do. @@ -108,7 +108,7 @@ Another responsibility of the JVM is automated **memory management**. In other p The Garbage Collector (GC) is that part of the JVM that will handle this for you. It frees you as a developer entirely from the worries of managing the use of the memory. The GC will periodically look up the objects that are no longer needed and referenced them from the code and free memory space so they can be reused. You can find an entire article about the Garbage Collector here: [What Should I Know About Garbage Collection as a Java Developer?](https://www.azul.com/blog/what-should-i-know-about-garbage-collection-as-a-java-developer/) -[![What Should I Know About Garbage Collection as a Java Developer?](https://www.azul.com/wp-content/uploads/11-23-garbage-1024x400.jpg)](https://www.azul.com/blog/what-should-i-know-about-garbage-collection-as-a-java-developer/) +[![What Should I Know About Garbage Collection as a Java Developer?](11-23-garbage-1024x400-9e55d6e6.jpg)](https://www.azul.com/blog/what-should-i-know-about-garbage-collection-as-a-java-developer/) ### 4. Thread management diff --git a/content/posts/2023/06/16/the-anatomy-of-a-jvm/openjdk_hotspot_cpu-1024x345-e80f12dc.png b/content/posts/2023/06/16/the-anatomy-of-a-jvm/openjdk_hotspot_cpu-1024x345-e80f12dc.png new file mode 100644 index 000000000..7a2d65c92 Binary files /dev/null and b/content/posts/2023/06/16/the-anatomy-of-a-jvm/openjdk_hotspot_cpu-1024x345-e80f12dc.png differ diff --git a/content/posts/2023/06/16/the-anatomy-of-a-jvm/openjdk_sources_hotspot_os-1024x287-4a7f013d.png b/content/posts/2023/06/16/the-anatomy-of-a-jvm/openjdk_sources_hotspot_os-1024x287-4a7f013d.png new file mode 100644 index 000000000..a5ed3f6a1 Binary files /dev/null and b/content/posts/2023/06/16/the-anatomy-of-a-jvm/openjdk_sources_hotspot_os-1024x287-4a7f013d.png differ diff --git a/content/posts/2023/06/19/foojay-podcast-25/episode-25-guests.jpg b/content/posts/2023/06/19/foojay-podcast-25/episode-25-guests.jpg new file mode 100644 index 000000000..c88634343 Binary files /dev/null and b/content/posts/2023/06/19/foojay-podcast-25/episode-25-guests.jpg differ diff --git a/content/posts/2023/06/19/foojay-podcast-25/episode-25-guests.png b/content/posts/2023/06/19/foojay-podcast-25/episode-25-guests.png deleted file mode 100644 index 1bc080a0f..000000000 Binary files a/content/posts/2023/06/19/foojay-podcast-25/episode-25-guests.png and /dev/null differ diff --git a/content/posts/2023/06/19/foojay-podcast-25/index.md b/content/posts/2023/06/19/foojay-podcast-25/index.md index b8a0c3ad6..d07b14d60 100644 --- a/content/posts/2023/06/19/foojay-podcast-25/index.md +++ b/content/posts/2023/06/19/foojay-podcast-25/index.md @@ -8,7 +8,7 @@ authors: - "chengen-zhao" - "frankdelporte" - "gerrit-grunwald" -image: "episode-25-guests.png" +image: "episode-25-guests.jpg" categories: - "JavaFX" - "Podcast" diff --git a/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/Screenshot-2023-06-12-at-5.05.20-PM-1024x705-1.jpg b/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/Screenshot-2023-06-12-at-5.05.20-PM-1024x705-1.jpg new file mode 100644 index 000000000..a575f8d0a Binary files /dev/null and b/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/Screenshot-2023-06-12-at-5.05.20-PM-1024x705-1.jpg differ diff --git a/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/Screenshot-2023-06-12-at-5.05.20-PM-1024x705-1.png b/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/Screenshot-2023-06-12-at-5.05.20-PM-1024x705-1.png deleted file mode 100644 index c1d1dc09f..000000000 Binary files a/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/Screenshot-2023-06-12-at-5.05.20-PM-1024x705-1.png and /dev/null differ diff --git a/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/Screenshot-2023-06-12-at-5.05.20-PM-1024x705.jpg b/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/Screenshot-2023-06-12-at-5.05.20-PM-1024x705.jpg new file mode 100644 index 000000000..1d0e5a86e Binary files /dev/null and b/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/Screenshot-2023-06-12-at-5.05.20-PM-1024x705.jpg differ diff --git a/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/Screenshot-2023-06-12-at-5.05.20-PM-1024x705.png b/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/Screenshot-2023-06-12-at-5.05.20-PM-1024x705.png deleted file mode 100644 index 38d1658ee..000000000 Binary files a/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/Screenshot-2023-06-12-at-5.05.20-PM-1024x705.png and /dev/null differ diff --git a/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/index.md b/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/index.md index 5b3b7a515..ab427f44c 100644 --- a/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/index.md +++ b/content/posts/2023/06/21/building-custom-solutions-vs-buy-and-build-software/index.md @@ -5,7 +5,7 @@ lastmod: "2023-06-29T06:46:52+00:00" description: "Sometimes time spent reinventing the wheel results in a revolutionary new rolling device. But sometimes not!" authors: - "rob-austin" -image: "Screenshot-2023-06-12-at-5.05.20-PM-1024x705-1.png" +image: "Screenshot-2023-06-12-at-5.05.20-PM-1024x705-1.jpg" categories: - "Chronicle Software" - "Developer Tools" @@ -71,7 +71,7 @@ My problem would have been if later this was to be upgraded to another FIX versi At this point, it becomes a serious undertaking; and it starts to make more sense to turn to a tried and tested solution, already with all these bells and whistles. To use products with the ability to search historic fix messages: -![](Screenshot-2023-06-12-at-5.05.20-PM-1024x705.png) +![](Screenshot-2023-06-12-at-5.05.20-PM-1024x705.jpg) *Image 3. Searching for all FIX messages with a given client order id.* ...and which raise alerts when sessions disconnect: diff --git a/content/posts/2023/06/26/debugging-openjdk-tests-in-vscode-without-losing-your-mind/Screenshot-from-2023-06-21-15-04-38-927eb7df.png b/content/posts/2023/06/26/debugging-openjdk-tests-in-vscode-without-losing-your-mind/Screenshot-from-2023-06-21-15-04-38-927eb7df.png new file mode 100644 index 000000000..94728db7f Binary files /dev/null and b/content/posts/2023/06/26/debugging-openjdk-tests-in-vscode-without-losing-your-mind/Screenshot-from-2023-06-21-15-04-38-927eb7df.png differ diff --git a/content/posts/2023/06/26/debugging-openjdk-tests-in-vscode-without-losing-your-mind/Screenshot-from-2023-06-21-15-07-40-db962b16.jpg b/content/posts/2023/06/26/debugging-openjdk-tests-in-vscode-without-losing-your-mind/Screenshot-from-2023-06-21-15-07-40-db962b16.jpg new file mode 100644 index 000000000..6538d6a97 Binary files /dev/null and b/content/posts/2023/06/26/debugging-openjdk-tests-in-vscode-without-losing-your-mind/Screenshot-from-2023-06-21-15-07-40-db962b16.jpg differ diff --git a/content/posts/2023/06/26/debugging-openjdk-tests-in-vscode-without-losing-your-mind/Screenshot-from-2023-06-21-15-11-51-c8e1dd69.jpg b/content/posts/2023/06/26/debugging-openjdk-tests-in-vscode-without-losing-your-mind/Screenshot-from-2023-06-21-15-11-51-c8e1dd69.jpg new file mode 100644 index 000000000..816e7baa3 Binary files /dev/null and b/content/posts/2023/06/26/debugging-openjdk-tests-in-vscode-without-losing-your-mind/Screenshot-from-2023-06-21-15-11-51-c8e1dd69.jpg differ diff --git a/content/posts/2023/06/26/debugging-openjdk-tests-in-vscode-without-losing-your-mind/index.md b/content/posts/2023/06/26/debugging-openjdk-tests-in-vscode-without-losing-your-mind/index.md index 7e5a69762..ce91e03e3 100644 --- a/content/posts/2023/06/26/debugging-openjdk-tests-in-vscode-without-losing-your-mind/index.md +++ b/content/posts/2023/06/26/debugging-openjdk-tests-in-vscode-without-losing-your-mind/index.md @@ -47,19 +47,19 @@ Be sure always to pass `JTREG="VERBOSE=all"`: vsreg executes the command, parses You're now able to select "ASGCT debug" in "Run and Debug": -{{< img src="https://mostlynerdless.de/wp-content/uploads/2023/06/Screenshot-from-2023-06-21-15-04-38.png" class="aligncenter size-full is-resized" width="767" height="218" >}} +{{< img src="Screenshot-from-2023-06-21-15-04-38-927eb7df.png" class="aligncenter size-full is-resized" width="767" height="218" >}} You can choose the launch config and run the jtreg test with a debugger: -{{< img src="https://mostlynerdless.de/wp-content/uploads/2023/06/Screenshot-from-2023-06-21-15-07-40.png" class="aligncenter size-full is-resized" width="765" height="544" >}} +{{< img src="Screenshot-from-2023-06-21-15-07-40-db962b16.jpg" class="aligncenter size-full is-resized" width="765" height="544" >}} The debugger pauses on a segfault, but there are always a few at the beginning of the execution that can safely be ignored. We can use the program's pause to add a break-point at an interesting line. After hitting the break-point, we're able to inspect the local variables... -{{< img src="https://mostlynerdless.de/wp-content/uploads/2023/06/Screenshot-from-2023-06-21-15-11-51.png" class="aligncenter size-full is-resized" width="767" height="545" >}} +{{< img src="Screenshot-from-2023-06-21-15-11-51-c8e1dd69.jpg" class="aligncenter size-full is-resized" width="767" height="545" >}} ... and do things like stepping over a line: -{{< img src="https://mostlynerdless.de/wp-content/uploads/2023/06/Screenshot-from-2023-06-21-15-13-18.png" class="aligncenter size-full is-resized" width="767" height="545" >}} +{{< img src="Screenshot-from-2023-06-21-15-13-18.png" class="aligncenter size-full is-resized" width="767" height="545" >}} ## Recompilation diff --git a/content/posts/2023/06/26/foojay-podcast-26/index.md b/content/posts/2023/06/26/foojay-podcast-26/index.md index 16c23e878..db4ee8151 100644 --- a/content/posts/2023/06/26/foojay-podcast-26/index.md +++ b/content/posts/2023/06/26/foojay-podcast-26/index.md @@ -69,7 +69,7 @@ You can listen and subscribe to the Foojay Podcast on: * [@FrankDelporte](https://twitter.com/FrankDelporte) * [foojay.social/@frankdelporte](https://foojay.social/@frankdelporte) -![](podcast-versioncontrol-guests-1024x383.png) +![](podcast-versioncontrol-guests-1024x383.jpg) ## Content diff --git a/content/posts/2023/06/26/foojay-podcast-26/podcast-versioncontrol-guests-1024x383.jpg b/content/posts/2023/06/26/foojay-podcast-26/podcast-versioncontrol-guests-1024x383.jpg new file mode 100644 index 000000000..59d43f59d Binary files /dev/null and b/content/posts/2023/06/26/foojay-podcast-26/podcast-versioncontrol-guests-1024x383.jpg differ diff --git a/content/posts/2023/06/26/foojay-podcast-26/podcast-versioncontrol-guests-1024x383.png b/content/posts/2023/06/26/foojay-podcast-26/podcast-versioncontrol-guests-1024x383.png deleted file mode 100644 index e0f8af16a..000000000 Binary files a/content/posts/2023/06/26/foojay-podcast-26/podcast-versioncontrol-guests-1024x383.png and /dev/null differ diff --git a/content/posts/2023/06/29/how-to-optimise-cpu-performance-through-isolation-and-system-tuning/Screenshot-2023-06-20-at-2.12.53-PM-1024x632.jpg b/content/posts/2023/06/29/how-to-optimise-cpu-performance-through-isolation-and-system-tuning/Screenshot-2023-06-20-at-2.12.53-PM-1024x632.jpg new file mode 100644 index 000000000..e51996c66 Binary files /dev/null and b/content/posts/2023/06/29/how-to-optimise-cpu-performance-through-isolation-and-system-tuning/Screenshot-2023-06-20-at-2.12.53-PM-1024x632.jpg differ diff --git a/content/posts/2023/06/29/how-to-optimise-cpu-performance-through-isolation-and-system-tuning/Screenshot-2023-06-20-at-2.12.53-PM-1024x632.png b/content/posts/2023/06/29/how-to-optimise-cpu-performance-through-isolation-and-system-tuning/Screenshot-2023-06-20-at-2.12.53-PM-1024x632.png deleted file mode 100644 index 51948a0ce..000000000 Binary files a/content/posts/2023/06/29/how-to-optimise-cpu-performance-through-isolation-and-system-tuning/Screenshot-2023-06-20-at-2.12.53-PM-1024x632.png and /dev/null differ diff --git a/content/posts/2023/06/29/how-to-optimise-cpu-performance-through-isolation-and-system-tuning/index.md b/content/posts/2023/06/29/how-to-optimise-cpu-performance-through-isolation-and-system-tuning/index.md index 9049015c9..9b34ef710 100644 --- a/content/posts/2023/06/29/how-to-optimise-cpu-performance-through-isolation-and-system-tuning/index.md +++ b/content/posts/2023/06/29/how-to-optimise-cpu-performance-through-isolation-and-system-tuning/index.md @@ -45,7 +45,7 @@ csets is a utility that is used specifically to manage CPU affinity and placemen This can be especially useful in high-performance computing environments, where minimising contention and maximising performance is critical. Both cgroups and csets enable specific cpuset groupings to be defined, with processes confined to run within one particular group. -![](Screenshot-2023-06-20-at-2.12.53-PM-1024x632.png) +![](Screenshot-2023-06-20-at-2.12.53-PM-1024x632.jpg) *Figure 1. A comparison of how threads can be managed with isolcpus and cgroups. isolcpus allows the management of individual threads but prevents the use of flexible CPU groups.* diff --git a/content/posts/2023/07/03/foojay-status-report-july-2023/image-1-1024x631-1.jpg b/content/posts/2023/07/03/foojay-status-report-july-2023/image-1-1024x631-1.jpg new file mode 100644 index 000000000..fb485b12c Binary files /dev/null and b/content/posts/2023/07/03/foojay-status-report-july-2023/image-1-1024x631-1.jpg differ diff --git a/content/posts/2023/07/03/foojay-status-report-july-2023/image-1-1024x631-1.png b/content/posts/2023/07/03/foojay-status-report-july-2023/image-1-1024x631-1.png deleted file mode 100644 index c6ce56c57..000000000 Binary files a/content/posts/2023/07/03/foojay-status-report-july-2023/image-1-1024x631-1.png and /dev/null differ diff --git a/content/posts/2023/07/03/foojay-status-report-july-2023/image-12-1024x601.jpg b/content/posts/2023/07/03/foojay-status-report-july-2023/image-12-1024x601.jpg new file mode 100644 index 000000000..012b5e4db Binary files /dev/null and b/content/posts/2023/07/03/foojay-status-report-july-2023/image-12-1024x601.jpg differ diff --git a/content/posts/2023/07/03/foojay-status-report-july-2023/image-12-1024x601.png b/content/posts/2023/07/03/foojay-status-report-july-2023/image-12-1024x601.png deleted file mode 100644 index b8226ff34..000000000 Binary files a/content/posts/2023/07/03/foojay-status-report-july-2023/image-12-1024x601.png and /dev/null differ diff --git a/content/posts/2023/07/03/foojay-status-report-july-2023/index.md b/content/posts/2023/07/03/foojay-status-report-july-2023/index.md index add48230e..fa9aa3b11 100644 --- a/content/posts/2023/07/03/foojay-status-report-july-2023/index.md +++ b/content/posts/2023/07/03/foojay-status-report-july-2023/index.md @@ -5,7 +5,7 @@ lastmod: "2023-07-03T11:00:52+00:00" description: "Great big overview of Foojay.io, plus its subprojects and related insights and statistics, as well as upcoming plans." authors: - "geertjan-wielenga" -image: "image-1-1024x631-1.png" +image: "image-1-1024x631-1.jpg" categories: - "Events" - "Foojay" @@ -119,7 +119,7 @@ Join in with the above [at the OpenValue meetup here](https://www.meetup.com/ope ## OpenJDK Information The first impulse for the creation of Foojay.io back in April 2020 was the absence of a clear place listing all the issues making it into a quarterly update or LTS release. That content continues to be added to the site each quarter, [as shown below](https://javaalmanac.io/jdk/17/), with the option for anyone to vote on their favorite fixes for addition to the Highlights tab. -[![](image-12-1024x601.png)](https://javaalmanac.io/jdk/17/) +[![](image-12-1024x601.jpg)](https://javaalmanac.io/jdk/17/) A key collaborator with Foojay.io is Chris Newland, whose range of tools on [chriswhocodes.com](https://chriswhocodes.com/) are gradually being transitioned to Foojay.io, most recently his collection of command line arguments reference materials, though the display and user interface continue to be enhanced and expanded. ![](image-13-1024x612.png) diff --git a/content/posts/2023/07/04/a-dissection-of-java-jdbc-to-postgresql-connections-part-2-batching/forjdbcfrits.jpg b/content/posts/2023/07/04/a-dissection-of-java-jdbc-to-postgresql-connections-part-2-batching/forjdbcfrits.jpg new file mode 100644 index 000000000..91358efcb Binary files /dev/null and b/content/posts/2023/07/04/a-dissection-of-java-jdbc-to-postgresql-connections-part-2-batching/forjdbcfrits.jpg differ diff --git a/content/posts/2023/07/04/a-dissection-of-java-jdbc-to-postgresql-connections-part-2-batching/forjdbcfrits.png b/content/posts/2023/07/04/a-dissection-of-java-jdbc-to-postgresql-connections-part-2-batching/forjdbcfrits.png deleted file mode 100644 index 495442316..000000000 Binary files a/content/posts/2023/07/04/a-dissection-of-java-jdbc-to-postgresql-connections-part-2-batching/forjdbcfrits.png and /dev/null differ diff --git a/content/posts/2023/07/04/a-dissection-of-java-jdbc-to-postgresql-connections-part-2-batching/index.md b/content/posts/2023/07/04/a-dissection-of-java-jdbc-to-postgresql-connections-part-2-batching/index.md index 6ef06a7c3..899d668f6 100644 --- a/content/posts/2023/07/04/a-dissection-of-java-jdbc-to-postgresql-connections-part-2-batching/index.md +++ b/content/posts/2023/07/04/a-dissection-of-java-jdbc-to-postgresql-connections-part-2-batching/index.md @@ -5,7 +5,7 @@ lastmod: "2023-07-04T13:56:42+00:00" description: "Batching for PostgreSQL JDBC is a property of the extended protocol. It uniquely allows you to send multiple statements in a single request." authors: - "frits-hoogland" -image: "forjdbcfrits.png" +image: "forjdbcfrits.jpg" categories: - "Databases" - "Performance" diff --git a/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/index.md b/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/index.md index 56adfb348..388ff6b22 100644 --- a/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/index.md +++ b/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/index.md @@ -39,11 +39,11 @@ In latest release of [Test Runner for Java](https://marketplace.visualstudio.com Settings.json -[![Settings](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/06/settings.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/06/settings.png) +[![Settings](settings.png)](settings.png) Tasks.json -[![Tasks](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/06/tasks.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/06/tasks.png) +[![Tasks](tasks-42297a4d.png)](tasks-42297a4d.png) Notice that these are just examples and you can configure the tasks the way whichever way you prefer. @@ -55,17 +55,17 @@ For more about postDebugTask, you can [read more here](https://code.visualstudio Thanks to contribution from the community ([PR #765](https://github.com/microsoft/vscode-java-dependency/pull/765) and [PR#757](https://github.com/microsoft/vscode-java-dependency/pull/757)). Project Manager for Java now supports creating Micronaut and Graal Cloud Native Projects, you can now create those projects from the command palette (Java: Create Java Project) or just using "Create Java Project" button on the UI. Here's a demo. Notice: you will need to install the corresponding extensions for these to work. -[![New project type](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/06/project.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/06/project.png) +[![New project type](project-379be4e9.jpg)](project-379be4e9.jpg) #### Install Extension Pack for Java To use all features mentioned above, please download and install [Extension Pack for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) on Visual Studio Code. -[![Extension pack for Java](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png) +[![Extension pack for Java](javapack-892c0338.png)](javapack-892c0338.png) If you are a Spring developer working on a Spring Boot application, you can also download the [Spring Boot Extension Pack](https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-boot-dev-pack) for specialized Spring experience. -[![Spring boot extension pack](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png) +[![Spring boot extension pack](spring-ac42cb4c.png)](spring-ac42cb4c.png) Feedback and suggestions diff --git a/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/javapack-892c0338.png b/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/javapack-892c0338.png new file mode 100644 index 000000000..c05f90e30 Binary files /dev/null and b/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/javapack-892c0338.png differ diff --git a/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/project-379be4e9.jpg b/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/project-379be4e9.jpg new file mode 100644 index 000000000..fab483579 Binary files /dev/null and b/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/project-379be4e9.jpg differ diff --git a/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/spring-ac42cb4c.png b/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/spring-ac42cb4c.png new file mode 100644 index 000000000..c3d38f0a6 Binary files /dev/null and b/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/spring-ac42cb4c.png differ diff --git a/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/tasks-42297a4d.png b/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/tasks-42297a4d.png new file mode 100644 index 000000000..a02bc7ef7 Binary files /dev/null and b/content/posts/2023/07/10/java-on-visual-studio-code-june-2023/tasks-42297a4d.png differ diff --git a/content/posts/2023/07/13/journeys-in-java-level-10-service-discovery-with-eureka/eureka-server-final.jpg b/content/posts/2023/07/13/journeys-in-java-level-10-service-discovery-with-eureka/eureka-server-final.jpg new file mode 100644 index 000000000..763c4df03 Binary files /dev/null and b/content/posts/2023/07/13/journeys-in-java-level-10-service-discovery-with-eureka/eureka-server-final.jpg differ diff --git a/content/posts/2023/07/13/journeys-in-java-level-10-service-discovery-with-eureka/eureka-server-final.png b/content/posts/2023/07/13/journeys-in-java-level-10-service-discovery-with-eureka/eureka-server-final.png deleted file mode 100644 index b5c74b33d..000000000 Binary files a/content/posts/2023/07/13/journeys-in-java-level-10-service-discovery-with-eureka/eureka-server-final.png and /dev/null differ diff --git a/content/posts/2023/07/13/journeys-in-java-level-10-service-discovery-with-eureka/index.md b/content/posts/2023/07/13/journeys-in-java-level-10-service-discovery-with-eureka/index.md index d87fd76d4..9eede2078 100644 --- a/content/posts/2023/07/13/journeys-in-java-level-10-service-discovery-with-eureka/index.md +++ b/content/posts/2023/07/13/journeys-in-java-level-10-service-discovery-with-eureka/index.md @@ -277,7 +277,7 @@ Next, we can test all of our endpoints. * Neo4j database: ensure [AuraDB instance is running](https://console.neo4j.io/) (free instances are automatically paused after 3 days). * Goodreads-svc4: `curl localhost:8083/neo`, `curl localhost:8083/neo/reviews`, and `curl localhost:8083/neo/reviews/178186` or web browser with only URL. -![Test Eureka server and clients](eureka-server-final.png) +![Test Eureka server and clients](eureka-server-final.jpg) Bring everything back down again with the below command. diff --git a/content/posts/2023/07/14/how-to-share-your-work-with-a-video-or-podcast/index.md b/content/posts/2023/07/14/how-to-share-your-work-with-a-video-or-podcast/index.md index c84d48eef..b83eecc08 100644 --- a/content/posts/2023/07/14/how-to-share-your-work-with-a-video-or-podcast/index.md +++ b/content/posts/2023/07/14/how-to-share-your-work-with-a-video-or-podcast/index.md @@ -108,7 +108,7 @@ I also use DaVinci Resolve for podcast editing, as I bought the additional **[Sp {{< gallery >}} podcast-editing-audacity-1024x695.png -podcast-editing-davinci-1024x614.png +podcast-editing-davinci-1024x614.jpg IMG_20230316_162046-1024x768.jpg {{< /gallery >}} diff --git a/content/posts/2023/07/14/how-to-share-your-work-with-a-video-or-podcast/podcast-editing-davinci-1024x614.jpg b/content/posts/2023/07/14/how-to-share-your-work-with-a-video-or-podcast/podcast-editing-davinci-1024x614.jpg new file mode 100644 index 000000000..1599aa9bb Binary files /dev/null and b/content/posts/2023/07/14/how-to-share-your-work-with-a-video-or-podcast/podcast-editing-davinci-1024x614.jpg differ diff --git a/content/posts/2023/07/14/how-to-share-your-work-with-a-video-or-podcast/podcast-editing-davinci-1024x614.png b/content/posts/2023/07/14/how-to-share-your-work-with-a-video-or-podcast/podcast-editing-davinci-1024x614.png deleted file mode 100644 index b4ade2742..000000000 Binary files a/content/posts/2023/07/14/how-to-share-your-work-with-a-video-or-podcast/podcast-editing-davinci-1024x614.png and /dev/null differ diff --git a/content/posts/2023/07/14/reactive-programming-made-easy/image1.jpg b/content/posts/2023/07/14/reactive-programming-made-easy/image1.jpg new file mode 100644 index 000000000..47ce98ed0 Binary files /dev/null and b/content/posts/2023/07/14/reactive-programming-made-easy/image1.jpg differ diff --git a/content/posts/2023/07/14/reactive-programming-made-easy/image1.png b/content/posts/2023/07/14/reactive-programming-made-easy/image1.png deleted file mode 100644 index be5c3b70e..000000000 Binary files a/content/posts/2023/07/14/reactive-programming-made-easy/image1.png and /dev/null differ diff --git a/content/posts/2023/07/14/reactive-programming-made-easy/index.md b/content/posts/2023/07/14/reactive-programming-made-easy/index.md index 01e6722a8..7d78e006a 100644 --- a/content/posts/2023/07/14/reactive-programming-made-easy/index.md +++ b/content/posts/2023/07/14/reactive-programming-made-easy/index.md @@ -74,7 +74,7 @@ To use an operator that produces a new Publisher instance, you must subscribe to You can use code that might cause a delay or pause in a program where it's not supposed to. IntelliJ IDEA provides the *Possibly blocking call in non-blocking context* inspection that looks for situations like this. -![](image1.png) +![](image1.jpg) It is convenient to annotate code blocks with @Blocking and @NonBlocking annotations from the JetBrains annotations collection. This helps IntelliJ IDEA detect blocking calls in non-blocking contexts. To get the annotations, add org.jetbrains:annotations version 22.0.0 or later to your project's dependencies. diff --git a/content/posts/2023/07/15/i-could-write-a-blog-post-or/IMG_1480-2000x1500-b4d66c37.jpg b/content/posts/2023/07/15/i-could-write-a-blog-post-or/IMG_1480-2000x1500-b4d66c37.jpg new file mode 100644 index 000000000..560454d63 Binary files /dev/null and b/content/posts/2023/07/15/i-could-write-a-blog-post-or/IMG_1480-2000x1500-b4d66c37.jpg differ diff --git a/content/posts/2023/07/15/i-could-write-a-blog-post-or/index.md b/content/posts/2023/07/15/i-could-write-a-blog-post-or/index.md index 1f98578da..9da368272 100644 --- a/content/posts/2023/07/15/i-could-write-a-blog-post-or/index.md +++ b/content/posts/2023/07/15/i-could-write-a-blog-post-or/index.md @@ -23,7 +23,7 @@ This doesn't mean that these blog posts are terrible, just that they could need Having a rather strict schedule pushes me to create content early and often, helping me to finalize and write down my ideas on a regular basis. But sometimes... Well sometimes I'm behind schedule (didn't write a blog post this week and the week before) and I could force myself to write a blog post, or ... -![](https://mostlynerdless.de/wp-content/uploads/2023/07/IMG_1480-2000x1500.jpg) +![](IMG_1480-2000x1500-b4d66c37.jpg) ... just climb up a castle and enjoy being around friends, looking into the sunset. A blog post can wait a week, but life can't: > Life is what happens to us while we are making other plans. diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/1-wrgcVpXAKhqQxKItgS5urQ-d0e3445e.jpg b/content/posts/2023/07/18/effective-coding-with-java-observability/1-wrgcVpXAKhqQxKItgS5urQ-d0e3445e.jpg new file mode 100644 index 000000000..d62932a71 Binary files /dev/null and b/content/posts/2023/07/18/effective-coding-with-java-observability/1-wrgcVpXAKhqQxKItgS5urQ-d0e3445e.jpg differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-19-1024x659.jpg b/content/posts/2023/07/18/effective-coding-with-java-observability/image-19-1024x659.jpg new file mode 100644 index 000000000..c0799c11a Binary files /dev/null and b/content/posts/2023/07/18/effective-coding-with-java-observability/image-19-1024x659.jpg differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-19-1024x659.png b/content/posts/2023/07/18/effective-coding-with-java-observability/image-19-1024x659.png deleted file mode 100644 index 74c059dd8..000000000 Binary files a/content/posts/2023/07/18/effective-coding-with-java-observability/image-19-1024x659.png and /dev/null differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-21-1024x682.jpg b/content/posts/2023/07/18/effective-coding-with-java-observability/image-21-1024x682.jpg new file mode 100644 index 000000000..6598e9d13 Binary files /dev/null and b/content/posts/2023/07/18/effective-coding-with-java-observability/image-21-1024x682.jpg differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-21-1024x682.png b/content/posts/2023/07/18/effective-coding-with-java-observability/image-21-1024x682.png deleted file mode 100644 index fdeac0186..000000000 Binary files a/content/posts/2023/07/18/effective-coding-with-java-observability/image-21-1024x682.png and /dev/null differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-24-1024x547.jpg b/content/posts/2023/07/18/effective-coding-with-java-observability/image-24-1024x547.jpg new file mode 100644 index 000000000..f0b1b4757 Binary files /dev/null and b/content/posts/2023/07/18/effective-coding-with-java-observability/image-24-1024x547.jpg differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-24-1024x547.png b/content/posts/2023/07/18/effective-coding-with-java-observability/image-24-1024x547.png deleted file mode 100644 index e110994ae..000000000 Binary files a/content/posts/2023/07/18/effective-coding-with-java-observability/image-24-1024x547.png and /dev/null differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-26-1024x587.jpg b/content/posts/2023/07/18/effective-coding-with-java-observability/image-26-1024x587.jpg new file mode 100644 index 000000000..ac6765995 Binary files /dev/null and b/content/posts/2023/07/18/effective-coding-with-java-observability/image-26-1024x587.jpg differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-26-1024x587.png b/content/posts/2023/07/18/effective-coding-with-java-observability/image-26-1024x587.png deleted file mode 100644 index 668a21757..000000000 Binary files a/content/posts/2023/07/18/effective-coding-with-java-observability/image-26-1024x587.png and /dev/null differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-27-1024x532.jpg b/content/posts/2023/07/18/effective-coding-with-java-observability/image-27-1024x532.jpg new file mode 100644 index 000000000..ab813dde1 Binary files /dev/null and b/content/posts/2023/07/18/effective-coding-with-java-observability/image-27-1024x532.jpg differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-27-1024x532.png b/content/posts/2023/07/18/effective-coding-with-java-observability/image-27-1024x532.png deleted file mode 100644 index 041d07155..000000000 Binary files a/content/posts/2023/07/18/effective-coding-with-java-observability/image-27-1024x532.png and /dev/null differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-28-1024x505.jpg b/content/posts/2023/07/18/effective-coding-with-java-observability/image-28-1024x505.jpg new file mode 100644 index 000000000..3da931ed9 Binary files /dev/null and b/content/posts/2023/07/18/effective-coding-with-java-observability/image-28-1024x505.jpg differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-28-1024x505.png b/content/posts/2023/07/18/effective-coding-with-java-observability/image-28-1024x505.png deleted file mode 100644 index 6a9bef5fb..000000000 Binary files a/content/posts/2023/07/18/effective-coding-with-java-observability/image-28-1024x505.png and /dev/null differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-29-1024x343.jpg b/content/posts/2023/07/18/effective-coding-with-java-observability/image-29-1024x343.jpg new file mode 100644 index 000000000..80bb73c99 Binary files /dev/null and b/content/posts/2023/07/18/effective-coding-with-java-observability/image-29-1024x343.jpg differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-29-1024x343.png b/content/posts/2023/07/18/effective-coding-with-java-observability/image-29-1024x343.png deleted file mode 100644 index 98bd8a10e..000000000 Binary files a/content/posts/2023/07/18/effective-coding-with-java-observability/image-29-1024x343.png and /dev/null differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-30-1024x682.jpg b/content/posts/2023/07/18/effective-coding-with-java-observability/image-30-1024x682.jpg new file mode 100644 index 000000000..6598e9d13 Binary files /dev/null and b/content/posts/2023/07/18/effective-coding-with-java-observability/image-30-1024x682.jpg differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-30-1024x682.png b/content/posts/2023/07/18/effective-coding-with-java-observability/image-30-1024x682.png deleted file mode 100644 index fdeac0186..000000000 Binary files a/content/posts/2023/07/18/effective-coding-with-java-observability/image-30-1024x682.png and /dev/null differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-31-1024x522.jpg b/content/posts/2023/07/18/effective-coding-with-java-observability/image-31-1024x522.jpg new file mode 100644 index 000000000..9f594894d Binary files /dev/null and b/content/posts/2023/07/18/effective-coding-with-java-observability/image-31-1024x522.jpg differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-31-1024x522.png b/content/posts/2023/07/18/effective-coding-with-java-observability/image-31-1024x522.png deleted file mode 100644 index fac32e0d6..000000000 Binary files a/content/posts/2023/07/18/effective-coding-with-java-observability/image-31-1024x522.png and /dev/null differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-33-1024x559.jpg b/content/posts/2023/07/18/effective-coding-with-java-observability/image-33-1024x559.jpg new file mode 100644 index 000000000..ae5810e74 Binary files /dev/null and b/content/posts/2023/07/18/effective-coding-with-java-observability/image-33-1024x559.jpg differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-33-1024x559.png b/content/posts/2023/07/18/effective-coding-with-java-observability/image-33-1024x559.png deleted file mode 100644 index 8314f5712..000000000 Binary files a/content/posts/2023/07/18/effective-coding-with-java-observability/image-33-1024x559.png and /dev/null differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-34-1024x676.jpg b/content/posts/2023/07/18/effective-coding-with-java-observability/image-34-1024x676.jpg new file mode 100644 index 000000000..c5e9be14f Binary files /dev/null and b/content/posts/2023/07/18/effective-coding-with-java-observability/image-34-1024x676.jpg differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/image-34-1024x676.png b/content/posts/2023/07/18/effective-coding-with-java-observability/image-34-1024x676.png deleted file mode 100644 index 02a75bfe7..000000000 Binary files a/content/posts/2023/07/18/effective-coding-with-java-observability/image-34-1024x676.png and /dev/null differ diff --git a/content/posts/2023/07/18/effective-coding-with-java-observability/index.md b/content/posts/2023/07/18/effective-coding-with-java-observability/index.md index 0a8336190..0eb127258 100644 --- a/content/posts/2023/07/18/effective-coding-with-java-observability/index.md +++ b/content/posts/2023/07/18/effective-coding-with-java-observability/index.md @@ -23,7 +23,7 @@ There are many common mistakes I've seen repeated over the years while trying to It should not come as a surprise. Many 'let's add observability platform X' projects start off with plenty of fanfare but also a very hazy sense of direction and extremely muddled criteria for success. The vision of what effective observability can do to**actually help** developers work better is suspiciously missing from the preaching of many of its commercial vendors and oracles. Ask yourself, how often do you find yourself taking your eyes off the code in the IDE to find out what you can learn from its execution data? Please don't get me wrong, I am a huge believer in the role observability (fancy name for data about your app) can play in software development. OpenTelemetry is huge. I can see clearly how it can help developers write better code, introduce new paradigms, and accelerate development cycles. It can inspire developers to ask questions they did not yet even consider. However, everywhere you look online the focus still seems to be on observability itself, how to enable it, and how to get started. As awesome as shiny dashboards with cool graphics are, many teams are left in the dark as to where to take it from there. -![](https://cdn-images-1.medium.com/max/1440/1*wrgcVpXAKhqQxKItgS5urQ.png) *Source: Merktoonist, license acquired by the author* +![](1-wrgcVpXAKhqQxKItgS5urQ-d0e3445e.jpg) *Source: Merktoonist, license acquired by the author* In this post, I will try to address this far more interesting topic: *What does success for developers using observability look like? How can the team expect to **code** and **release** better using the wealth of code runtime data? More importantly, what are examples of things that observability can tell you, right now, about your code and how can it help you improve it? We'll look at concrete code examples to find out how to leverage observability as a coding practice.* @@ -52,7 +52,7 @@ Bob's basic observability stack: * [Prometheus](https://prometheus.io/) for saving matrics and the OSS version of [Grafana](https://grafana.com/oss/) for visualizing them It's important to note that to start collecting code data with OTEL, Bob didn't need to make **any code changes** . Running locally, he can safely use the [OTEL agent](https://opentelemetry.io/docs/instrumentation/java/automatic/). In his case, he just references the agent in the run config of the IDE so it would be picked up when running/debugging locally. He also adds a [docker-compose.override](https://github.com/doppleware/spring-petclinic-cf/blob/main/docker-compose.override.otel.yml) file to be used launching the application using Docker/Podman (this also doesn't require changing the sourced docker-compose file, I wrote about this neat little trick [here](https://digma.ai/blog/observing-java-application-running-via-docker-compose-using-opentelemetry/)). -![](image-19-1024x659.png) +![](image-19-1024x659.jpg) With everything up and running, Bob creates a new feature branch and begins work on the new functionality. You can find the entire forked project available in [this](https://github.com/doppleware/spring-petclinic-cf) repo if you wish to take a closer look at the code. @@ -208,13 +208,13 @@ http_server_requests_seconds{uri="/owners/{ownerId}/pets/new", quantile="0.5", m We can then examine the graph before and after the code change. **Before:** -![](image-21-1024x682.png) +![](image-21-1024x682.jpg) **After:** ![](image-23-1024x582.png) Yikes! Undoubtedly the changes caused a significant performance issue. We can immediately spot it just by looking at the metrics but the traces can reveal much more about the root causes and underlying problems. It's time to call up Jaeger, another component of our observability stack. Jaeger is used to visualize the captured traces and presents Bob with the opportunity to investigate what his code has been up to while he was busy adding more logic and functionality: -![](image-24-1024x547.png) +![](image-24-1024x547.jpg) Thus, without adding a single breakpoint we can already learn a lot going on with this code in this request. Information that until now Bob was quite oblivious to. While he did notice some lagginess when trying out the new request, he did not pay it much attention. Maybe the external API is just slow? Now that he has access to the trace, he can take a fresh look at the code he's introducing. @@ -228,20 +228,20 @@ It looks like the 'Visits' relationship is being fetched lazily for each pet in ## HTTP Requests Chatter The true cause of the performance regression seems to be related to a misunderstanding of Bob's, probably due to the ambiguous naming of the `VaccineServiceFacade` methods. It seems that it was not that clear to him that an API call is executed behind the scenes each time the `VaccineRecord` function was invoked. This leaky abstraction might have been alleviated with a better naming convention, emphasizing this is in fact an execution of a long synchronous operation. -![](image-26-1024x587.png) +![](image-26-1024x587.jpg) -{{< img src="image-27-1024x532.png" class="size-large is-resized" width="840" height="436" >}} +{{< img src="image-27-1024x532.jpg" class="size-large is-resized" width="840" height="436" >}} ## Hidden Errors Something else is going on with the HTTP requests. As we scroll down the list of requests Bob notices some of them ended with an error, followed by an exception in trying to serialize the nonexisting response. The underlying cause, based on the HTTP error code is related to a rate limit or throttling or the external API. This problem may be temporarily solved by optimizing the number of calls but may resurface as more users start using this component concurrently. Additionally, the exception handling in this code is definitely faulty, perhaps a retry mechanism might be in order. -![](image-28-1024x505.png) +![](image-28-1024x505.jpg) ## Open Session in View Just before he is off to start correcting the many issues revealed by examining the observability artifacts, Bob decides to take a quick look at the other API he modified. There doesn't seem to be a significant performance degradation in this case, but examining the trace still reveals at least one issue that needs to be fixed. -{{< img src="image-29-1024x343.png" class="size-large is-resized" width="840" height="281" >}} +{{< img src="image-29-1024x343.jpg" class="size-large is-resized" width="840" height="281" >}} There is a significant number of SQL calls occurring during the rendering phase, an anti-pattern caused by accessing lazy Hibernate attributes while the Session is still open, known as [**open session in view**](https://vladmihalcea.com/the-open-session-in-view-anti-pattern/)**.**This issue can be tricky to spot but is immediately apparent in the trace. @@ -256,7 +256,7 @@ In this somewhat naive example, we were able to demonstrate how simply turning O 1. **A manual process that is not continuous**: The entire experiment relied on Bob having the dedication, discipline, and will to double-check his code. As the release pressure mounts, he is less and less likely to do so. Especially if in a considerable number of instances he will have spent the time to investigate the data without coming up with anything of significance. Similar to testing, unless it is continuous and automatic, it will probably not happen at scale. 2. **Expertise requirements**: As mentioned, this example is somewhat contrived in highlighting some clear-cut scenarios. In reality, it is very hard, without knowledge of statistics, regressions, and even basic ML to work with the data in such a way to understand the impact of code changes. Take as an example the first graph we examine, the 'before' state. Does the difference between the values represent a fluke, some ramp-up cost, or something else? -![](image-30-1024x682.png) +![](image-30-1024x682.jpg) 3. **Context switching and tooling overload** - Context switching is hard**.** For this kind of programming paradigm to work, it has to be a solution that can be **owned** by the Engineering team. It can't be a bunch of dashboards and tools which developers need to master and know how to read correctly. The more we reduce the required cognitive effort the more likely it is that this information will be put to use. @@ -276,15 +276,15 @@ In this somewhat naive example, we were able to demonstrate how simply turning O Full disclosure: I am the author of [**Digma**](https://digma.ai/)**,** a free Continuous Feedback plugin that I created because this inexplicable chasm preventing developers from using code data was driving me mad with frustration. More than once I've encountered a 'Bob' scenario where all of the information was there, right there in the open. It could be found either in the debug/test data or even in the production data about the code, it's just that no one would or could examine it. What we envisioned with Digma was pipeline automation that could spot all of the different issues Bob finally picked up on and more, and make that continuous — just a part of the normal dev cycle. In fact, we removed the whole OTEL configuration, boilerplate, and toolings from the equation. Reducing the work required to 'turn it on' to a simple button toggle. In this manner, the entire initiative now requires Bob to do only two things - enable observability, and run his code. This means more developers would be able to start exploring the potential of code runtime data, and not just die-hards like Bob. -![](image-33-1024x559.png) +![](image-33-1024x559.jpg) Having enabled observability collection, here is the IDE view of the code Bob would have seen had he been using the Digma plugin while debugging and running locally: -![](image-31-1024x522.png) +![](image-31-1024x522.jpg) Everything from the Session in View anti-pattern, the N+1 Queries, detecting slowdowns, and the hidden errors become just a part of the developer's view — living documentation. It is continually unlocked and deciphered from the huge amounts of data that are collected as Bob continues to code, run and debug. In this manner, similar to testing, we can finally make observability transparent — something that requires no conscious effort. Just like plumbing, the role of observability should be to blend into the background. It should not matter how the data is collected or whether it was OTEL or some other technology. More importantly, we've reversed the process. Instead of Bob searching in a haystack of metrics and traces for issues related to the code, he beings by viewing the code issues which themselves contain links to relevant metrics and traces for further investigation. -![](image-34-1024x676.png) +![](image-34-1024x676.jpg) ## What do you know / or want to know about your code? diff --git a/content/posts/2023/07/19/jdk-safari-how-to-find-hidden-tools-in-the-jdk/index.md b/content/posts/2023/07/19/jdk-safari-how-to-find-hidden-tools-in-the-jdk/index.md index 3c31d9db8..f834600d3 100644 --- a/content/posts/2023/07/19/jdk-safari-how-to-find-hidden-tools-in-the-jdk/index.md +++ b/content/posts/2023/07/19/jdk-safari-how-to-find-hidden-tools-in-the-jdk/index.md @@ -665,7 +665,7 @@ Another tool that many Java developers are not familiar with is the HotSpot Debu You can also start the hsdb ui via: `java -m jdk.hotspot.agent/sun.jvm.hotspot.HSDB`. -{{< img src="java-hsdb-700x445.png" class="size-medium" alt="Hot Spot Debugger UI" width="700" height="445" >}} +{{< img src="java-hsdb-700x445.jpg" class="size-medium" alt="Hot Spot Debugger UI" width="700" height="445" >}} HotSpot Debugger UI diff --git a/content/posts/2023/07/19/jdk-safari-how-to-find-hidden-tools-in-the-jdk/java-hsdb-700x445.jpg b/content/posts/2023/07/19/jdk-safari-how-to-find-hidden-tools-in-the-jdk/java-hsdb-700x445.jpg new file mode 100644 index 000000000..35e077b10 Binary files /dev/null and b/content/posts/2023/07/19/jdk-safari-how-to-find-hidden-tools-in-the-jdk/java-hsdb-700x445.jpg differ diff --git a/content/posts/2023/07/19/jdk-safari-how-to-find-hidden-tools-in-the-jdk/java-hsdb-700x445.png b/content/posts/2023/07/19/jdk-safari-how-to-find-hidden-tools-in-the-jdk/java-hsdb-700x445.png deleted file mode 100644 index f422cf538..000000000 Binary files a/content/posts/2023/07/19/jdk-safari-how-to-find-hidden-tools-in-the-jdk/java-hsdb-700x445.png and /dev/null differ diff --git a/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/index.md b/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/index.md index 5a6ed82d3..d4971f918 100644 --- a/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/index.md +++ b/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/index.md @@ -31,10 +31,10 @@ Nevertheless, we simply can't predict how people will use a library like this, a ## Upgrading SnakeYaml with Snyk Open Source Let's use Snyk Open Source to find a replacement for the old `SnakeYaml` library. If I locally run `snyk test` with the Snyk CLI, I see that there is a replacement available. -![blog-snakeyaml-ace-warning](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1687371213%2Fblog-snakeyaml-ace-warning.jpg&w=2560&q=75) +![blog-snakeyaml-ace-warning](snyk-io-850e962a.jpg) The web interface also tells me that a SnykYaml 2.0 version is available to solve the problem. The only issue is that Spring Boot 3 still ships the 1.x version, so I have to replace the version manually in my Maven or Gradle manifest file. -![blog-snakeyaml-snyk-vuln-437](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1687371213%2Fblog-snakeyaml-snyk-vuln-437.jpg&w=2560&q=75) +![blog-snakeyaml-snyk-vuln-437](snyk-io-8aaa65bc.jpg) Be aware that manually changing the library to a new major version might break things. Don't blindly make these changes, and be aware of the potential impact this has on the inner workings of your application. @@ -177,7 +177,7 @@ The yaml file will not start with `!!mypackage.Person` (or similar) anymore. If Staying up to date with all the versions of your library is critical to open source security. Using the SnakeYaml 1.x version can lead to unnecessary security issues if you directly or indirectly accept yaml files from outside sources. [++Snyk Open Source++](https://snyk.io/product/open-source-security-management/) can help you find and fix these issues or point you to an alternative version if necessary — like the following example, where we show that updating to at least version 2.0 of SnakeYaml will remove the Arbitrary Code Execution vulnerability. -![blog-snakeyaml-snyk-vuln-651](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1687371213%2Fblog-snakeyaml-snyk-vuln-651.jpg&w=2560&q=75) +![blog-snakeyaml-snyk-vuln-651](snyk-io-4ce643e5.jpg) Also, if you connect your git repository to Snyk, we can provide pull requests to keep your dependencies up to date, even if there's no critical security issue. An ounce of prevention is best, and staying up to date on your libraries helps you minimize the risk of vulnerabilities and reduce the extra work that comes with updating because of a security issue. -![blog-snakeyaml-pr-upgrade](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1687371213%2Fblog-snakeyaml-pr-upgrade.jpg&w=2560&q=75) +![blog-snakeyaml-pr-upgrade](snyk-io-0759c48c.jpg) diff --git a/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/snyk-io-0759c48c.jpg b/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/snyk-io-0759c48c.jpg new file mode 100644 index 000000000..73be8785e Binary files /dev/null and b/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/snyk-io-0759c48c.jpg differ diff --git a/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/snyk-io-4ce643e5.jpg b/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/snyk-io-4ce643e5.jpg new file mode 100644 index 000000000..a3309c460 Binary files /dev/null and b/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/snyk-io-4ce643e5.jpg differ diff --git a/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/snyk-io-850e962a.jpg b/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/snyk-io-850e962a.jpg new file mode 100644 index 000000000..f8fcd1d54 Binary files /dev/null and b/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/snyk-io-850e962a.jpg differ diff --git a/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/snyk-io-8aaa65bc.jpg b/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/snyk-io-8aaa65bc.jpg new file mode 100644 index 000000000..e1c579099 Binary files /dev/null and b/content/posts/2023/07/20/snakeyaml-2-0-solving-the-unsafe-deserialization-vulnerability/snyk-io-8aaa65bc.jpg differ diff --git a/content/posts/2023/07/24/getting-started-with-apache-camel-on-jakarta-ee-10/camelcase.jpg b/content/posts/2023/07/24/getting-started-with-apache-camel-on-jakarta-ee-10/camelcase.jpg new file mode 100644 index 000000000..3d81ee66b Binary files /dev/null and b/content/posts/2023/07/24/getting-started-with-apache-camel-on-jakarta-ee-10/camelcase.jpg differ diff --git a/content/posts/2023/07/24/getting-started-with-apache-camel-on-jakarta-ee-10/camelcase.png b/content/posts/2023/07/24/getting-started-with-apache-camel-on-jakarta-ee-10/camelcase.png deleted file mode 100644 index 62e62f770..000000000 Binary files a/content/posts/2023/07/24/getting-started-with-apache-camel-on-jakarta-ee-10/camelcase.png and /dev/null differ diff --git a/content/posts/2023/07/24/getting-started-with-apache-camel-on-jakarta-ee-10/index.md b/content/posts/2023/07/24/getting-started-with-apache-camel-on-jakarta-ee-10/index.md index d0df29f45..6399a9f77 100644 --- a/content/posts/2023/07/24/getting-started-with-apache-camel-on-jakarta-ee-10/index.md +++ b/content/posts/2023/07/24/getting-started-with-apache-camel-on-jakarta-ee-10/index.md @@ -7,7 +7,7 @@ canonical: "https://blog.payara.fish/getting-started-with-apache-camel-on-jakart authors: - "jadon-ortlepp" - "luqman-saeed" -image: "camelcase.png" +image: "camelcase.jpg" categories: - "Developer Tools" - "Jakarta EE" diff --git a/content/posts/2023/07/25/when-speed-matters-real-time-stream-processing-with-hazelcast-and-redpanda/17079264-hazelcast-redpanda-bff5c138.jpg b/content/posts/2023/07/25/when-speed-matters-real-time-stream-processing-with-hazelcast-and-redpanda/17079264-hazelcast-redpanda-bff5c138.jpg new file mode 100644 index 000000000..68f20ae4b Binary files /dev/null and b/content/posts/2023/07/25/when-speed-matters-real-time-stream-processing-with-hazelcast-and-redpanda/17079264-hazelcast-redpanda-bff5c138.jpg differ diff --git a/content/posts/2023/07/25/when-speed-matters-real-time-stream-processing-with-hazelcast-and-redpanda/hazelcast-redpanda.jpg b/content/posts/2023/07/25/when-speed-matters-real-time-stream-processing-with-hazelcast-and-redpanda/hazelcast-redpanda.jpg new file mode 100644 index 000000000..68f20ae4b Binary files /dev/null and b/content/posts/2023/07/25/when-speed-matters-real-time-stream-processing-with-hazelcast-and-redpanda/hazelcast-redpanda.jpg differ diff --git a/content/posts/2023/07/25/when-speed-matters-real-time-stream-processing-with-hazelcast-and-redpanda/hazelcast-redpanda.png b/content/posts/2023/07/25/when-speed-matters-real-time-stream-processing-with-hazelcast-and-redpanda/hazelcast-redpanda.png deleted file mode 100644 index c6afafad3..000000000 Binary files a/content/posts/2023/07/25/when-speed-matters-real-time-stream-processing-with-hazelcast-and-redpanda/hazelcast-redpanda.png and /dev/null differ diff --git a/content/posts/2023/07/25/when-speed-matters-real-time-stream-processing-with-hazelcast-and-redpanda/index.md b/content/posts/2023/07/25/when-speed-matters-real-time-stream-processing-with-hazelcast-and-redpanda/index.md index 4c973e4c7..a67fcd94b 100644 --- a/content/posts/2023/07/25/when-speed-matters-real-time-stream-processing-with-hazelcast-and-redpanda/index.md +++ b/content/posts/2023/07/25/when-speed-matters-real-time-stream-processing-with-hazelcast-and-redpanda/index.md @@ -6,7 +6,7 @@ description: "Explore the combination of Hazelcast and Redpanda for high-perform authors: - "dunith-danushka" - "fawaz-ghali" -image: "hazelcast-redpanda.png" +image: "hazelcast-redpanda.jpg" categories: - "Hazelcast" - "Performance" @@ -39,7 +39,7 @@ There are actually multiple options, but for this blog post, we'll show you how Here's a quick diagram of what this solution looks like. -![](https://dz2cdn1.dzone.com/storage/temp/17079264-hazelcast-redpanda.png) +![](17079264-hazelcast-redpanda-bff5c138.jpg) ### Tutorial: real-time stream processing with Redpanda and Hazelcast diff --git a/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEgKCyhyDTcZdiQZzlKthGwXauQFBgndg3OB-92df97e8.png b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEgKCyhyDTcZdiQZzlKthGwXauQFBgndg3OB-92df97e8.png new file mode 100644 index 000000000..dbd8c1a9f Binary files /dev/null and b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEgKCyhyDTcZdiQZzlKthGwXauQFBgndg3OB-92df97e8.png differ diff --git a/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEgN6T9mXaYRzYuRSC76JIVveE6aF3qO49HQ-fdb08c5f.jpg b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEgN6T9mXaYRzYuRSC76JIVveE6aF3qO49HQ-fdb08c5f.jpg new file mode 100644 index 000000000..e62fd6037 Binary files /dev/null and b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEgN6T9mXaYRzYuRSC76JIVveE6aF3qO49HQ-fdb08c5f.jpg differ diff --git a/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEgtQI7iKLLbbqtLjhsxDjKVhT-C9wYjkVIy-eaa364f3.jpg b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEgtQI7iKLLbbqtLjhsxDjKVhT-C9wYjkVIy-eaa364f3.jpg new file mode 100644 index 000000000..308c444d0 Binary files /dev/null and b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEgtQI7iKLLbbqtLjhsxDjKVhT-C9wYjkVIy-eaa364f3.jpg differ diff --git a/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEgzsc5xL2Lk86WYnajF_5MxDpZhWzg3g4fg-b9d7201e.jpg b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEgzsc5xL2Lk86WYnajF_5MxDpZhWzg3g4fg-b9d7201e.jpg new file mode 100644 index 000000000..d39aa7a92 Binary files /dev/null and b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEgzsc5xL2Lk86WYnajF_5MxDpZhWzg3g4fg-b9d7201e.jpg differ diff --git a/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEhDK7xTGu-H4ZyFHWetkwEfKxIEjdMZuqYw-d703d080.png b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEhDK7xTGu-H4ZyFHWetkwEfKxIEjdMZuqYw-d703d080.png new file mode 100644 index 000000000..d17e94092 Binary files /dev/null and b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEhDK7xTGu-H4ZyFHWetkwEfKxIEjdMZuqYw-d703d080.png differ diff --git a/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEixfqIFVylNlbpptv-p8Y-ksVmCnHmxsPzc-6c7bc0ef.png b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEixfqIFVylNlbpptv-p8Y-ksVmCnHmxsPzc-6c7bc0ef.png new file mode 100644 index 000000000..6a16fb62c Binary files /dev/null and b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEixfqIFVylNlbpptv-p8Y-ksVmCnHmxsPzc-6c7bc0ef.png differ diff --git a/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEj9NXAyXlj-enEDvFT75mgGDcZaEmGb5hwB-1af520ce.jpg b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEj9NXAyXlj-enEDvFT75mgGDcZaEmGb5hwB-1af520ce.jpg new file mode 100644 index 000000000..cc018b341 Binary files /dev/null and b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEj9NXAyXlj-enEDvFT75mgGDcZaEmGb5hwB-1af520ce.jpg differ diff --git a/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEjjiMOt1XyY3YkmDdyfZsg5_7CcUCp7-6jH-55df2f1e.png b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEjjiMOt1XyY3YkmDdyfZsg5_7CcUCp7-6jH-55df2f1e.png new file mode 100644 index 000000000..9efb716a2 Binary files /dev/null and b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/AVvXsEjjiMOt1XyY3YkmDdyfZsg5_7CcUCp7-6jH-55df2f1e.png differ diff --git a/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/index.md b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/index.md index 73a62d107..726f0a97c 100644 --- a/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/index.md +++ b/content/posts/2023/07/29/starting-apache-kafka-on-windows-10-kafka-v3-4/index.md @@ -33,7 +33,7 @@ All of this is for Apache Kafka v3.4 on Windows 10. 4. UnZIP/UnTAR Apache Kafka Downloaded in (2) 5. Use a Text Editor like \[ Notepad++ \] for Editing -![](https://blogger.googleusercontent.com/img/a/AVvXsEhDK7xTGu-H4ZyFHWetkwEfKxIEjdMZuqYwimNrD-hIblKuBYqaW1Fttr8V_f19Q73z0MS09mNQYEhjuX8noY92cQ0dy4koVTnEmGSV76byHwHgM2uJ9ePcLSQYwFlcqBiWRI4QgXHE1nZYNsFPV3v0Nf2ozGkGc91DE3aKxOrDZV2IsPGlzFEKpNB8txrF) +![](AVvXsEhDK7xTGu-H4ZyFHWetkwEfKxIEjdMZuqYw-d703d080.png) ### Version 3.4.0 @@ -45,13 +45,13 @@ Apache Kafka Version 3.4.0 was Released on Feb 7, 2023, This article specificall Create a folder to hold Zookeeper Data by modifying the file zookeper.properties (File is Located under {KAFKA_HOME}/config/). Create a Folder named zk-data (or as per your wish). In my case, I created this under {KAFKA_HOME}. You may then modify your properties file as show in the image below. Modify your dataDir to point to the newly created folder. -![](https://blogger.googleusercontent.com/img/a/AVvXsEgzsc5xL2Lk86WYnajF_5MxDpZhWzg3g4fg3j2gyFH8m8zXruQu3V9Kd-t-6zwzpMePLZo1dE6Z5uflQUEKkL47o-h4xrmLBuEJQ1iQn6CNq9iJUjqCIDziwilh9WJ1-CpYO4YqH0nz7kFOHW-SIj2NJ2iYrSwn1kxWP1JaeGgdtwGW4iUuj6tmv-lhDulD=w640-h333) +![](AVvXsEgzsc5xL2Lk86WYnajF_5MxDpZhWzg3g4fg-b9d7201e.jpg) #### 0. Configure Kafka (Kafka Logs) For the purpose of kafka logs, you can create a folder with the name kafka-logs. In my case, I created this under {KAFKA_HOME}. You may then modify your properties file as show in the image below. The property to be modified is log.dirs in server.properties that should now point to the newly created folder. -![](https://blogger.googleusercontent.com/img/a/AVvXsEj9NXAyXlj-enEDvFT75mgGDcZaEmGb5hwB5AoznlWpfEzW1zKJOZIBLv2MiAgo3XrGrEsRHq0dyIuun8T4jdSvNNDAGPnThretMD2knm3nkrMVVhcPqTT3kvPvHh0nIRGIISJPzgW5ONh60QWJw3FaeHnMNAYu5xI4k8plohQJAX-yT-rqX2MlCv6lXaeD=w640-h557) +![](AVvXsEj9NXAyXlj-enEDvFT75mgGDcZaEmGb5hwB-1af520ce.jpg) #### 1. Starting Zookeeper @@ -61,7 +61,7 @@ First, Zookeeper has to be started using the following command. zookeeper-server-start.bat ..\..\config\zookeeper.properties ``` -![](https://blogger.googleusercontent.com/img/a/AVvXsEgN6T9mXaYRzYuRSC76JIVveE6aF3qO49HQfzcQXavStVBRHWXZaats4_UHK4LZDAMUHPnoszFFCE0b-6B99YMiwjyuVNmdlI9nJs3ech6Na8If09XG3tzJJr8mGUogZWjrv1_0iF5gcCBe77-yQ5vrQZ0bLkClq72mSIZ0pLR4TvmPUX8_OrcVQRttNh6h=w640-h340) +![](AVvXsEgN6T9mXaYRzYuRSC76JIVveE6aF3qO49HQ-fdb08c5f.jpg) #### 2. Starting Kafka Server @@ -71,7 +71,7 @@ Next, we will start the Kafka Server using the following command. kafka-server-start.bat ..\..\config\server.properties ``` -![](https://blogger.googleusercontent.com/img/a/AVvXsEgtQI7iKLLbbqtLjhsxDjKVhT-C9wYjkVIy9tyEUNKrDQof6D4vxk4sRRBnGXnW-e08VWmq-r381h41Tku99M7ffPlCkFJerLIwGGyrxEgkOat5GIcJJtjgODdwHYgIMBxT041Rt60NFypFRL9VzU1AnZdY840AI1gD4gWI0-VdwydZQPFLB-UHAK82s-bS=w640-h338) +![](AVvXsEgtQI7iKLLbbqtLjhsxDjKVhT-C9wYjkVIy-eaa364f3.jpg) #### 3. Creating a Test Topic @@ -81,7 +81,7 @@ Create a Kafka Topic to test out the Kafka Installation using the following comm kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test ``` -![](https://blogger.googleusercontent.com/img/a/AVvXsEjjiMOt1XyY3YkmDdyfZsg5_7CcUCp7-6jHcaayMx54busg9nf_d1fe7jypHXifPX5vYmTOwb4cy0Ei5ad1kVwlwQ1TeInPct2NUzGsx-lig7rF09dropGBcYv3r2Q7JzciqlAitenBAsxJ24tb6dCqi9OVrGO_rMc2h32zmVj0-tinLeuhm8ZDM6z6Nq_1=w640-h44) +![](AVvXsEjjiMOt1XyY3YkmDdyfZsg5_7CcUCp7-6jH-55df2f1e.png) The above is an updated way to create topics in Kafka. In earlier versions of Kafka (Kafka v2), the suggested way to create topics was directly via Zookeeper. From v3, It has changed to create topics via Brokers. @@ -99,7 +99,7 @@ For the version 3.\* the zookeeper is not any more a parameter, you should use - kafka-console-producer.bat --broker-list localhost:9092 --topic test ``` -![](https://blogger.googleusercontent.com/img/a/AVvXsEixfqIFVylNlbpptv-p8Y-ksVmCnHmxsPzcV0n__BPATcuflsftgEf4ZNR-pu7_pEVTKzkiJWIPKxp8fIDnQLba1fU7GYpNd3IhqyY24tQrdxBD6wu6n8GfkisiQ7wXASQPusWJQ8PVC-YD2_bB44ORR5AFXBrzsc7scwxN2rRQs7uf0uuYsNgmqbZTaGYv=w640-h106) +![](AVvXsEixfqIFVylNlbpptv-p8Y-ksVmCnHmxsPzc-6c7bc0ef.png) #### 5. Create Kafka Consumer @@ -107,6 +107,6 @@ kafka-console-producer.bat --broker-list localhost:9092 --topic test kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning ``` -![](https://blogger.googleusercontent.com/img/a/AVvXsEgKCyhyDTcZdiQZzlKthGwXauQFBgndg3OB87_SEES3C2GVDUsidUKYwszYuOYNZOnC6pylFG6j733LFASd4jjjMkNXDI35Y6dg_u9KF6c8P2S77l5hkldYvVc-63-3n7Rh-trUIo-4zEx7VkfQNqIw2-92H29JEZ0eenHzgraRCwPa2toQdzvRxOJ9ZfRN=w640-h104) +![](AVvXsEgKCyhyDTcZdiQZzlKthGwXauQFBgndg3OB-92df97e8.png) Next in this series of articles will be the demonstration of a Core Java Kafka Producer and Consumer followed by an article on Spring Boot based Kafka Integration. diff --git a/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/index.md b/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/index.md index 0eb9b7981..971c2585a 100644 --- a/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/index.md +++ b/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/index.md @@ -32,7 +32,7 @@ Previously, users have reported that our extensions did not have good support of With this decompiler, our extension allows you to directly click into libraries and it will automatically decompile the bytecode into readable source code. Inside the decompiled code, you can debug like what you do normally. We hope this feature will greatly boost your productivity during development. Here's a simple demo. -![Decompiler experience upgrade](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/07/decompile_debugging.gif) +![Decompiler experience upgrade](decompile_debugging.webp) Decompiler experience upgrade, image @@ -46,13 +46,13 @@ However, we have heard from Java developers that sometimes these inline markers Actually, Visual Studio Code has a setting that allows you to toggle inlay hints on the fly so you can turn it on/off as you are typing the code, easily tuning your experience. The setting can be found by searching for "inlay hints" and selecting the options from the image below. -[![Toggling Inlay Hints on the fly](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/07/inlayhints.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/07/inlayhints.png) +[![Toggling Inlay Hints on the fly](inlayhints-3e319c50.jpg)](inlayhints-3e319c50.jpg) Toggling Inlay Hints on the fly Here's a simple demo. -![Toggle inlay hints on the fly demo](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/07/inlayhints.gif) +![Toggle inlay hints on the fly demo](inlayhints-d95bd848.gif) Toggle inlay hints on the fly demo, image @@ -106,11 +106,11 @@ In addition to code completion, we will continue to refine and optimize the reli To use all features mentioned above, please download and install [Extension Pack for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) on Visual Studio Code. -[![Extension pack for Java](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png) +[![Extension pack for Java](javapack-892c0338.png)](javapack-892c0338.png) If you are a Spring developer working on a Spring Boot application, you can also download the [Spring Boot Extension Pack](https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-boot-dev-pack) for specialized Spring experience. -[![Spring boot extension pack](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png) +[![Spring boot extension pack](spring-ac42cb4c.png)](spring-ac42cb4c.png) ## Feedback and suggestions diff --git a/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/inlayhints-3e319c50.jpg b/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/inlayhints-3e319c50.jpg new file mode 100644 index 000000000..eb4aac385 Binary files /dev/null and b/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/inlayhints-3e319c50.jpg differ diff --git a/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/inlayhints-d95bd848.gif b/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/inlayhints-d95bd848.gif new file mode 100644 index 000000000..53d32059e Binary files /dev/null and b/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/inlayhints-d95bd848.gif differ diff --git a/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/javapack-892c0338.png b/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/javapack-892c0338.png new file mode 100644 index 000000000..c05f90e30 Binary files /dev/null and b/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/javapack-892c0338.png differ diff --git a/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/spring-ac42cb4c.png b/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/spring-ac42cb4c.png new file mode 100644 index 000000000..c3d38f0a6 Binary files /dev/null and b/content/posts/2023/07/31/java-on-visual-studio-code-july-2023/spring-ac42cb4c.png differ diff --git a/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/dummies.jpg b/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/dummies.jpg new file mode 100644 index 000000000..e52a83911 Binary files /dev/null and b/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/dummies.jpg differ diff --git a/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/dummies.png b/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/dummies.png deleted file mode 100644 index 1b52f7a41..000000000 Binary files a/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/dummies.png and /dev/null differ diff --git a/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/image-764x1024.jpg b/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/image-764x1024.jpg new file mode 100644 index 000000000..fbeb6b230 Binary files /dev/null and b/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/image-764x1024.jpg differ diff --git a/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/image-764x1024.png b/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/image-764x1024.png deleted file mode 100644 index cb2a33f4b..000000000 Binary files a/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/image-764x1024.png and /dev/null differ diff --git a/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/index.md b/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/index.md index 79c456864..0cf278991 100644 --- a/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/index.md +++ b/content/posts/2023/08/01/book-announcement-openjdk-migration-guide-for-dummies/index.md @@ -5,7 +5,7 @@ lastmod: "2024-06-30T11:17:04+00:00" description: "Learn how to migrate to OpenJDK and get tips on how to select the right Java partner to assist with your migration and provide suppoer." authors: - "geertjan-wielenga" -image: "dummies.png" +image: "dummies.jpg" categories: - "Book Announcement" - "Books" @@ -25,7 +25,7 @@ But if you have a variety of specialized Java applications, created at different But, worry no more, Java Champion Simon Ritter has you covered in a new (free) book. -{{< img src="image-764x1024.png" class="size-large is-resized" width="372" height="499" >}} +{{< img src="image-764x1024.jpg" class="size-large is-resized" width="372" height="499" >}} This handy book offers a concise, fun-to-read overview of OpenJDK migration: diff --git a/content/posts/2023/08/02/the-inner-workings-of-safepoints/index.md b/content/posts/2023/08/02/the-inner-workings-of-safepoints/index.md index b37252007..e704da10b 100644 --- a/content/posts/2023/08/02/the-inner-workings-of-safepoints/index.md +++ b/content/posts/2023/08/02/the-inner-workings-of-safepoints/index.md @@ -5,7 +5,7 @@ lastmod: "2023-08-02T10:27:28+00:00" description: "Have you ever wondered how safepoints are implemented in the OpenJDK? Follow me down the rabbit hole into the inner workings of the JVM." authors: - "johannes-bechberger" -image: "safepoint-2000x726-1.png" +image: "safepoint-2000x726-1.jpg" categories: - "Java Core" related_posts: @@ -40,7 +40,7 @@ if (thread->at_safepoint()) { ``` to every location where a safepoint check should occur. The main problem is its performance. We either add lots of code or wrap it in a function and have a function call for every check. We can do better by exploiting the fact that the check often fails, so we can optimize for the fast path of "thread not at safepoint". The OpenJDK does this by exploiting the page protection mechanisms of modern CPUs ([source](https://github.com/openjdk/jdk/blob/020552355574ab428019e663c762a3496c4613c7/src/hotspot/share/runtime/safepointMechanism.cpp#L45)) in JIT compiled code: -![](https://mostlynerdless.de/wp-content/uploads/2023/07/safepoint-2000x726.png) +![](safepoint-2000x726-e022f9ab.jpg) The JVM creates a *good* and a *bad* page/memory area for every thread before a thread executes any Java code ([source](https://github.com/openjdk/jdk/blob/020552355574ab428019e663c762a3496c4613c7/src/hotspot/share/runtime/safepointMechanism.cpp#L67)): diff --git a/content/posts/2023/08/02/the-inner-workings-of-safepoints/safepoint-2000x726-1.jpg b/content/posts/2023/08/02/the-inner-workings-of-safepoints/safepoint-2000x726-1.jpg new file mode 100644 index 000000000..a52d5f1ba Binary files /dev/null and b/content/posts/2023/08/02/the-inner-workings-of-safepoints/safepoint-2000x726-1.jpg differ diff --git a/content/posts/2023/08/02/the-inner-workings-of-safepoints/safepoint-2000x726-1.png b/content/posts/2023/08/02/the-inner-workings-of-safepoints/safepoint-2000x726-1.png deleted file mode 100644 index e28bb3da6..000000000 Binary files a/content/posts/2023/08/02/the-inner-workings-of-safepoints/safepoint-2000x726-1.png and /dev/null differ diff --git a/content/posts/2023/08/02/the-inner-workings-of-safepoints/safepoint-2000x726-e022f9ab.jpg b/content/posts/2023/08/02/the-inner-workings-of-safepoints/safepoint-2000x726-e022f9ab.jpg new file mode 100644 index 000000000..a52d5f1ba Binary files /dev/null and b/content/posts/2023/08/02/the-inner-workings-of-safepoints/safepoint-2000x726-e022f9ab.jpg differ diff --git a/content/posts/2023/08/04/book-review-openjdk-migration-for-dummies/dummies.jpg b/content/posts/2023/08/04/book-review-openjdk-migration-for-dummies/dummies.jpg new file mode 100644 index 000000000..e52a83911 Binary files /dev/null and b/content/posts/2023/08/04/book-review-openjdk-migration-for-dummies/dummies.jpg differ diff --git a/content/posts/2023/08/04/book-review-openjdk-migration-for-dummies/dummies.png b/content/posts/2023/08/04/book-review-openjdk-migration-for-dummies/dummies.png deleted file mode 100644 index 1b52f7a41..000000000 Binary files a/content/posts/2023/08/04/book-review-openjdk-migration-for-dummies/dummies.png and /dev/null differ diff --git a/content/posts/2023/08/04/book-review-openjdk-migration-for-dummies/index.md b/content/posts/2023/08/04/book-review-openjdk-migration-for-dummies/index.md index 7a4504823..d18bbdb08 100644 --- a/content/posts/2023/08/04/book-review-openjdk-migration-for-dummies/index.md +++ b/content/posts/2023/08/04/book-review-openjdk-migration-for-dummies/index.md @@ -5,7 +5,7 @@ lastmod: "2024-06-30T11:16:33+00:00" description: "Not just a technical manual, Simon Ritter's new book is a companion on a journey through the complexities of OpenJDK migration." authors: - "bazlur-rahman" -image: "dummies.png" +image: "dummies.jpg" categories: - "Book Review" - "Books" diff --git a/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/AVvXsEglbg9GBBUrvZY1epMjYK2RUmaw-bhLSgjQ-d63c8d09.png b/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/AVvXsEglbg9GBBUrvZY1epMjYK2RUmaw-bhLSgjQ-d63c8d09.png new file mode 100644 index 000000000..ff4870123 Binary files /dev/null and b/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/AVvXsEglbg9GBBUrvZY1epMjYK2RUmaw-bhLSgjQ-d63c8d09.png differ diff --git a/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/index.md b/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/index.md index e937d922a..c412e96de 100644 --- a/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/index.md +++ b/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/index.md @@ -5,7 +5,7 @@ lastmod: "2023-08-07T09:40:48+00:00" description: "Learn how to configure Kafka topics and create a Java-based Kafka Consumer and Producer, withApache Kafka v3.4 on Windows 10." authors: - "sumith-puri" -image: "techila_shots_kafka_java_001.png" +image: "techila_shots_kafka_java_001.jpg" categories: - "Kafka" - "Tutorials" @@ -39,7 +39,7 @@ This article also provides the Maven Dependencies required to create, build and Before you begin, [read the first article in this series](https://foojay.io/today/starting-apache-kafka-on-windows-10-kafka-v3-4/). -![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2nkv25xSy_NUgdrbgmJi7wrcI1qvNHmd4nRDvGoMId_oMFjarwE89SV6KTDeaQ8lbjH5UPb40HGWwN2Cy8I5Cgv7PpI5bRhQDXrivE1tLbHpsiBrEmdfufTABWrRCdmQUMzHM5PITnglwHwrEmu7qLNFbjE9e6SPoxAFVYYvBKr1n2wMF0Oe7zUKbJoDi/w640-h360/techila_shots_kafka_java_001.png) +![](techila_shots_kafka_java_001-396cc739.png) #### Maven Project (Eclipse) and Dependencies @@ -249,7 +249,7 @@ Run the Above Application in your IDE or Command-Line. #### Typical Output from Running the Kafka Producer Consumer PoC -![](https://blogger.googleusercontent.com/img/a/AVvXsEglbg9GBBUrvZY1epMjYK2RUmaw-bhLSgjQ4aRyZ25CnVPULdIu0OfxFSg9xqgKoy2SMEQHzGrTpLzNn3xSrjNSDDRwGOgxJKL6qlj9yeoYG07r2gp58e8P5si6-BrB0KA2l7j0kaTDfQiOcu4qBakQe7UScmejLrF5DXwtnS_1hqmq_JE8xpcIZ-CZR7rh=s16000) +![](AVvXsEglbg9GBBUrvZY1epMjYK2RUmaw-bhLSgjQ-d63c8d09.png) The next article in this series will be the Spring Boot Kafka Consumer Producer Integration that is planned to be used in a real world Product. diff --git a/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/techila_shots_kafka_java_001-396cc739.png b/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/techila_shots_kafka_java_001-396cc739.png new file mode 100644 index 000000000..77c438b3a Binary files /dev/null and b/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/techila_shots_kafka_java_001-396cc739.png differ diff --git a/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/techila_shots_kafka_java_001.jpg b/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/techila_shots_kafka_java_001.jpg new file mode 100644 index 000000000..82c09222e Binary files /dev/null and b/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/techila_shots_kafka_java_001.jpg differ diff --git a/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/techila_shots_kafka_java_001.png b/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/techila_shots_kafka_java_001.png deleted file mode 100644 index f820ca553..000000000 Binary files a/content/posts/2023/08/07/starting-apache-kafka-java-producer-consumer-windows-10/techila_shots_kafka_java_001.png and /dev/null differ diff --git a/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/0_2fYOaC2TR6hdT6cd.jpg b/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/0_2fYOaC2TR6hdT6cd.jpg new file mode 100644 index 000000000..9f594894d Binary files /dev/null and b/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/0_2fYOaC2TR6hdT6cd.jpg differ diff --git a/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/0_2fYOaC2TR6hdT6cd.png b/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/0_2fYOaC2TR6hdT6cd.png deleted file mode 100644 index 93f86cb5e..000000000 Binary files a/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/0_2fYOaC2TR6hdT6cd.png and /dev/null differ diff --git a/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/0_RpOJWYz_jV1P4y0V-1024x677.jpg b/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/0_RpOJWYz_jV1P4y0V-1024x677.jpg new file mode 100644 index 000000000..36100077c Binary files /dev/null and b/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/0_RpOJWYz_jV1P4y0V-1024x677.jpg differ diff --git a/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/0_RpOJWYz_jV1P4y0V-1024x677.png b/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/0_RpOJWYz_jV1P4y0V-1024x677.png deleted file mode 100644 index 1f21c44f1..000000000 Binary files a/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/0_RpOJWYz_jV1P4y0V-1024x677.png and /dev/null differ diff --git a/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/1_cIrJepyqUHnnTxbhc5TFfw-1024x558.jpg b/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/1_cIrJepyqUHnnTxbhc5TFfw-1024x558.jpg new file mode 100644 index 000000000..32594878b Binary files /dev/null and b/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/1_cIrJepyqUHnnTxbhc5TFfw-1024x558.jpg differ diff --git a/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/1_cIrJepyqUHnnTxbhc5TFfw-1024x558.png b/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/1_cIrJepyqUHnnTxbhc5TFfw-1024x558.png deleted file mode 100644 index f4c7b8250..000000000 Binary files a/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/1_cIrJepyqUHnnTxbhc5TFfw-1024x558.png and /dev/null differ diff --git a/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/index.md b/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/index.md index c7cc8e35f..06d81af1e 100644 --- a/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/index.md +++ b/content/posts/2023/08/09/observing-java-applications-running-via-docker-compose-using-opentelemetry/index.md @@ -73,7 +73,7 @@ Start your application with the `docker-composer.override.otel.yml` file. After running a few actions on your application, open the Jaeger interface to see the traces at [http://localhost:166868](http://localhost:16686/) -![](1_cIrJepyqUHnnTxbhc5TFfw-1024x558.png) +![](1_cIrJepyqUHnnTxbhc5TFfw-1024x558.jpg) Traces provide a good means to see into the working of your app and services and understand exactly what the code is doing, without having to actively debug it. @@ -120,9 +120,9 @@ After running our application and triggering some actions, we'll be able to see The idea of Digma is to get [Continuous Feedback](https://digma.ai/blog/ci-cd-cf-the-devops-toolchains-missing-link-continuous-feedback/)between code and observability so that you're always aware of how your changes affect the application. -![](0_RpOJWYz_jV1P4y0V-1024x677.png) +![](0_RpOJWYz_jV1P4y0V-1024x677.jpg) -![](0_2fYOaC2TR6hdT6cd.png) +![](0_2fYOaC2TR6hdT6cd.jpg) ### Now what? diff --git a/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/asgct_asgst-2000x1125-1.jpg b/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/asgct_asgst-2000x1125-1.jpg new file mode 100644 index 000000000..cabfc413f Binary files /dev/null and b/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/asgct_asgst-2000x1125-1.jpg differ diff --git a/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/asgct_asgst-2000x1125-1.png b/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/asgct_asgst-2000x1125-1.png deleted file mode 100644 index 323c67f37..000000000 Binary files a/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/asgct_asgst-2000x1125-1.png and /dev/null differ diff --git a/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/asgct_asgst-2000x1125-6c596253.jpg b/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/asgct_asgst-2000x1125-6c596253.jpg new file mode 100644 index 000000000..cabfc413f Binary files /dev/null and b/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/asgct_asgst-2000x1125-6c596253.jpg differ diff --git a/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/image-2000x953-1903166a.jpg b/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/image-2000x953-1903166a.jpg new file mode 100644 index 000000000..980971920 Binary files /dev/null and b/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/image-2000x953-1903166a.jpg differ diff --git a/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/index.md b/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/index.md index 71c1f6de0..74f19b40b 100644 --- a/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/index.md +++ b/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/index.md @@ -5,7 +5,7 @@ lastmod: "2023-08-10T09:44:03+00:00" description: "This article is the first of two articles covering the draft of a new iterator-based stack walking API, which builds the base for the follow-up article on safepoint-based profiling." authors: - "johannes-bechberger" -image: "asgct_asgst-2000x1125-1.png" +image: "asgct_asgst-2000x1125-1.jpg" categories: - "Java" - "Java Core" @@ -24,7 +24,7 @@ frozen: false This API is widely used but has its problems, see JEP 435 [and my various articles on Foojay.io](https://foojay.io/today/author/johannes-bechberger/). My original approach with my JEP proposal was to build a replacement of the API, which could be used as a drop-in for AsyncGetCallTrace. Still a single method that populates a preallocated frame list: -![](https://mostlynerdless.de/wp-content/uploads/2023/08/asgct_asgst-2000x1125.png) +![](asgct_asgst-2000x1125-6c596253.jpg) No doubt this solves a few of the problems, the new API would be officially supported, return more information, and could return the program counter for C/C++ frames. But it eventually felt more like a band-aid, hindered by trying to mimic AsyncGetCallTrace. In recent months, I had a few discussions with Erik Österlund and Jaroslav Bachorik in which we concluded that what we really need is a completely redesigned profiling API that isn't just an AsyncGetCallTrace v2. @@ -39,7 +39,7 @@ AsyncGetCallTrace fills a preallocated list of frames, which has the most profou This limits the amount the data we can give for each frame. We don't have this problem with an iterator-based API, where we first create an iterator for the current stack and then walk from frame to frame: -![](https://mostlynerdless.de/wp-content/uploads/2023/08/iterators-2000x1127.png) +![](iterators-2000x1127-fedb1a1c.jpg) The API can offer all the valuable information the JVM has, and the profiler developer can pick the relevant information. This API is, therefore, much more flexible; it allows the profiler writer to ... @@ -334,7 +334,7 @@ java -agentpath:libSmallProfiler.so=output=flames.html \ ``` This assumes that you use the modified OpenJDK. MathParser is a demo program that generates and evaluates simple mathematical expressions. I wrote this for a compiler lab while I was still a student. The resulting flame graph should look something like this: -![](https://mostlynerdless.de/wp-content/uploads/2023/08/image-2000x953.png) +![](image-2000x953-1903166a.jpg) ## Conclusion diff --git a/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/iterators-2000x1127-fedb1a1c.jpg b/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/iterators-2000x1127-fedb1a1c.jpg new file mode 100644 index 000000000..43de40f5d Binary files /dev/null and b/content/posts/2023/08/10/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/iterators-2000x1127-fedb1a1c.jpg differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/conflicts.jpg b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/conflicts.jpg new file mode 100644 index 000000000..c476376f7 Binary files /dev/null and b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/conflicts.jpg differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/conflicts.png b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/conflicts.png deleted file mode 100644 index 0c2a80363..000000000 Binary files a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/conflicts.png and /dev/null differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/filter.jpg b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/filter.jpg new file mode 100644 index 000000000..3fa0b2afc Binary files /dev/null and b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/filter.jpg differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/filter.png b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/filter.png deleted file mode 100644 index a5a2d3379..000000000 Binary files a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/filter.png and /dev/null differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/generate.jpg b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/generate.jpg new file mode 100644 index 000000000..d58b41e25 Binary files /dev/null and b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/generate.jpg differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/generate.png b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/generate.png deleted file mode 100644 index 125f6c91c..000000000 Binary files a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/generate.png and /dev/null differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/index.md b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/index.md index 1ccdbb6c8..06bcc0856 100644 --- a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/index.md +++ b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/index.md @@ -6,7 +6,7 @@ description: "IntelliJ IDEA supports working with GitLab Merge Requests. See Mer canonical: "https://maritvandijk.com/gitlab-merge-requests/" authors: - "marit-van-dijk" -image: "logo-1.png" +image: "logo-1.jpg" categories: - "GitLab" - "IntelliJ IDEA" @@ -24,21 +24,21 @@ When reviewing Merge Requests in a web interface, we don't have the same support IntelliJ IDEA has support for reviewing and merging GitLab Merge Requests. These features are available if the IntelliJ IDEA project has a remote that points to GitLab. -![Remote](remote.png) +![Remote](remote.jpg) We can open the GitLab Merge Requests using the **GitLab** logo on the left, or from the menu by going to **Git \> Gitlab \> Show Gitlab Merge Request**. -![Open Merge Requests from logo](logo.png) +![Open Merge Requests from logo](logo.jpg) ![Open Show GitLab Merge Requests from menu](menu.jpg) If we aren't already logged in to GitLab via IntelliJ IDEA, the GitLab Merge Requests tool window will prompt us to **Log In**. -![Log In](login.png) +![Log In](login.jpg) We can log into GitLab with a token. When we click **Generate** , this will take us to the GitLab page where a token with the right scopes can be generated for us. Click the button **Create personal access token** to create the token. When the token is generated, click the button to copy the token. -![Generate a token](generate.png) +![Generate a token](generate.jpg) ![Create Personal Access Token](personal-access-token.jpg) @@ -46,7 +46,7 @@ We can log into GitLab with a token. When we click **Generate** , this will take We can copy the token into the **Token** field in the popup and click **Log In**. -![Paste the token into the Token field](token.png) +![Paste the token into the Token field](token.jpg) Alternatively, we can use an existing token, as long as it has the required scopes. @@ -66,9 +66,9 @@ Once we're logged in, the GitLab Merge Requests tool window will show all open M We can change the search criteria to look for specific Merge Requests. We can use predefined filters, or search for something more specific. -![Filter](filter.png) +![Filter](filter.jpg) -![Search](search.png) +![Search](search.jpg) If the Merge Request has assignees and/or reviewers assigned, we can see them here. @@ -78,7 +78,7 @@ If the Merge Request has assignees and/or reviewers assigned, we can see them he We can see the details of a specific Merge Request by double-clicking on it. -![Merge Request details](mr-details.png) +![Merge Request details](mr-details.jpg) We can go back to the list of search results by clicking the project name in the top left of the Merge Requests tool window. We can see that the Merge Request we just looked at still has a tab open here, in case we want to go back. @@ -118,7 +118,7 @@ Alternatively, we can open the Merge Request in our browser by right-clicking it IntelliJ IDEA also shows if there are any conflicts, so we know if this request is safe to merge or not. -![Conflicts](conflicts.png) +![Conflicts](conflicts.jpg) We can open any of the files that make up the Merge Request, and IntelliJ IDEA will show them in the diff viewer, so we can have a closer look at the changes that make up the Merge Request. Inline comments will be displayed in the diff view too. diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/login.jpg b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/login.jpg new file mode 100644 index 000000000..462a19482 Binary files /dev/null and b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/login.jpg differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/login.png b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/login.png deleted file mode 100644 index 746c3e111..000000000 Binary files a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/login.png and /dev/null differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/logo-1.jpg b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/logo-1.jpg new file mode 100644 index 000000000..e91bcf2f9 Binary files /dev/null and b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/logo-1.jpg differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/logo-1.png b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/logo-1.png deleted file mode 100644 index 93013976c..000000000 Binary files a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/logo-1.png and /dev/null differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/logo.jpg b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/logo.jpg new file mode 100644 index 000000000..e91bcf2f9 Binary files /dev/null and b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/logo.jpg differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/logo.png b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/logo.png deleted file mode 100644 index 93013976c..000000000 Binary files a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/logo.png and /dev/null differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/mr-details.jpg b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/mr-details.jpg new file mode 100644 index 000000000..77f9a1abc Binary files /dev/null and b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/mr-details.jpg differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/mr-details.png b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/mr-details.png deleted file mode 100644 index b10a86f6c..000000000 Binary files a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/mr-details.png and /dev/null differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/remote.jpg b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/remote.jpg new file mode 100644 index 000000000..af23ab4ee Binary files /dev/null and b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/remote.jpg differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/remote.png b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/remote.png deleted file mode 100644 index 8f8d54d35..000000000 Binary files a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/remote.png and /dev/null differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/search.jpg b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/search.jpg new file mode 100644 index 000000000..2da24cc44 Binary files /dev/null and b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/search.jpg differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/search.png b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/search.png deleted file mode 100644 index 5fd7e1874..000000000 Binary files a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/search.png and /dev/null differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/token.jpg b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/token.jpg new file mode 100644 index 000000000..9c9b31452 Binary files /dev/null and b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/token.jpg differ diff --git a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/token.png b/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/token.png deleted file mode 100644 index c6271c4f5..000000000 Binary files a/content/posts/2023/08/10/working-with-gitlab-merge-requests-in-intellij-idea/token.png and /dev/null differ diff --git a/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/desktop-with-ip-info-1024x577-1.jpg b/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/desktop-with-ip-info-1024x577-1.jpg new file mode 100644 index 000000000..8b106e304 Binary files /dev/null and b/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/desktop-with-ip-info-1024x577-1.jpg differ diff --git a/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/desktop-with-ip-info-1024x577-1.png b/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/desktop-with-ip-info-1024x577-1.png deleted file mode 100644 index 2b6338d0d..000000000 Binary files a/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/desktop-with-ip-info-1024x577-1.png and /dev/null differ diff --git a/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/desktop-with-ip-info-1024x577.jpg b/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/desktop-with-ip-info-1024x577.jpg new file mode 100644 index 000000000..8b106e304 Binary files /dev/null and b/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/desktop-with-ip-info-1024x577.jpg differ diff --git a/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/desktop-with-ip-info-1024x577.png b/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/desktop-with-ip-info-1024x577.png deleted file mode 100644 index 2b6338d0d..000000000 Binary files a/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/desktop-with-ip-info-1024x577.png and /dev/null differ diff --git a/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/index.md b/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/index.md index edb49bec9..25d904720 100644 --- a/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/index.md +++ b/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/index.md @@ -6,7 +6,7 @@ description: "Pi4J is an ideal way to introduce the Java language into experimen canonical: "https://pi4j.com/blog/2023/20230731_pi4j_os/" authors: - "frankdelporte" -image: "desktop-with-ip-info-1024x577-1.png" +image: "desktop-with-ip-info-1024x577-1.jpg" categories: - "Embedded" - "Java" @@ -38,8 +38,8 @@ As the FHNW University uses this OS in different courses, and the Pi4J project p For all the info about what's included in each version, check the overview on [pi4j.com/pi4j-os](https://pi4j.com/pi4j-os/). {{< gallery >}} -desktop-with-ip-info-1024x577.png -pure-javafx-example-1024x396.png +desktop-with-ip-info-1024x577.jpg +pure-javafx-example-1024x396.jpg pure-javafx-kiosk-1024x768.jpg {{< /gallery >}} diff --git a/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/pure-javafx-example-1024x396.jpg b/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/pure-javafx-example-1024x396.jpg new file mode 100644 index 000000000..32d604a2e Binary files /dev/null and b/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/pure-javafx-example-1024x396.jpg differ diff --git a/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/pure-javafx-example-1024x396.png b/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/pure-javafx-example-1024x396.png deleted file mode 100644 index b62f5c4c4..000000000 Binary files a/content/posts/2023/08/11/pi4j-operating-system-for-java-development-on-raspberry-pi/pure-javafx-example-1024x396.png and /dev/null differ diff --git a/content/posts/2023/08/15/my-final-take-on-gradle-vs-maven/Screenshot-2023-08-05-at-10.03.59-754x1024.jpg b/content/posts/2023/08/15/my-final-take-on-gradle-vs-maven/Screenshot-2023-08-05-at-10.03.59-754x1024.jpg new file mode 100644 index 000000000..238af27e4 Binary files /dev/null and b/content/posts/2023/08/15/my-final-take-on-gradle-vs-maven/Screenshot-2023-08-05-at-10.03.59-754x1024.jpg differ diff --git a/content/posts/2023/08/15/my-final-take-on-gradle-vs-maven/Screenshot-2023-08-05-at-10.03.59-754x1024.png b/content/posts/2023/08/15/my-final-take-on-gradle-vs-maven/Screenshot-2023-08-05-at-10.03.59-754x1024.png deleted file mode 100644 index 360fc5cfb..000000000 Binary files a/content/posts/2023/08/15/my-final-take-on-gradle-vs-maven/Screenshot-2023-08-05-at-10.03.59-754x1024.png and /dev/null differ diff --git a/content/posts/2023/08/15/my-final-take-on-gradle-vs-maven/index.md b/content/posts/2023/08/15/my-final-take-on-gradle-vs-maven/index.md index 1f3e1b82f..d5ecfed2c 100644 --- a/content/posts/2023/08/15/my-final-take-on-gradle-vs-maven/index.md +++ b/content/posts/2023/08/15/my-final-take-on-gradle-vs-maven/index.md @@ -22,7 +22,7 @@ frozen: false I attended the JavaLand conference in March, stumbled upon the Gradle booth, and found this gem: -[![](Screenshot-2023-08-05-at-10.03.59-754x1024.png)](https://twitter.com/nicolas_frankel/status/1638549568957861889) +[![](Screenshot-2023-08-05-at-10.03.59-754x1024.jpg)](https://twitter.com/nicolas_frankel/status/1638549568957861889) Of course, at some point, a fanboy hijacked the thread and claimed the so-called superiority of Gradle. In this post, I'd like to shed some light on my stance, so I can direct people to it instead of debunking the same "reasoning" repeatedly. diff --git a/content/posts/2023/08/15/pitest-do-you-test-your-tests/index.md b/content/posts/2023/08/15/pitest-do-you-test-your-tests/index.md index d35cac76a..5adde1c8b 100644 --- a/content/posts/2023/08/15/pitest-do-you-test-your-tests/index.md +++ b/content/posts/2023/08/15/pitest-do-you-test-your-tests/index.md @@ -5,7 +5,7 @@ lastmod: "2023-08-15T14:53:37+00:00" description: "A brief introduction with code to mutation testing using Pitest. Now you too can get started testing your tests!" authors: - "simon-verhoeven" -image: "report5-1024x601-1.png" +image: "report5-1024x601-1.jpg" categories: - "Testing" - "Tutorials" @@ -93,7 +93,7 @@ A mutation can have the following states: \* Run error (akin to non-viable, some of these can lead to a run error) -![A mutation coverage report](report2-1024x878.png) +![A mutation coverage report](report2-1024x878.jpg) Now we know which holes in our testing remain, we can work towards fixing these and after these steps, we can rerun the Pitests to verify how many mutations remain alive. @@ -136,7 +136,7 @@ void decays() { And rerun our tests we'll see that 2 more mutations have joined the choir invisible: -![A mutation coverage report with even more killed mutations](report4-1024x607.png) +![A mutation coverage report with even more killed mutations](report4-1024x607.jpg) **Note**: hovering over a covered mutation will show you which testcase(s) have killed it: @@ -168,7 +168,7 @@ void aliveWithNiceWeatherAndNormalGrowth() { And as we can see after our run: -![A mutation coverage report with even more killed mutations](report5-1024x601.png) +![A mutation coverage report with even more killed mutations](report5-1024x601.jpg) In this manner, we can keep eliminating the gaps in our test coverage. diff --git a/content/posts/2023/08/15/pitest-do-you-test-your-tests/report2-1024x878.jpg b/content/posts/2023/08/15/pitest-do-you-test-your-tests/report2-1024x878.jpg new file mode 100644 index 000000000..4f0136f97 Binary files /dev/null and b/content/posts/2023/08/15/pitest-do-you-test-your-tests/report2-1024x878.jpg differ diff --git a/content/posts/2023/08/15/pitest-do-you-test-your-tests/report2-1024x878.png b/content/posts/2023/08/15/pitest-do-you-test-your-tests/report2-1024x878.png deleted file mode 100644 index fe18b88ab..000000000 Binary files a/content/posts/2023/08/15/pitest-do-you-test-your-tests/report2-1024x878.png and /dev/null differ diff --git a/content/posts/2023/08/15/pitest-do-you-test-your-tests/report4-1024x607.jpg b/content/posts/2023/08/15/pitest-do-you-test-your-tests/report4-1024x607.jpg new file mode 100644 index 000000000..bf7cf9d21 Binary files /dev/null and b/content/posts/2023/08/15/pitest-do-you-test-your-tests/report4-1024x607.jpg differ diff --git a/content/posts/2023/08/15/pitest-do-you-test-your-tests/report4-1024x607.png b/content/posts/2023/08/15/pitest-do-you-test-your-tests/report4-1024x607.png deleted file mode 100644 index de024e7a7..000000000 Binary files a/content/posts/2023/08/15/pitest-do-you-test-your-tests/report4-1024x607.png and /dev/null differ diff --git a/content/posts/2023/08/15/pitest-do-you-test-your-tests/report5-1024x601-1.jpg b/content/posts/2023/08/15/pitest-do-you-test-your-tests/report5-1024x601-1.jpg new file mode 100644 index 000000000..0bd0aca74 Binary files /dev/null and b/content/posts/2023/08/15/pitest-do-you-test-your-tests/report5-1024x601-1.jpg differ diff --git a/content/posts/2023/08/15/pitest-do-you-test-your-tests/report5-1024x601-1.png b/content/posts/2023/08/15/pitest-do-you-test-your-tests/report5-1024x601-1.png deleted file mode 100644 index 83fe38342..000000000 Binary files a/content/posts/2023/08/15/pitest-do-you-test-your-tests/report5-1024x601-1.png and /dev/null differ diff --git a/content/posts/2023/08/15/pitest-do-you-test-your-tests/report5-1024x601.jpg b/content/posts/2023/08/15/pitest-do-you-test-your-tests/report5-1024x601.jpg new file mode 100644 index 000000000..0bd0aca74 Binary files /dev/null and b/content/posts/2023/08/15/pitest-do-you-test-your-tests/report5-1024x601.jpg differ diff --git a/content/posts/2023/08/15/pitest-do-you-test-your-tests/report5-1024x601.png b/content/posts/2023/08/15/pitest-do-you-test-your-tests/report5-1024x601.png deleted file mode 100644 index 83fe38342..000000000 Binary files a/content/posts/2023/08/15/pitest-do-you-test-your-tests/report5-1024x601.png and /dev/null differ diff --git a/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/Screenshot-2023-08-10-at-5.13.36-PM-1024x607-1.jpg b/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/Screenshot-2023-08-10-at-5.13.36-PM-1024x607-1.jpg new file mode 100644 index 000000000..26bd52bb7 Binary files /dev/null and b/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/Screenshot-2023-08-10-at-5.13.36-PM-1024x607-1.jpg differ diff --git a/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/Screenshot-2023-08-10-at-5.13.36-PM-1024x607-1.png b/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/Screenshot-2023-08-10-at-5.13.36-PM-1024x607-1.png deleted file mode 100644 index f40caa760..000000000 Binary files a/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/Screenshot-2023-08-10-at-5.13.36-PM-1024x607-1.png and /dev/null differ diff --git a/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/Screenshot-2023-08-10-at-5.13.36-PM-1024x607.jpg b/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/Screenshot-2023-08-10-at-5.13.36-PM-1024x607.jpg new file mode 100644 index 000000000..26bd52bb7 Binary files /dev/null and b/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/Screenshot-2023-08-10-at-5.13.36-PM-1024x607.jpg differ diff --git a/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/Screenshot-2023-08-10-at-5.13.36-PM-1024x607.png b/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/Screenshot-2023-08-10-at-5.13.36-PM-1024x607.png deleted file mode 100644 index f40caa760..000000000 Binary files a/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/Screenshot-2023-08-10-at-5.13.36-PM-1024x607.png and /dev/null differ diff --git a/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/index.md b/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/index.md index 7fd6eb4a9..7a45ed84a 100644 --- a/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/index.md +++ b/content/posts/2023/08/16/6-considerations-when-building-high-performance-java-microservices-with-eda/index.md @@ -5,7 +5,7 @@ lastmod: "2023-08-17T10:01:03+00:00" description: "Renowned for its resilience and low latency, EDA is a reliable choice for developing robust, high-performing microservices." authors: - "rob-austin" -image: "Screenshot-2023-08-10-at-5.13.36-PM-1024x607-1.png" +image: "Screenshot-2023-08-10-at-5.13.36-PM-1024x607-1.jpg" categories: - "Chronicle Software" - "Developer Tools" @@ -26,7 +26,7 @@ Renowned for its resilience and low latency, EDA is a reliable choice for develo Moreover, this method can be helpful in improving productivity and making the process of cloud migration smoother. -![](Screenshot-2023-08-10-at-5.13.36-PM-1024x607.png) +![](Screenshot-2023-08-10-at-5.13.36-PM-1024x607.jpg) In this article we will outline 6 key considerations and tactics for developing such services. diff --git a/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/Screenshot-2023-08-10-at-02.54.56-2000x9-6129bbc3.jpg b/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/Screenshot-2023-08-10-at-02.54.56-2000x9-6129bbc3.jpg new file mode 100644 index 000000000..d2c3ac11b Binary files /dev/null and b/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/Screenshot-2023-08-10-at-02.54.56-2000x9-6129bbc3.jpg differ diff --git a/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/index.md b/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/index.md index 06d09d474..56dea64a2 100644 --- a/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/index.md +++ b/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/index.md @@ -37,17 +37,17 @@ He proposed that walking Java threads only at safepoints while obtaining some in ## Idea The current interaction between a sampler of the profiler and the Java Threads looks like the following: -![](https://mostlynerdless.de/wp-content/uploads/2023/04/wall-clock-sampling-sequence.drawio.svg) +![](wall-clock-sampling-sequence.drawio-6a31e77e.svg) The sampler thread signals every Java thread using POSIX signals and then obtains the full trace directly in the signal handler while the thread is paused at an arbitrary location. I explored variations of this approach in my post [Couldn't we just Use AsyncGetCallTrace in a Separate Thread?](https://mostlynerdless.de/blog/2023/04/21/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/) My new approach, on the contrary, walks the Java thread in a signal handler till we find the first bytecode-backed Java frame, stores this in the thread-local queue, triggers a safepoint, and then walks the full Java stack at these safepoints for all enqueued top-frames. We, therefore, have a two-step process: -![](https://mostlynerdless.de/wp-content/uploads/2023/08/sig_safe-2000x1176.png) +![](sig_safe-2000x1176-9fba9b01.jpg) Instead of just walking the stack in the signal handler: -![](https://mostlynerdless.de/wp-content/uploads/2023/08/iterators2-2000x1100.png) +![](iterators2-2000x1100-fbbdfe02.jpg) The new API exploits a few implementation details of the OpenJDK: @@ -297,7 +297,7 @@ java -agentpath:libSmallProfiler.so=output=flames.html \ ``` This assumes that you use the [modified OpenJDK](https://github.com/parttimenerd/jdk/tree/asgst_iterator). [MathParser](https://github.com/parttimenerd/writing-a-profiler/blob/iterative_safepoint_profiler/samples/math/MathParser.java) is a demo program that generates and evaluates simple mathematical expressions. The resulting flame graph should look something like this: -![](https://mostlynerdless.de/wp-content/uploads/2023/08/Screenshot-2023-08-10-at-02.54.56-2000x931.png) +![](Screenshot-2023-08-10-at-02.54.56-2000x9-6129bbc3.jpg) ## Conclusion @@ -325,6 +325,6 @@ I want to come back to the quote from Erik that I wrote in the beginning, answer Thank you for joining me on my API journey; I'm open to any suggestions; please reach me using the typical channels. Just keep in mind: -![](https://mostlynerdless.de/wp-content/uploads/2023/08/no2.png) +![](no2-f2143aa8.png) *This project is part of my work in the [SapMachine](https://sapmachine.io/) team at [SAP](https://sap.com), making profiling easier for everyone.* *This article first appeared on my personal blog [mostlynerdless.de](https://mostlynerdless.de).* *Thanks to Erik Österlund for the basic idea, and to Jaroslav Bachorik for all the feedback and help on the JEP.* diff --git a/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/iterators2-2000x1100-fbbdfe02.jpg b/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/iterators2-2000x1100-fbbdfe02.jpg new file mode 100644 index 000000000..618743955 Binary files /dev/null and b/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/iterators2-2000x1100-fbbdfe02.jpg differ diff --git a/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/no2-f2143aa8.png b/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/no2-f2143aa8.png new file mode 100644 index 000000000..18137da36 Binary files /dev/null and b/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/no2-f2143aa8.png differ diff --git a/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/sig_safe-2000x1176-9fba9b01.jpg b/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/sig_safe-2000x1176-9fba9b01.jpg new file mode 100644 index 000000000..291433e43 Binary files /dev/null and b/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/sig_safe-2000x1176-9fba9b01.jpg differ diff --git a/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/wall-clock-sampling-sequence.drawio-6a31e77e.svg b/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/wall-clock-sampling-sequence.drawio-6a31e77e.svg new file mode 100644 index 000000000..e165345b3 --- /dev/null +++ b/content/posts/2023/08/17/taming-the-bias-unbiased-safepoint-based-stack-walking/wall-clock-sampling-sequence.drawio-6a31e77e.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + Thread 1 + + + + + + + Walk Stack + + + + + + + + signal + + + + + + + Thread 2 + + + + + + + Walk Stack + + + + + + + Sampler + + + + + + + + sleep + + + + + + + signal + + + + + + signal + + + + + + ... + + + + + + + Text is not SVG - cannot display + + + diff --git a/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/index.md b/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/index.md index ed0481fce..e5f46ac4a 100644 --- a/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/index.md +++ b/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/index.md @@ -5,7 +5,7 @@ lastmod: "2023-08-21T07:53:10+00:00" description: "Learn how you can simplify your application testing and local development workflow using Testcontainers Desktop app." authors: - "siva-katamreddy" -image: "tcd-switch-runtimes-700x259-1.png" +image: "tcd-switch-runtimes-700x259-1.jpg" categories: - "Testcontainers" - "Testing" @@ -112,7 +112,7 @@ Let's explore various features of Testcontainers Desktop and how it helps while Testcontainers Desktop will automatically detect your locally installed Docker runtime(s) and is configured to use it. You can choose which Docker runtime to use by the Testcontainers libraries by selecting from the menu options as shown below: -![Testcontainers Desktop switch container runtime](tcd-switch-runtimes-700x259.png) +![Testcontainers Desktop switch container runtime](tcd-switch-runtimes-700x259.jpg) You can also create your free [Testcontainers Cloud](https://testcontainers.com/cloud/) account and choose to save local resources by running your containers in the cloud instead of running them on your computer. @@ -155,7 +155,7 @@ During the development, you would like to quickly change the code and verify the Since you are using the **Testcontainers Desktop** , the `testcontainers.reuse.enable` flag is set automatically for your dev environment. You can enable or disable it by clicking on **Enable reusable containers** option under **Preference**s. -![Testcontainers Desktop Enable Reuse](tcd-reuse.png) +![Testcontainers Desktop Enable Reuse](tcd-reuse.jpg) When the reuse feature is enabled, you only need to configure which containers should be reused using the Testcontainers API. While using **Testcontainers for Java** you can achieve this using `.withReuse(true)` as follows: diff --git a/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-reuse.jpg b/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-reuse.jpg new file mode 100644 index 000000000..339846f26 Binary files /dev/null and b/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-reuse.jpg differ diff --git a/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-reuse.png b/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-reuse.png deleted file mode 100644 index 1d356331a..000000000 Binary files a/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-reuse.png and /dev/null differ diff --git a/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-switch-runtimes-700x259-1.jpg b/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-switch-runtimes-700x259-1.jpg new file mode 100644 index 000000000..302d8a675 Binary files /dev/null and b/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-switch-runtimes-700x259-1.jpg differ diff --git a/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-switch-runtimes-700x259-1.png b/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-switch-runtimes-700x259-1.png deleted file mode 100644 index 27618d2e1..000000000 Binary files a/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-switch-runtimes-700x259-1.png and /dev/null differ diff --git a/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-switch-runtimes-700x259.jpg b/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-switch-runtimes-700x259.jpg new file mode 100644 index 000000000..302d8a675 Binary files /dev/null and b/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-switch-runtimes-700x259.jpg differ diff --git a/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-switch-runtimes-700x259.png b/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-switch-runtimes-700x259.png deleted file mode 100644 index 27618d2e1..000000000 Binary files a/content/posts/2023/08/21/testing-and-local-development-made-simpler-with-testcontainers-desktop-app/tcd-switch-runtimes-700x259.png and /dev/null differ diff --git a/content/posts/2023/08/22/introduction-tower/index.md b/content/posts/2023/08/22/introduction-tower/index.md index 019aee008..a78a96f99 100644 --- a/content/posts/2023/08/22/introduction-tower/index.md +++ b/content/posts/2023/08/22/introduction-tower/index.md @@ -42,7 +42,7 @@ The `Layer` trait allows composing `Service`s together. Here's a slightly more detailed diagram: -![](tower-api-diagram-1024x891.png) +![](tower-api-diagram-1024x891.jpg) A typical `Service` implementation will wrap an underlying component; the component may be a service itself. Hence, you can chain multiple features by composing various functions. diff --git a/content/posts/2023/08/22/introduction-tower/tower-api-diagram-1024x891.jpg b/content/posts/2023/08/22/introduction-tower/tower-api-diagram-1024x891.jpg new file mode 100644 index 000000000..5ef2ce677 Binary files /dev/null and b/content/posts/2023/08/22/introduction-tower/tower-api-diagram-1024x891.jpg differ diff --git a/content/posts/2023/08/22/introduction-tower/tower-api-diagram-1024x891.png b/content/posts/2023/08/22/introduction-tower/tower-api-diagram-1024x891.png deleted file mode 100644 index ba3100d8e..000000000 Binary files a/content/posts/2023/08/22/introduction-tower/tower-api-diagram-1024x891.png and /dev/null differ diff --git a/content/posts/2023/08/24/well-worth-my-time-openjdk-migration-for-dummies/image-1-1024x385.jpg b/content/posts/2023/08/24/well-worth-my-time-openjdk-migration-for-dummies/image-1-1024x385.jpg new file mode 100644 index 000000000..246fe55dc Binary files /dev/null and b/content/posts/2023/08/24/well-worth-my-time-openjdk-migration-for-dummies/image-1-1024x385.jpg differ diff --git a/content/posts/2023/08/24/well-worth-my-time-openjdk-migration-for-dummies/image-1-1024x385.png b/content/posts/2023/08/24/well-worth-my-time-openjdk-migration-for-dummies/image-1-1024x385.png deleted file mode 100644 index 0f16091a2..000000000 Binary files a/content/posts/2023/08/24/well-worth-my-time-openjdk-migration-for-dummies/image-1-1024x385.png and /dev/null differ diff --git a/content/posts/2023/08/24/well-worth-my-time-openjdk-migration-for-dummies/index.md b/content/posts/2023/08/24/well-worth-my-time-openjdk-migration-for-dummies/index.md index bf3f30d56..0ab3749b3 100644 --- a/content/posts/2023/08/24/well-worth-my-time-openjdk-migration-for-dummies/index.md +++ b/content/posts/2023/08/24/well-worth-my-time-openjdk-migration-for-dummies/index.md @@ -26,7 +26,7 @@ The book is obviously written by a vendor, but it's very honest about that. It d There were also quite a few things that might not have crossed my mind, such as support for NTLM authentication or the availability of the Lucida fonts. The only errors I spotted were for the URLs in the book. There were several places (mostly near the front) where the .com was omitted from [openjdk-migration.com](http://www.openjdk-migration.com/) and once where the .com was .con instead. -[![](image-1-1024x385.png)](https://www.azul.com/openjdk-migration/) +[![](image-1-1024x385.jpg)](https://www.azul.com/openjdk-migration/) Also, as someone who used Java on Linux in the late 1990s, I think the History section should have at least mentioned Blackdown Java (which is kind of the primordial OpenJDK IMHO), because some of us remember volunteers stepped up to deliver Java on Linux when Sun ignored that platform. diff --git a/content/posts/2023/08/28/how-to-create-a-spring-boot-application-to-retrieve-data-from-evernote/index.md b/content/posts/2023/08/28/how-to-create-a-spring-boot-application-to-retrieve-data-from-evernote/index.md index 70bfde088..578c69f85 100644 --- a/content/posts/2023/08/28/how-to-create-a-spring-boot-application-to-retrieve-data-from-evernote/index.md +++ b/content/posts/2023/08/28/how-to-create-a-spring-boot-application-to-retrieve-data-from-evernote/index.md @@ -37,7 +37,7 @@ First, I wanted to make use of the Maven dependency to access the functionality The starting place for all of my Spring Boot applications is the [Spring Initializr](https://start.spring.io/). I only changed a couple of description fields and didn't add any dependencies yet, as I'll only need one dependency added manually for now. -![Spring](spring-initializr.png) +![Spring](spring-initializr.jpg) After downloading the project, I opened it in my IDE and added the Evernote dependency to the `pom.xml` file. diff --git a/content/posts/2023/08/28/how-to-create-a-spring-boot-application-to-retrieve-data-from-evernote/spring-initializr.jpg b/content/posts/2023/08/28/how-to-create-a-spring-boot-application-to-retrieve-data-from-evernote/spring-initializr.jpg new file mode 100644 index 000000000..acb2c3e57 Binary files /dev/null and b/content/posts/2023/08/28/how-to-create-a-spring-boot-application-to-retrieve-data-from-evernote/spring-initializr.jpg differ diff --git a/content/posts/2023/08/28/how-to-create-a-spring-boot-application-to-retrieve-data-from-evernote/spring-initializr.png b/content/posts/2023/08/28/how-to-create-a-spring-boot-application-to-retrieve-data-from-evernote/spring-initializr.png deleted file mode 100644 index ee054de5f..000000000 Binary files a/content/posts/2023/08/28/how-to-create-a-spring-boot-application-to-retrieve-data-from-evernote/spring-initializr.png and /dev/null differ diff --git a/content/posts/2023/08/31/javafx-links-of-august-2023/homepage-1024x616.jpg b/content/posts/2023/08/31/javafx-links-of-august-2023/homepage-1024x616.jpg new file mode 100644 index 000000000..99e37f745 Binary files /dev/null and b/content/posts/2023/08/31/javafx-links-of-august-2023/homepage-1024x616.jpg differ diff --git a/content/posts/2023/08/31/javafx-links-of-august-2023/homepage-1024x616.png b/content/posts/2023/08/31/javafx-links-of-august-2023/homepage-1024x616.png deleted file mode 100644 index c7a5b62b1..000000000 Binary files a/content/posts/2023/08/31/javafx-links-of-august-2023/homepage-1024x616.png and /dev/null differ diff --git a/content/posts/2023/08/31/javafx-links-of-august-2023/index.md b/content/posts/2023/08/31/javafx-links-of-august-2023/index.md index d5e9fa6b2..8ef219b07 100644 --- a/content/posts/2023/08/31/javafx-links-of-august-2023/index.md +++ b/content/posts/2023/08/31/javafx-links-of-august-2023/index.md @@ -22,8 +22,8 @@ I've taken a holiday this month, so probably missed a lot of the amazing JavaFX But the most essential and thrilling news is the release of the new version of [jfx-central.com](https://www.jfx-central.com/)! A complete new home for "all things JavaFX" thanks to the amazing work of a whole [team of JavaFX enthousiast](https://www.jfx-central.com/team). Indeed, yes, it's a website but actually a JavaFX application, so you can also run it as a desktop app. And what's even more important... the [full sources are available on GitHub](https://github.com/dlemmermann/jfxcentral2). {{< gallery >}} -homepage-1024x616.png -libraries-1024x812.png +homepage-1024x616.jpg +libraries-1024x812.jpg showcases-1024x749.jpg {{< /gallery >}} diff --git a/content/posts/2023/08/31/javafx-links-of-august-2023/libraries-1024x812.jpg b/content/posts/2023/08/31/javafx-links-of-august-2023/libraries-1024x812.jpg new file mode 100644 index 000000000..0e6594a69 Binary files /dev/null and b/content/posts/2023/08/31/javafx-links-of-august-2023/libraries-1024x812.jpg differ diff --git a/content/posts/2023/08/31/javafx-links-of-august-2023/libraries-1024x812.png b/content/posts/2023/08/31/javafx-links-of-august-2023/libraries-1024x812.png deleted file mode 100644 index 644684e69..000000000 Binary files a/content/posts/2023/08/31/javafx-links-of-august-2023/libraries-1024x812.png and /dev/null differ diff --git a/content/posts/2023/08/31/javafx-links-of-august-2023/libraries.jpg b/content/posts/2023/08/31/javafx-links-of-august-2023/libraries.jpg new file mode 100644 index 000000000..298beedce Binary files /dev/null and b/content/posts/2023/08/31/javafx-links-of-august-2023/libraries.jpg differ diff --git a/content/posts/2023/08/31/javafx-links-of-august-2023/libraries.png b/content/posts/2023/08/31/javafx-links-of-august-2023/libraries.png deleted file mode 100644 index 6c0d6a91e..000000000 Binary files a/content/posts/2023/08/31/javafx-links-of-august-2023/libraries.png and /dev/null differ diff --git a/content/posts/2023/09/01/its-2am-do-you-know-what-your-code-is-doing/cduln90t5es22zhc33h7-ec6ad5b0.jpg b/content/posts/2023/09/01/its-2am-do-you-know-what-your-code-is-doing/cduln90t5es22zhc33h7-ec6ad5b0.jpg new file mode 100644 index 000000000..53245d13b Binary files /dev/null and b/content/posts/2023/09/01/its-2am-do-you-know-what-your-code-is-doing/cduln90t5es22zhc33h7-ec6ad5b0.jpg differ diff --git a/content/posts/2023/09/01/its-2am-do-you-know-what-your-code-is-doing/d5bu18yhph5ncppny5a5-4208e831.png b/content/posts/2023/09/01/its-2am-do-you-know-what-your-code-is-doing/d5bu18yhph5ncppny5a5-4208e831.png new file mode 100644 index 000000000..593802821 Binary files /dev/null and b/content/posts/2023/09/01/its-2am-do-you-know-what-your-code-is-doing/d5bu18yhph5ncppny5a5-4208e831.png differ diff --git a/content/posts/2023/09/01/its-2am-do-you-know-what-your-code-is-doing/index.md b/content/posts/2023/09/01/its-2am-do-you-know-what-your-code-is-doing/index.md index cbd00b499..129016f31 100644 --- a/content/posts/2023/09/01/its-2am-do-you-know-what-your-code-is-doing/index.md +++ b/content/posts/2023/09/01/its-2am-do-you-know-what-your-code-is-doing/index.md @@ -77,15 +77,15 @@ Digma has a simple and well-integrated setup wizard for IntelliJ/IDEA. You need Once it is installed, we can run our application, in my case I just ran the JPA unit test from my [latest book](https://www.amazon.com/Java-Basics-Practical-Introduction-Full-Stack-ebook/dp/B0CCPGZ8W1/) and it produced standard traces which are already pretty cool, we can see them listed below: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d5bu18yhph5ncppny5a5.png) +![Image description](d5bu18yhph5ncppny5a5-4208e831.png) When we click a trace for one of these, we get the standard trace view, this is nothing new, but it's really nice to see this information directly in the IDE and readily accessible. I can imagine the immense value this will have for figuring out CI execution issues: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xzfbdivmtnh28f2zft3e.png) +![Image description](xzfbdivmtnh28f2zft3e-c91e6d28.png) But the real value and where Digma becomes a "Developer Observability" tool instead of an Observability tool, is with the tool window here: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cduln90t5es22zhc33h7.png) +![Image description](cduln90t5es22zhc33h7-ec6ad5b0.jpg) There is a strong connection to the code directly from the observability data and deeper analysis which doesn't show in my particular overly simplistic hello world. This Toolwindow highlights problematic traces, errors and helps understand [real-world issues](https://digma.ai/blog/coding-with-java-observability/). diff --git a/content/posts/2023/09/01/its-2am-do-you-know-what-your-code-is-doing/xzfbdivmtnh28f2zft3e-c91e6d28.png b/content/posts/2023/09/01/its-2am-do-you-know-what-your-code-is-doing/xzfbdivmtnh28f2zft3e-c91e6d28.png new file mode 100644 index 000000000..f6fd269bb Binary files /dev/null and b/content/posts/2023/09/01/its-2am-do-you-know-what-your-code-is-doing/xzfbdivmtnh28f2zft3e-c91e6d28.png differ diff --git a/content/posts/2023/09/01/unlocking-java-wisdom-a-conversation-with-oracle-ace-simon-martinelli/image-2.jpg b/content/posts/2023/09/01/unlocking-java-wisdom-a-conversation-with-oracle-ace-simon-martinelli/image-2.jpg new file mode 100644 index 000000000..fff8fde14 Binary files /dev/null and b/content/posts/2023/09/01/unlocking-java-wisdom-a-conversation-with-oracle-ace-simon-martinelli/image-2.jpg differ diff --git a/content/posts/2023/09/01/unlocking-java-wisdom-a-conversation-with-oracle-ace-simon-martinelli/image-2.png b/content/posts/2023/09/01/unlocking-java-wisdom-a-conversation-with-oracle-ace-simon-martinelli/image-2.png deleted file mode 100644 index 84d8ab900..000000000 Binary files a/content/posts/2023/09/01/unlocking-java-wisdom-a-conversation-with-oracle-ace-simon-martinelli/image-2.png and /dev/null differ diff --git a/content/posts/2023/09/01/unlocking-java-wisdom-a-conversation-with-oracle-ace-simon-martinelli/index.md b/content/posts/2023/09/01/unlocking-java-wisdom-a-conversation-with-oracle-ace-simon-martinelli/index.md index d032aa1d3..7e2322677 100644 --- a/content/posts/2023/09/01/unlocking-java-wisdom-a-conversation-with-oracle-ace-simon-martinelli/index.md +++ b/content/posts/2023/09/01/unlocking-java-wisdom-a-conversation-with-oracle-ace-simon-martinelli/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -{{< img src="image-2.png" class="alignright size-full" width="460" height="460" >}} +{{< img src="image-2.jpg" class="alignright size-full" width="460" height="460" >}} In a recent insightful interview, Simon Martinelli, an Oracle ACE associate and veteran Java developer, shares his career experiences, software development philosophies, and views on mentoring. With over two decades in the industry, Martinelli offers a perspective that combines the wisdom of experience with a focus on simplicity and constant learning. diff --git a/content/posts/2023/09/06/load-testing-shoot-your-application-with-gatling/index.md b/content/posts/2023/09/06/load-testing-shoot-your-application-with-gatling/index.md index 78a1b2503..4adb983dc 100644 --- a/content/posts/2023/09/06/load-testing-shoot-your-application-with-gatling/index.md +++ b/content/posts/2023/09/06/load-testing-shoot-your-application-with-gatling/index.md @@ -107,7 +107,7 @@ For this example, we'll be making use of the [Gatling sample application](https: We start by configuring the recorder -[![recorder](https://github.com/SimonVerhoeven/gatling-demo/raw/main/raw/recorder.png)](https://github.com/SimonVerhoeven/gatling-demo/blob/main/raw/recorder.png) +[![recorder](recorder-158da42b.png)](https://github.com/SimonVerhoeven/gatling-demo/blob/main/raw/recorder.png) And we configure the following settings @@ -120,7 +120,7 @@ And we configure the following settings Then we need to configure our proxy so that we can record the scenario: -[![proxy](https://github.com/SimonVerhoeven/gatling-demo/raw/main/raw/proxy.png)](https://github.com/SimonVerhoeven/gatling-demo/blob/main/raw/proxy.png) +[![proxy](proxy-e9dc0b9d.png)](https://github.com/SimonVerhoeven/gatling-demo/blob/main/raw/proxy.png) After this, we can `start` our recording @@ -220,7 +220,7 @@ After the execution, we will find our report in `target` or `build` respectively And we might end up with a report like this: -[![result](https://github.com/SimonVerhoeven/gatling-demo/raw/main/raw/result.png)](https://github.com/SimonVerhoeven/gatling-demo/blob/main/raw/result.png) +[![result](result-9b514a87.jpg)](https://github.com/SimonVerhoeven/gatling-demo/blob/main/raw/result.png) This shows us: diff --git a/content/posts/2023/09/06/load-testing-shoot-your-application-with-gatling/proxy-e9dc0b9d.png b/content/posts/2023/09/06/load-testing-shoot-your-application-with-gatling/proxy-e9dc0b9d.png new file mode 100644 index 000000000..388502f80 Binary files /dev/null and b/content/posts/2023/09/06/load-testing-shoot-your-application-with-gatling/proxy-e9dc0b9d.png differ diff --git a/content/posts/2023/09/06/load-testing-shoot-your-application-with-gatling/recorder-158da42b.png b/content/posts/2023/09/06/load-testing-shoot-your-application-with-gatling/recorder-158da42b.png new file mode 100644 index 000000000..bb5cb39f1 Binary files /dev/null and b/content/posts/2023/09/06/load-testing-shoot-your-application-with-gatling/recorder-158da42b.png differ diff --git a/content/posts/2023/09/06/load-testing-shoot-your-application-with-gatling/result-9b514a87.jpg b/content/posts/2023/09/06/load-testing-shoot-your-application-with-gatling/result-9b514a87.jpg new file mode 100644 index 000000000..de9b92a0f Binary files /dev/null and b/content/posts/2023/09/06/load-testing-shoot-your-application-with-gatling/result-9b514a87.jpg differ diff --git a/content/posts/2023/09/11/embracing-modernity-a-comprehensive-look-at-sealed-classes-pattern-matching-and-functional-paradigms-in-java/index.md b/content/posts/2023/09/11/embracing-modernity-a-comprehensive-look-at-sealed-classes-pattern-matching-and-functional-paradigms-in-java/index.md index 36ad3951b..0b4599105 100644 --- a/content/posts/2023/09/11/embracing-modernity-a-comprehensive-look-at-sealed-classes-pattern-matching-and-functional-paradigms-in-java/index.md +++ b/content/posts/2023/09/11/embracing-modernity-a-comprehensive-look-at-sealed-classes-pattern-matching-and-functional-paradigms-in-java/index.md @@ -5,7 +5,7 @@ lastmod: "2023-09-11T08:42:46+00:00" description: "Let's examine the principles and practical applications of Sealed Classes and pattern matching in Java." authors: - "bazlur-rahman" -image: "sealed-classes-benefits.png" +image: "sealed-classes-benefits.jpg" categories: - "Java" - "Java Core" diff --git a/content/posts/2023/09/11/embracing-modernity-a-comprehensive-look-at-sealed-classes-pattern-matching-and-functional-paradigms-in-java/sealed-classes-benefits.jpg b/content/posts/2023/09/11/embracing-modernity-a-comprehensive-look-at-sealed-classes-pattern-matching-and-functional-paradigms-in-java/sealed-classes-benefits.jpg new file mode 100644 index 000000000..5b24c6d1e Binary files /dev/null and b/content/posts/2023/09/11/embracing-modernity-a-comprehensive-look-at-sealed-classes-pattern-matching-and-functional-paradigms-in-java/sealed-classes-benefits.jpg differ diff --git a/content/posts/2023/09/11/embracing-modernity-a-comprehensive-look-at-sealed-classes-pattern-matching-and-functional-paradigms-in-java/sealed-classes-benefits.png b/content/posts/2023/09/11/embracing-modernity-a-comprehensive-look-at-sealed-classes-pattern-matching-and-functional-paradigms-in-java/sealed-classes-benefits.png deleted file mode 100644 index 0a5cd4030..000000000 Binary files a/content/posts/2023/09/11/embracing-modernity-a-comprehensive-look-at-sealed-classes-pattern-matching-and-functional-paradigms-in-java/sealed-classes-benefits.png and /dev/null differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/index.md b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/index.md index 851c39cc4..3b760eeaa 100644 --- a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/index.md +++ b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/index.md @@ -52,9 +52,9 @@ The Disco API is a Java project (of course...) you can find on [GitHub](https:// These endpoints are fully documented in the [README of the GitHub project](https://github.com/foojayio/discoapi) and can be called directly from a [Swagger UI](https://api.foojay.io/swagger-ui). {{< gallery >}} -swagger-apis-802x1024.png | | Overview of all the APIs in Swagger +swagger-apis-802x1024.jpg | | Overview of all the APIs in Swagger swagger-major-versions-1024x678.png | | Swagger result with all major versions -swagger-packages-1024x623.png | | Swagger result of package search +swagger-packages-1024x623.jpg | | Swagger result of package search {{< /gallery >}} Let's look at a few examples. @@ -186,7 +186,7 @@ There are several plugins and extensions available that already make use of the JDKMon is another little tool written in JavaFX that tries to detect all JDKs installed on your machine and will inform you about new updates and vulnerabilities of each OpenJDK distribution it has found. In addition, JDKMon is also able to monitor JavaFX SDK versions that are installed on your machine. You can download the latest version from the [GitHub repository](https://github.com/HanSolo/JDKMon/releases). {{< gallery >}} -jdkmon-found.png | | JDKMon showing all the found OpenJDK distributions on the machine +jdkmon-found.jpg | | JDKMon showing all the found OpenJDK distributions on the machine jdkmon-vulnerabilities-300x260.png | | Alert showing the vulnerabilities in an OpenJDK package jdkmon-download.png | | Dark/Light view of the download screen {{< /gallery >}} @@ -211,9 +211,9 @@ To be able to use any OpenJDK distribution in a GitHub Action, you can't use the You can check all available combinations on the [Disco Testing Matrix](https://github.com/foojayio/discoTestingMatrix). It verifies JDK tests on various distros and versions using Github Actions. {{< gallery >}} -matrix-overview.png | | Part of the overview, the actual page is much longer... +matrix-overview.jpg | | Part of the overview, the actual page is much longer... matrix-workflows-1024x928.jpg | | A part of the GitHub Actions -matrix-action-1024x638.png | | One of the GitHub Actions +matrix-action-1024x638.jpg | | One of the GitHub Actions {{< /gallery >}} ## Conclusion diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/jdkmon-found.jpg b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/jdkmon-found.jpg new file mode 100644 index 000000000..17be0c6eb Binary files /dev/null and b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/jdkmon-found.jpg differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/jdkmon-found.png b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/jdkmon-found.png deleted file mode 100644 index c61a9f883..000000000 Binary files a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/jdkmon-found.png and /dev/null differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-action-1024x638.jpg b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-action-1024x638.jpg new file mode 100644 index 000000000..52188a4d0 Binary files /dev/null and b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-action-1024x638.jpg differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-action-1024x638.png b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-action-1024x638.png deleted file mode 100644 index 8690a0336..000000000 Binary files a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-action-1024x638.png and /dev/null differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-action.jpg b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-action.jpg new file mode 100644 index 000000000..b7923a7b3 Binary files /dev/null and b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-action.jpg differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-action.png b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-action.png deleted file mode 100644 index 8434e4a29..000000000 Binary files a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-action.png and /dev/null differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-overview.jpg b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-overview.jpg new file mode 100644 index 000000000..add5d0317 Binary files /dev/null and b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-overview.jpg differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-overview.png b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-overview.png deleted file mode 100644 index 7bd82af77..000000000 Binary files a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/matrix-overview.png and /dev/null differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-apis-802x1024.jpg b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-apis-802x1024.jpg new file mode 100644 index 000000000..0063305db Binary files /dev/null and b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-apis-802x1024.jpg differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-apis-802x1024.png b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-apis-802x1024.png deleted file mode 100644 index 1a5281088..000000000 Binary files a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-apis-802x1024.png and /dev/null differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-apis.jpg b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-apis.jpg new file mode 100644 index 000000000..26277b919 Binary files /dev/null and b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-apis.jpg differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-apis.png b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-apis.png deleted file mode 100644 index fcda40fb9..000000000 Binary files a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-apis.png and /dev/null differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-major-versions.jpg b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-major-versions.jpg new file mode 100644 index 000000000..9c714cce8 Binary files /dev/null and b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-major-versions.jpg differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-major-versions.png b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-major-versions.png deleted file mode 100644 index e854ac184..000000000 Binary files a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-major-versions.png and /dev/null differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-packages-1024x623.jpg b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-packages-1024x623.jpg new file mode 100644 index 000000000..863e87d1a Binary files /dev/null and b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-packages-1024x623.jpg differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-packages-1024x623.png b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-packages-1024x623.png deleted file mode 100644 index c5c5cadad..000000000 Binary files a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-packages-1024x623.png and /dev/null differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-packages.jpg b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-packages.jpg new file mode 100644 index 000000000..403c8b5f6 Binary files /dev/null and b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-packages.jpg differ diff --git a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-packages.png b/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-packages.png deleted file mode 100644 index bf5515db9..000000000 Binary files a/content/posts/2023/09/12/disco-api-helping-you-to-find-any-openjdk-distribution/swagger-packages.png and /dev/null differ diff --git a/content/posts/2023/09/12/the-evolution-of-bugs/index.md b/content/posts/2023/09/12/the-evolution-of-bugs/index.md index 83a797a7b..b950ddc79 100644 --- a/content/posts/2023/09/12/the-evolution-of-bugs/index.md +++ b/content/posts/2023/09/12/the-evolution-of-bugs/index.md @@ -123,7 +123,7 @@ Deadlocks, where two or more threads indefinitely wait for each other to release In contrast, livelocks present a more deceptive problem. Threads involved in a livelock are technically operational, but they're caught in a loop of actions that render them effectively unproductive. Debugging this requires meticulous observation, often stepping through each thread's operations to spot a potential loop or repeated resource contention without progress. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nfars6yfnwxn2v9gwpmj.png) +![Image description](nfars6yfnwxn2v9gwpmj-4fd6a931.jpg) ### Race Conditions: The Ever-Present Ghost diff --git a/content/posts/2023/09/12/the-evolution-of-bugs/nfars6yfnwxn2v9gwpmj-4fd6a931.jpg b/content/posts/2023/09/12/the-evolution-of-bugs/nfars6yfnwxn2v9gwpmj-4fd6a931.jpg new file mode 100644 index 000000000..7e50c8e04 Binary files /dev/null and b/content/posts/2023/09/12/the-evolution-of-bugs/nfars6yfnwxn2v9gwpmj-4fd6a931.jpg differ diff --git a/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/Screenshot-2023-09-08-at-3.15.36-PM.jpg b/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/Screenshot-2023-09-08-at-3.15.36-PM.jpg new file mode 100644 index 000000000..285cd0c0f Binary files /dev/null and b/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/Screenshot-2023-09-08-at-3.15.36-PM.jpg differ diff --git a/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/Screenshot-2023-09-08-at-3.15.36-PM.png b/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/Screenshot-2023-09-08-at-3.15.36-PM.png deleted file mode 100644 index dd7c8b5bf..000000000 Binary files a/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/Screenshot-2023-09-08-at-3.15.36-PM.png and /dev/null differ diff --git a/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/Screenshot-2023-09-25-at-9.37.26-AM-1024x256.jpg b/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/Screenshot-2023-09-25-at-9.37.26-AM-1024x256.jpg new file mode 100644 index 000000000..180d766db Binary files /dev/null and b/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/Screenshot-2023-09-25-at-9.37.26-AM-1024x256.jpg differ diff --git a/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/Screenshot-2023-09-25-at-9.37.26-AM-1024x256.png b/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/Screenshot-2023-09-25-at-9.37.26-AM-1024x256.png deleted file mode 100644 index c5a0005c4..000000000 Binary files a/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/Screenshot-2023-09-25-at-9.37.26-AM-1024x256.png and /dev/null differ diff --git a/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/index.md b/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/index.md index 665ec2d2e..353ad6b48 100644 --- a/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/index.md +++ b/content/posts/2023/09/13/chronicle-services-building-fast-microservices-with-java/index.md @@ -5,7 +5,7 @@ lastmod: "2023-09-25T08:39:43+00:00" description: "Chronicle Services presents an opinionated view of several of the specialised libraries we have developed to support low-latency applications." authors: - "george-ball" -image: "Screenshot-2023-09-08-at-3.15.36-PM.png" +image: "Screenshot-2023-09-08-at-3.15.36-PM.jpg" categories: - "Chronicle Software" - "Performance" @@ -120,7 +120,7 @@ Detailed functional testing is available through a powerful testing framework, w Each Service is defined in terms of its implementation class and the Chronicle Queues that are used for the transmission of Events. There is enough information here for the Chronicle Services runtime to create and start each service. Diagrammatically, the application described in the above file would appear like this: -![](Screenshot-2023-09-25-at-9.37.26-AM-1024x256.png) +![](Screenshot-2023-09-25-at-9.37.26-AM-1024x256.jpg) **Deploying a Service** diff --git a/content/posts/2023/09/15/building-real-time-applications-to-process-wikimedia-streams-using-kafka-and-hazelcast/1693934925104.jpg b/content/posts/2023/09/15/building-real-time-applications-to-process-wikimedia-streams-using-kafka-and-hazelcast/1693934925104.jpg new file mode 100644 index 000000000..bf93bdea8 Binary files /dev/null and b/content/posts/2023/09/15/building-real-time-applications-to-process-wikimedia-streams-using-kafka-and-hazelcast/1693934925104.jpg differ diff --git a/content/posts/2023/09/15/building-real-time-applications-to-process-wikimedia-streams-using-kafka-and-hazelcast/1693934925104.png b/content/posts/2023/09/15/building-real-time-applications-to-process-wikimedia-streams-using-kafka-and-hazelcast/1693934925104.png deleted file mode 100644 index f9846f5fc..000000000 Binary files a/content/posts/2023/09/15/building-real-time-applications-to-process-wikimedia-streams-using-kafka-and-hazelcast/1693934925104.png and /dev/null differ diff --git a/content/posts/2023/09/15/building-real-time-applications-to-process-wikimedia-streams-using-kafka-and-hazelcast/index.md b/content/posts/2023/09/15/building-real-time-applications-to-process-wikimedia-streams-using-kafka-and-hazelcast/index.md index 834eea48a..cbce6d59a 100644 --- a/content/posts/2023/09/15/building-real-time-applications-to-process-wikimedia-streams-using-kafka-and-hazelcast/index.md +++ b/content/posts/2023/09/15/building-real-time-applications-to-process-wikimedia-streams-using-kafka-and-hazelcast/index.md @@ -5,7 +5,7 @@ lastmod: "2023-09-15T14:54:42+00:00" description: "Learn how to build a real-time application to process Wikimedia streams using Kafka and Hazelcast." authors: - "fawaz-ghali" -image: "1693934925104.png" +image: "1693934925104.jpg" categories: - "Hazelcast" - "Java" diff --git a/content/posts/2023/09/15/system-architecture-move-authentication-to-the-api-gateway/index.md b/content/posts/2023/09/15/system-architecture-move-authentication-to-the-api-gateway/index.md index 3dce3b75b..6b23f8bcb 100644 --- a/content/posts/2023/09/15/system-architecture-move-authentication-to-the-api-gateway/index.md +++ b/content/posts/2023/09/15/system-architecture-move-authentication-to-the-api-gateway/index.md @@ -229,7 +229,7 @@ services: Let's try to access the application via Apache APISIX. When we browse to , Apache APISIX redirects us to the Keycloak login page: -![](keycloak-authentication-1024x804.png) +![](keycloak-authentication-1024x804.jpg) If we log in successfully, we are allowed to access the app. Notice that we display the username of the person who logged in: diff --git a/content/posts/2023/09/15/system-architecture-move-authentication-to-the-api-gateway/keycloak-authentication-1024x804.jpg b/content/posts/2023/09/15/system-architecture-move-authentication-to-the-api-gateway/keycloak-authentication-1024x804.jpg new file mode 100644 index 000000000..fe85c402a Binary files /dev/null and b/content/posts/2023/09/15/system-architecture-move-authentication-to-the-api-gateway/keycloak-authentication-1024x804.jpg differ diff --git a/content/posts/2023/09/15/system-architecture-move-authentication-to-the-api-gateway/keycloak-authentication-1024x804.png b/content/posts/2023/09/15/system-architecture-move-authentication-to-the-api-gateway/keycloak-authentication-1024x804.png deleted file mode 100644 index d288a594d..000000000 Binary files a/content/posts/2023/09/15/system-architecture-move-authentication-to-the-api-gateway/keycloak-authentication-1024x804.png and /dev/null differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/companies.jpg b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/companies.jpg new file mode 100644 index 000000000..961a62b7b Binary files /dev/null and b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/companies.jpg differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/companies.png b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/companies.png deleted file mode 100644 index e28e8a896..000000000 Binary files a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/companies.png and /dev/null differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/documentation-1024x623.jpg b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/documentation-1024x623.jpg new file mode 100644 index 000000000..26c5c85a2 Binary files /dev/null and b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/documentation-1024x623.jpg differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/documentation-1024x623.png b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/documentation-1024x623.png deleted file mode 100644 index 227a6fda7..000000000 Binary files a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/documentation-1024x623.png and /dev/null differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/download-gluostatusfx-info-1024x774.jpg b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/download-gluostatusfx-info-1024x774.jpg new file mode 100644 index 000000000..398197a92 Binary files /dev/null and b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/download-gluostatusfx-info-1024x774.jpg differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/download-gluostatusfx-info-1024x774.png b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/download-gluostatusfx-info-1024x774.png deleted file mode 100644 index f678a9525..000000000 Binary files a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/download-gluostatusfx-info-1024x774.png and /dev/null differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/homepage-lotw.jpg b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/homepage-lotw.jpg new file mode 100644 index 000000000..595db08e1 Binary files /dev/null and b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/homepage-lotw.jpg differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/homepage-lotw.png b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/homepage-lotw.png deleted file mode 100644 index 81b52da89..000000000 Binary files a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/homepage-lotw.png and /dev/null differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-devicons-1024x832.jpg b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-devicons-1024x832.jpg new file mode 100644 index 000000000..e7b552922 Binary files /dev/null and b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-devicons-1024x832.jpg differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-devicons-1024x832.png b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-devicons-1024x832.png deleted file mode 100644 index 6baec8e57..000000000 Binary files a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-devicons-1024x832.png and /dev/null differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-devicons.jpg b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-devicons.jpg new file mode 100644 index 000000000..a7b7de98f Binary files /dev/null and b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-devicons.jpg differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-devicons.png b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-devicons.png deleted file mode 100644 index efe23eedf..000000000 Binary files a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-devicons.png and /dev/null differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-overview-1024x780.jpg b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-overview-1024x780.jpg new file mode 100644 index 000000000..1e436ac2b Binary files /dev/null and b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-overview-1024x780.jpg differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-overview-1024x780.png b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-overview-1024x780.png deleted file mode 100644 index d4b473304..000000000 Binary files a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-overview-1024x780.png and /dev/null differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-overview.jpg b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-overview.jpg new file mode 100644 index 000000000..266c17584 Binary files /dev/null and b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-overview.jpg differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-overview.png b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-overview.png deleted file mode 100644 index 239e022bf..000000000 Binary files a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/icons-overview.png and /dev/null differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/index.md b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/index.md index 1fa0b3ed2..69afef133 100644 --- a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/index.md +++ b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/index.md @@ -33,7 +33,7 @@ The homepage provides links to the [GitHub projects of JFX Central](https://gith {{< gallery >}} homepage-intro-1024x769.jpg | | Homepage of JFX Central homepage-highlights.jpg | | Some of the highlights on the homepage -homepage-lotw.png | | The most recent Links Of The Week on the homepage +homepage-lotw.jpg | | The most recent Links Of The Week on the homepage {{< /gallery >}} ### Resources @@ -42,15 +42,15 @@ The Resources section of the JFX Central website contains an overview of librari {{< gallery >}} books-1024x890.jpg | | Books on JFX Central -tools-1024x912.png | | Tools on JFX Central +tools-1024x912.jpg | | Tools on JFX Central videos-1024x1003.jpg | | Videos on JFX Central {{< /gallery >}} The icons are a new part of version 2 of JFX Central, allowing you to search and explore many icon packs. {{< gallery >}} -icons-overview-1024x780.png | | Overview of the icons on JFX Central -icons-devicons-1024x832.png | | All the icons in the Devicons pack +icons-overview-1024x780.jpg | | Overview of the icons on JFX Central +icons-devicons-1024x832.jpg | | All the icons in the Devicons pack icons-details-1024x282.png | | Details of a selected icon {{< /gallery >}} @@ -77,7 +77,7 @@ showcase-nerstar-941x1024.jpg | | The NERstar showcase ### Documentation The Documentation section is also a new addition to version 2 of JFX Central. The goal is to provide links to various sources that explain how to start with JavaFX and related topics. -![Documentation on JFX Central](documentation-1024x623.png) +![Documentation on JFX Central](documentation-1024x623.jpg) ### Downloads @@ -87,14 +87,14 @@ This section shows the power (and a bit of its weakness) of JFX Central, as it i {{< gallery >}} downloads-956x1024.jpg | | Downloads on JFX Central -download-gluostatusfx-info-1024x774.png | | GlucoStatusFX download page +download-gluostatusfx-info-1024x774.jpg | | GlucoStatusFX download page download-gluostatusfx-links.png | | GlucoStatusFX links {{< /gallery >}} ### Search The search box helps you to jump to the correct section of the website for all the different parts of the content. -![Search box with an example search](search.png) +![Search box with an example search](search.jpg) ## **Conclusion** diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/search.jpg b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/search.jpg new file mode 100644 index 000000000..4886abef8 Binary files /dev/null and b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/search.jpg differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/search.png b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/search.png deleted file mode 100644 index 2880b9dbe..000000000 Binary files a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/search.png and /dev/null differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/tools-1024x912.jpg b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/tools-1024x912.jpg new file mode 100644 index 000000000..536a7e4c9 Binary files /dev/null and b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/tools-1024x912.jpg differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/tools-1024x912.png b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/tools-1024x912.png deleted file mode 100644 index b887e7165..000000000 Binary files a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/tools-1024x912.png and /dev/null differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/tools.jpg b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/tools.jpg new file mode 100644 index 000000000..d80ba3d45 Binary files /dev/null and b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/tools.jpg differ diff --git a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/tools.png b/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/tools.png deleted file mode 100644 index 15ffe2742..000000000 Binary files a/content/posts/2023/09/18/new-user-interface-for-jfx-central-the-home-for-all-javafx-information-part-1/tools.png and /dev/null differ diff --git a/content/posts/2023/09/19/exposing-your-data-using-spring-graphql/graphiql-00775084.jpg b/content/posts/2023/09/19/exposing-your-data-using-spring-graphql/graphiql-00775084.jpg new file mode 100644 index 000000000..eb04a08d1 Binary files /dev/null and b/content/posts/2023/09/19/exposing-your-data-using-spring-graphql/graphiql-00775084.jpg differ diff --git a/content/posts/2023/09/19/exposing-your-data-using-spring-graphql/index.md b/content/posts/2023/09/19/exposing-your-data-using-spring-graphql/index.md index f5731398a..1c15c347c 100644 --- a/content/posts/2023/09/19/exposing-your-data-using-spring-graphql/index.md +++ b/content/posts/2023/09/19/exposing-your-data-using-spring-graphql/index.md @@ -128,7 +128,7 @@ And since we want to use Subscriptions in GraphIQL we'll also add: spring.graphql.websocket.path=/graphql ``` -![graphiql.png](https://github.com/SimonVerhoeven/spring-graphql-demo/blob/main/raw/graphiql.png?raw=true) +![graphiql.png](graphiql-00775084.jpg) Using the default [GraphiQL](http://localhost:8080/graphiql) path. diff --git a/content/posts/2023/09/20/easily-manage-different-java-versions-on-your-machine-with-sdkman/index.md b/content/posts/2023/09/20/easily-manage-different-java-versions-on-your-machine-with-sdkman/index.md index 653c076ae..204fd834f 100644 --- a/content/posts/2023/09/20/easily-manage-different-java-versions-on-your-machine-with-sdkman/index.md +++ b/content/posts/2023/09/20/easily-manage-different-java-versions-on-your-machine-with-sdkman/index.md @@ -7,7 +7,7 @@ canonical: "https://blog.payara.fish/easily-manage-different-java-versions-on-yo authors: - "jadon-ortlepp" - "luqman-saeed" -image: "sdkman.png" +image: "sdkman.jpg" categories: - "Java" - "Java Beginner" diff --git a/content/posts/2023/09/20/easily-manage-different-java-versions-on-your-machine-with-sdkman/sdkman.jpg b/content/posts/2023/09/20/easily-manage-different-java-versions-on-your-machine-with-sdkman/sdkman.jpg new file mode 100644 index 000000000..edb6c13a8 Binary files /dev/null and b/content/posts/2023/09/20/easily-manage-different-java-versions-on-your-machine-with-sdkman/sdkman.jpg differ diff --git a/content/posts/2023/09/20/easily-manage-different-java-versions-on-your-machine-with-sdkman/sdkman.png b/content/posts/2023/09/20/easily-manage-different-java-versions-on-your-machine-with-sdkman/sdkman.png deleted file mode 100644 index 3ea6835d5..000000000 Binary files a/content/posts/2023/09/20/easily-manage-different-java-versions-on-your-machine-with-sdkman/sdkman.png and /dev/null differ diff --git a/content/posts/2023/09/21/monkey-patching-in-java/index.md b/content/posts/2023/09/21/monkey-patching-in-java/index.md index e3504fb48..e73eef34b 100644 --- a/content/posts/2023/09/21/monkey-patching-in-java/index.md +++ b/content/posts/2023/09/21/monkey-patching-in-java/index.md @@ -154,7 +154,7 @@ Instrumentation is the capability of the JVM to transform bytecode before it loa The [Instrumentation API](https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/Instrumentation.html)'s surface is limited: -![](instrumentation-api-1024x739.png) +![](instrumentation-api-1024x739.jpg) As seen above, the API exposes the user to low-level bytecode manipulation via byte arrays. It would be unwieldy to do it directly. Hence, real-life projects rely on bytecode manipulation libraries. [ASM](https://asm.ow2.io/) has been the traditional library for this, but it seems that [Byte Buddy](https://bytebuddy.net/) has superseded it. Note that Byte Buddy uses ASM but provides a higher-level abstraction. @@ -308,7 +308,7 @@ Last, it's possible to change the generated bytecode via a Java compiler plugin, The documentation could be less sparse. I found the following [Awesome Java Annotation Processing](https://github.com/gunnarmorling/awesome-annotation-processing). Here's a simplified class diagram to get you started: -![](javac-compiler-plugin-1024x637.png) +![](javac-compiler-plugin-1024x637.jpg) I'm too lazy to implement the same as above with such a low-level API. As the expression goes, this is left as an exercise to the reader. If you are interested, I believe the `DocLint` [source code](https://github.com/openjdk/jdk/blob/jdk-21%2B0/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/DocLint.java) is a good starting point. diff --git a/content/posts/2023/09/21/monkey-patching-in-java/instrumentation-api-1024x739.jpg b/content/posts/2023/09/21/monkey-patching-in-java/instrumentation-api-1024x739.jpg new file mode 100644 index 000000000..07ef8650f Binary files /dev/null and b/content/posts/2023/09/21/monkey-patching-in-java/instrumentation-api-1024x739.jpg differ diff --git a/content/posts/2023/09/21/monkey-patching-in-java/instrumentation-api-1024x739.png b/content/posts/2023/09/21/monkey-patching-in-java/instrumentation-api-1024x739.png deleted file mode 100644 index dcd4b177e..000000000 Binary files a/content/posts/2023/09/21/monkey-patching-in-java/instrumentation-api-1024x739.png and /dev/null differ diff --git a/content/posts/2023/09/21/monkey-patching-in-java/javac-compiler-plugin-1024x637.jpg b/content/posts/2023/09/21/monkey-patching-in-java/javac-compiler-plugin-1024x637.jpg new file mode 100644 index 000000000..02da2ea4c Binary files /dev/null and b/content/posts/2023/09/21/monkey-patching-in-java/javac-compiler-plugin-1024x637.jpg differ diff --git a/content/posts/2023/09/21/monkey-patching-in-java/javac-compiler-plugin-1024x637.png b/content/posts/2023/09/21/monkey-patching-in-java/javac-compiler-plugin-1024x637.png deleted file mode 100644 index e45ae040e..000000000 Binary files a/content/posts/2023/09/21/monkey-patching-in-java/javac-compiler-plugin-1024x637.png and /dev/null differ diff --git a/content/posts/2023/09/22/eliminating-bugs-using-the-tong-motion-approach/index.md b/content/posts/2023/09/22/eliminating-bugs-using-the-tong-motion-approach/index.md index 185518514..4cf9d9517 100644 --- a/content/posts/2023/09/22/eliminating-bugs-using-the-tong-motion-approach/index.md +++ b/content/posts/2023/09/22/eliminating-bugs-using-the-tong-motion-approach/index.md @@ -80,7 +80,7 @@ One common pitfall is neglecting one prong of the tongs or misplacing the other. In a real-world scenario, while tackling a server performance issue, I employed the 'Tong Motion' technique. By replacing web calls with curl requests, I shifted focus to the problematic area. At the same time, I enhanced database logging to monitor its output as problematic SQL was replicated through curl. This dual-sided approach helped unearth a bug in the Object Relational Mapping layer. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m121zs8x7buo7ulnxqgs.png) +![Image description](m121zs8x7buo7ulnxqgs-c641f8ee.jpg) This concrete example comprises of the following stages: diff --git a/content/posts/2023/09/22/eliminating-bugs-using-the-tong-motion-approach/m121zs8x7buo7ulnxqgs-c641f8ee.jpg b/content/posts/2023/09/22/eliminating-bugs-using-the-tong-motion-approach/m121zs8x7buo7ulnxqgs-c641f8ee.jpg new file mode 100644 index 000000000..e6415f198 Binary files /dev/null and b/content/posts/2023/09/22/eliminating-bugs-using-the-tong-motion-approach/m121zs8x7buo7ulnxqgs-c641f8ee.jpg differ diff --git a/content/posts/2023/09/26/visit-azul-at-devoxx/e7d0aa5d-dummies-book-final_10ee0fq00000-e9c9cee9.jpg b/content/posts/2023/09/26/visit-azul-at-devoxx/e7d0aa5d-dummies-book-final_10ee0fq00000-e9c9cee9.jpg new file mode 100644 index 000000000..d410be105 Binary files /dev/null and b/content/posts/2023/09/26/visit-azul-at-devoxx/e7d0aa5d-dummies-book-final_10ee0fq00000-e9c9cee9.jpg differ diff --git a/content/posts/2023/09/26/visit-azul-at-devoxx/index.md b/content/posts/2023/09/26/visit-azul-at-devoxx/index.md index 30dca019f..116370602 100644 --- a/content/posts/2023/09/26/visit-azul-at-devoxx/index.md +++ b/content/posts/2023/09/26/visit-azul-at-devoxx/index.md @@ -36,7 +36,7 @@ This year, Azul will be bringing the following swag and activities at **booth #3 * *[Keeping Your Java Hot by Solving the JVM Warmup Problem](https://devoxx.be/talk/?id=70107?utm_medium=event&utm_campaign=20231003-SEV-Devoxx%20Belgium&utm_source=unbounce&utm_content=&utm_term=)* from **13h05 to 13h50**, presented by Simon Ritter in room 4. * *[Wargames – Java vulnerabilities and why you should care](https://devoxx.be/talk/?id=2902?utm_medium=event&utm_campaign=20231003-SEV-Devoxx%20Belgium&utm_source=unbounce&utm_content=&utm_term=)* from **14h00 to 14h50**, presented by Gerrit Grunwald in room 3. -[![OpenJDK Migration for Dummies](https://www.azul.com/wp-content/uploads/e7d0aa5d-dummies-book-final_10ee0fq000000000000028_big-275x300.jpg)](https://www.azul.com/openjdk-migration-for-dummies/?utm_medium=event&utm_campaign=20231004-HEV-Dummies%20Launch%20Party%20at%20Devoxx%20BE&utm_source=unbounce&utm_content=&utm_term=) +[![OpenJDK Migration for Dummies](e7d0aa5d-dummies-book-final_10ee0fq00000-e9c9cee9.jpg)](https://www.azul.com/openjdk-migration-for-dummies/?utm_medium=event&utm_campaign=20231004-HEV-Dummies%20Launch%20Party%20at%20Devoxx%20BE&utm_source=unbounce&utm_content=&utm_term=) **Last but not least, join the [OpenJDK Migration for Dummies](https://www.azul.com/openjdk-migration-for-dummies/?utm_medium=event&utm_campaign=20231004-HEV-Dummies%20Launch%20Party%20at%20Devoxx%20BE&utm_source=unbounce&utm_content=&utm_term=) book signing party!** diff --git a/content/posts/2023/09/27/down-the-rabbit-hole-of-an-apache-apisix-plugin/ctx-all.jpg b/content/posts/2023/09/27/down-the-rabbit-hole-of-an-apache-apisix-plugin/ctx-all.jpg new file mode 100644 index 000000000..bc375f078 Binary files /dev/null and b/content/posts/2023/09/27/down-the-rabbit-hole-of-an-apache-apisix-plugin/ctx-all.jpg differ diff --git a/content/posts/2023/09/27/down-the-rabbit-hole-of-an-apache-apisix-plugin/ctx-all.png b/content/posts/2023/09/27/down-the-rabbit-hole-of-an-apache-apisix-plugin/ctx-all.png deleted file mode 100644 index 6725e41c1..000000000 Binary files a/content/posts/2023/09/27/down-the-rabbit-hole-of-an-apache-apisix-plugin/ctx-all.png and /dev/null differ diff --git a/content/posts/2023/09/27/down-the-rabbit-hole-of-an-apache-apisix-plugin/index.md b/content/posts/2023/09/27/down-the-rabbit-hole-of-an-apache-apisix-plugin/index.md index 0c60224f0..b76b1ae75 100644 --- a/content/posts/2023/09/27/down-the-rabbit-hole-of-an-apache-apisix-plugin/index.md +++ b/content/posts/2023/09/27/down-the-rabbit-hole-of-an-apache-apisix-plugin/index.md @@ -109,7 +109,7 @@ file.close() Here's the whole data representation, in case you have good eyes: -[![](ctx-all-1024x371.png)](ctx-all.png) +[![](ctx-all-1024x371.png)](ctx-all.jpg) Alternatively, here's the [PlantUML representation](https://www.plantuml.com/plantuml/svg/xLfVSzis4d_Nfy3myj2ciaKfjc9vEhrwNFVYQHff4YSplKRbGCHAH4m2AlxuJpt-xaVIa49lQCDmgaiVel6BYH-0tovs5mjWVzI6AlD1Iz6vwf3o5oNBt2wuI0Gj8DedaHNKccmhvmKtKVS6aqenJpYhcWUhRqibBouJ1UUA6qWKBE0YiOedALqQgq2Nu9iPQdHSzUsTzNiPvBcint0j_QhbvclzyTgDhwGrW2Pr7rTKtu7IN0fWv7NrdHX9nZaZ1vFZDSbQjehBxwiP6woS75mgRYvBJ3-EzxgtMvryrMnpAr9JJhTFueldWvtHxjxk7jtPsujGbxCRLb69s-wZDfrcKD2rQX0HkGHbU5Dr66DrfMgQ9mh-jA1DhN4hD9q3weGwCj2fuajJ4wl78NWSmeKsG5cNdBmuVaFAltT7htyZRr-zEVZvQBif9HxSN2vh3Ssap86A-w0CvjJcfaJFQQwX5NZTtZ_Af3RtIxcane2g9VpZztXhHBV-EjZwxzRszBjlzj-_PrVzxkxrj_z-iYReLvI0SrBDI-PI4RlKHW4j7gAB4id58WeIq2f-ltm5lNW9Oc6o4hOJZuRTXwdY_VlUzjD0eKikZvJvFcJ1nLg0Vf1k2Z2PPFUh1uGjcgxUZlhFqGccY24lZWv-yc4cupSdNinRB-IdevT79qS-rA-_78vV-a27uyblte76xxoJZISdn-DNRxp2lHvFVZv-vLNKo_7XBpxCsrSFGKqEJWvV-40dhmyEZw8xCTDGE_OxZDiBYQet8MUeGSQTb9tGhX2yExHlQHZfbMNTcSWvSTidcLsIr6eZ2_uNC28L0zNKZa-VN1XOWC8wyUW6ExTIKYKAz58A3GyJJGeOprr4yF_y0_gZl5_03R2Gim-GcWUoyAAcdxLCZ6iwo_thqveuVDRCSvuRK8-nUTULC32W2Yv0a_CCJ0QAc0oS5n01m3Gnaio0m0MarW0Zr11bXU45X3W4LOfUUgJj-FGGRX6Uz0ee0uN3YpzJSFtgRC6baqWNuJxva3MaZF6A1yqdpTXOvvLuVh-gF3rSyd9h9fJS1uLjZs2ju71HDY4IpZ0d0HAYNvca_x4__Uw9lsEu8OM7sSq4_t0dtZ1hOOiPg4Uo3kurxMncV3yoGCkH1lD_yxYl7lVLuxvwd892dk4iqUywnmOAZzTuagw0ZhoQB81Yw2dIUs_ZVFNlNg9EE29WYQ--VEhbZvRXKN9JqH5FiE5eUDtTF3iSzJOHZQQRDdLFwpJeQBL-7N4MvGzmWsudFA3v0vZ_JEV8af9i-z3XTdWTVlDiCcg8jZDjkB46o5p9WgGv1s4-kPdkaboUWoBhYwkoiwXHxl25JzfuSJ5HVwmAZKtHarGM1GXJZMGohadvHqb1rMajYhIAS55D06nrtU2UYZht48m4BM1z_xYrUgj2e7ASz3HnmxM_OyL3kXD77JGD2W3UzoTyzCQctn8PwoV1RxQVVjkcsDwJ_ctnfuYX_paFaQ5f2bgtAu76pzWmZW8Ux2eTS0KCITPKlRJYhlqjCho0v9mB9iy_DT1fg2dwRnlGNNDagdkwZ_Bl03pRtRkBx2bS9cx-ptw0EQCgwdeXIIgB6HUqMgNDNUVZLycQt2EkpR1U_WOcTCbBhOUHQTYKPwKkqjngVWQ_Si6BUjMGitXkylsaa1VyO-Wek0cqIIePU3TansOGX_3ftlk4wuRS7OqUP0YxyRCW-MYUo_E4mK9HHjt6UlN57-zrLfAgYqgIFwqqD0dnco1kHbbud44KUk7di-c7xjBdDn1C51JIG48PK-7PqCRpcBRQe_0qvZaTiZY-knodxqyVdFQZL0fj2r19pSoXKSHVXsZKZeBmi14uy5QAjyAsyBGpACE4ny5HwkLrEQCi1YCdY2OvqBf8QC6r0KMe8PanIxtVwvLIQtwnBTMYjsusaYp0a4jfLLL_HOmy1K6eO0J41tb9hAY902DfILyxeV4MqLoYJcDxZ-gSCxLALObdKb2JPYNL9JLPMrrPj08eQStj41-b2gW1TYmON5GJDfGRISKNoSUIiQlhHbjQ1Q0aeuBbe3vfBIJZS_vns6WO_wjVii5svNJNgudftg09iKj63IHhLJIQbWhE7B6oNSnBccVrGWu73LH6TS9aGJao29THvHRjTYXTndQwEbybdAtfu7gSHcKTAh51cJlgtL0oxesYmAU9wcZqhD-MgA9ZK6lFdVvEt1gAa7qabGzNKWz7WxsTGNyunBvbgB6wHI-tLwbLTVxoHUmUjwiWaSKWhhl3FGnJ_8vrmexJtjYxl_Mf_v3cN0jxoJ3krBXcbQaBryY7ga1vsu-JbAPPYq4t3gOuDBGL4qQvJ6bU_OC1pMEkTpHVUtFxBN7zvuFjGRmTRvVojTDVbRkXSZNacMvQDsUhubSYLBYKKKE_FvESaQS_L6v1ozyiXNGu6iLHirDgwYZslO8vA10fQ3AZwMbT3g6aDEJc3Fg3AzdjN7SwFu9WLLtn_m00). diff --git a/content/posts/2023/09/27/java-memory-management/Screenshot-2023-09-22-at-5.39.32-PM-1024x489.jpg b/content/posts/2023/09/27/java-memory-management/Screenshot-2023-09-22-at-5.39.32-PM-1024x489.jpg new file mode 100644 index 000000000..75cb0aefb Binary files /dev/null and b/content/posts/2023/09/27/java-memory-management/Screenshot-2023-09-22-at-5.39.32-PM-1024x489.jpg differ diff --git a/content/posts/2023/09/27/java-memory-management/Screenshot-2023-09-22-at-5.39.32-PM-1024x489.png b/content/posts/2023/09/27/java-memory-management/Screenshot-2023-09-22-at-5.39.32-PM-1024x489.png deleted file mode 100644 index 5cbc0d132..000000000 Binary files a/content/posts/2023/09/27/java-memory-management/Screenshot-2023-09-22-at-5.39.32-PM-1024x489.png and /dev/null differ diff --git a/content/posts/2023/09/27/java-memory-management/index.md b/content/posts/2023/09/27/java-memory-management/index.md index d0d630580..4b9d5cb4f 100644 --- a/content/posts/2023/09/27/java-memory-management/index.md +++ b/content/posts/2023/09/27/java-memory-management/index.md @@ -54,7 +54,7 @@ To note, as long as an object is "reachable", it is 'live' and the garbage colle The root set includes all local variables and method parameters that are currently on all thread stacks. If two objects referenced each other, but could not be reached by the root set, they would be garbage collected. -![](Screenshot-2023-09-22-at-5.39.32-PM-1024x489.png) +![](Screenshot-2023-09-22-at-5.39.32-PM-1024x489.jpg) *Figure 2. Object Reachability* The time between an object's creation and the time it is destroyed is encapsulated by the term '[object lifetime](https://en.wikipedia.org/wiki/Object_lifetime "object lifetime")'. With 'short-lived' objects, these remain in a part of the heap memory known as the '[Nursery](https://docs.oracle.com/cd/E15289_01/JRSDK/garbage_collect.htm#i1087437 "Nursery")', this is also known as the 'Young Space', or as 'Eden'. With longer living objects, typically these are moved to the part of the heap known as 'Tenured' (the 'Old Space') in order to free up the nursery for new objects to be allocated. diff --git a/content/posts/2023/09/28/c2-might-be-slowing-down-your-builds/image-7-2000x462-5969c05e.jpg b/content/posts/2023/09/28/c2-might-be-slowing-down-your-builds/image-7-2000x462-5969c05e.jpg new file mode 100644 index 000000000..9985ca655 Binary files /dev/null and b/content/posts/2023/09/28/c2-might-be-slowing-down-your-builds/image-7-2000x462-5969c05e.jpg differ diff --git a/content/posts/2023/09/28/c2-might-be-slowing-down-your-builds/image-8-2000x463-52d133e0.jpg b/content/posts/2023/09/28/c2-might-be-slowing-down-your-builds/image-8-2000x463-52d133e0.jpg new file mode 100644 index 000000000..41cba8470 Binary files /dev/null and b/content/posts/2023/09/28/c2-might-be-slowing-down-your-builds/image-8-2000x463-52d133e0.jpg differ diff --git a/content/posts/2023/09/28/c2-might-be-slowing-down-your-builds/image-9-2000x383-584a7e9f.jpg b/content/posts/2023/09/28/c2-might-be-slowing-down-your-builds/image-9-2000x383-584a7e9f.jpg new file mode 100644 index 000000000..d0a4df8a3 Binary files /dev/null and b/content/posts/2023/09/28/c2-might-be-slowing-down-your-builds/image-9-2000x383-584a7e9f.jpg differ diff --git a/content/posts/2023/09/28/c2-might-be-slowing-down-your-builds/index.md b/content/posts/2023/09/28/c2-might-be-slowing-down-your-builds/index.md index 1188f1167..54dae0b85 100644 --- a/content/posts/2023/09/28/c2-might-be-slowing-down-your-builds/index.md +++ b/content/posts/2023/09/28/c2-might-be-slowing-down-your-builds/index.md @@ -30,7 +30,7 @@ Maven uses the [Plexus compiler wrapper](https://codehaus-plexus.github.io/plexu ## Small builds This is problematic on short builds (like building maven itself in 30s), as the C2 JIT does cost a significant amount of cpu-time, more than is saved by the faster execution of the jitted code. The maven self-built, for example, spent more than half of its cpu-time in the C2 compiler: -[![](https://mostlynerdless.de/wp-content/uploads/2023/09/image-7-2000x462.png)](https://mostlynerdless.de/wp-content/uploads/2023/09/profile-two-core-none.html) Maven 4 (f24266eb64) was built with maven 3.8.7 on SapMachine 17.0.8.1 and profiled with [async-profiler](https://github.com/jvm-profiling-tools/async-profiler); click to view the [full](https://mostlynerdless.de/wp-content/uploads/2023/09/profile-two-core-none.html)flame graph +[![](image-7-2000x462-5969c05e.jpg)](https://mostlynerdless.de/wp-content/uploads/2023/09/profile-two-core-none.html) Maven 4 (f24266eb64) was built with maven 3.8.7 on SapMachine 17.0.8.1 and profiled with [async-profiler](https://github.com/jvm-profiling-tools/async-profiler); click to view the [full](https://mostlynerdless.de/wp-content/uploads/2023/09/profile-two-core-none.html)flame graph We can use the information by async-profiler to get the cpu-time proportions for significant parts of the built: @@ -42,7 +42,7 @@ We can use the information by async-profiler to get the cpu-time proportions for | Compiler::compile_method (C1 compiler) | 8 % | 650 | The whole maven build took 44s (82s cpu-time) on two cores of my ThreadRipper 3995WX. Compare this to a run with a disabled C2 which took 41s (50s cpu-time): -![](https://mostlynerdless.de/wp-content/uploads/2023/09/image-8-2000x463.png) Maven 4 (f24266eb64) built with maven 3.8.7 on SapMachine 17.0.8.1 and `MVN_OPTS="`*-XX:TieredStopAtLevel=1*`"` (*but stopping at a higher C1 level is unusual, see [dzone](https://dzone.com/articles/complication-compilers-and-java)* ) profiled with [async-profiler](https://github.com/jvm-profiling-tools/async-profiler), click to view the [full](https://mostlynerdless.de/wp-content/uploads/2023/09/profile-two-core-stop.html)flame graph +![](image-8-2000x463-52d133e0.jpg) Maven 4 (f24266eb64) built with maven 3.8.7 on SapMachine 17.0.8.1 and `MVN_OPTS="`*-XX:TieredStopAtLevel=1*`"` (*but stopping at a higher C1 level is unusual, see [dzone](https://dzone.com/articles/complication-compilers-and-java)* ) profiled with [async-profiler](https://github.com/jvm-profiling-tools/async-profiler), click to view the [full](https://mostlynerdless.de/wp-content/uploads/2023/09/profile-two-core-stop.html)flame graph The proportions are as expected: @@ -63,7 +63,7 @@ Does this mean that you should always disable C2 in CI builds? No. At a certain Take, for example, [quarkus](https://quarkus.io/): A clean build on two cores runs for 430s (710s cpu-time) with C2 enabled: -{{< img src="https://mostlynerdless.de/wp-content/uploads/2023/09/image-9-2000x383.png" class="size-large is-resized" width="614" height="126" style="width:614px;height:126px" caption="Quarkus (af4208a05e) built with maven 3.8.8 on SapMachine 17.0.8.1 and ./mvnd -Dquickly" >}} +{{< img src="image-9-2000x383-584a7e9f.jpg" class="size-large is-resized" width="614" height="126" style="width:614px;height:126px" caption="Quarkus (af4208a05e) built with maven 3.8.8 on SapMachine 17.0.8.1 and ./mvnd -Dquickly" >}} The runtime proportions are less skewed in the direction of C2: diff --git a/content/posts/2023/09/30/javafx-links-of-september-2023/index.md b/content/posts/2023/09/30/javafx-links-of-september-2023/index.md index 8f484d59c..124c79617 100644 --- a/content/posts/2023/09/30/javafx-links-of-september-2023/index.md +++ b/content/posts/2023/09/30/javafx-links-of-september-2023/index.md @@ -5,7 +5,7 @@ lastmod: "2023-10-01T15:21:26+00:00" description: "Here is the overview of the JavaFX LinksOfTheWeek that got published on jfx-central.com during September." authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" - "JDK21" diff --git a/content/posts/2023/09/30/javafx-links-of-september-2023/jfxcentral.jpg b/content/posts/2023/09/30/javafx-links-of-september-2023/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2023/09/30/javafx-links-of-september-2023/jfxcentral.jpg differ diff --git a/content/posts/2023/09/30/javafx-links-of-september-2023/jfxcentral.png b/content/posts/2023/09/30/javafx-links-of-september-2023/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2023/09/30/javafx-links-of-september-2023/jfxcentral.png and /dev/null differ diff --git a/content/posts/2023/10/02/jvector-1-0/XE4JxuQTK7XUZ4sRNL0-PmNsMoxpxYqxiDLUez7z-f8cbb629.png b/content/posts/2023/10/02/jvector-1-0/XE4JxuQTK7XUZ4sRNL0-PmNsMoxpxYqxiDLUez7z-f8cbb629.png new file mode 100644 index 000000000..5bd293179 Binary files /dev/null and b/content/posts/2023/10/02/jvector-1-0/XE4JxuQTK7XUZ4sRNL0-PmNsMoxpxYqxiDLUez7z-f8cbb629.png differ diff --git a/content/posts/2023/10/02/jvector-1-0/hwA3-thdVsb3W7OMcG1v6v8VRSlT6y8sCoR2C32z-0f13c840.png b/content/posts/2023/10/02/jvector-1-0/hwA3-thdVsb3W7OMcG1v6v8VRSlT6y8sCoR2C32z-0f13c840.png new file mode 100644 index 000000000..b4b92537b Binary files /dev/null and b/content/posts/2023/10/02/jvector-1-0/hwA3-thdVsb3W7OMcG1v6v8VRSlT6y8sCoR2C32z-0f13c840.png differ diff --git a/content/posts/2023/10/02/jvector-1-0/index.md b/content/posts/2023/10/02/jvector-1-0/index.md index 9db378fe0..ecac1c1a3 100644 --- a/content/posts/2023/10/02/jvector-1-0/index.md +++ b/content/posts/2023/10/02/jvector-1-0/index.md @@ -23,14 +23,14 @@ JVector is a pure Java embedded vector search engine that powers [DataStax Astra JVector's closest relative is Apache Lucene's vector search. Lucene implements the [HNSW](https://arxiv.org/pdf/1603.09320.pdf) vector search algorithm, which is known to be fast but memory-hungry. Because it is based on the more sophisticated [DiskANN](https://www.microsoft.com/en-us/research/publication/diskann-fast-accurate-billion-point-nearest-neighbor-search-on-a-single-node/) algorithm, JVector is over 10x faster than Lucene for large datasets, holding other things equal. For example, here is a comparison of searching the [Deep100M](https://www.cv-foundation.org/openaccess/content_cvpr_2016/app/S09-38.pdf) dataset (about 35GB of vectors and 20GB of index data) with Lucene and with JVector: -![](https://lh5.googleusercontent.com/XE4JxuQTK7XUZ4sRNL0-PmNsMoxpxYqxiDLUez7zHZ0qLPOBy3jQdmJfayLcGfHWoxlkQcgAe4SaSl-ZhkkiWcXkPmY-thYGUOWH0AJJR7traWDxp-2GxPqRW-j9n6vFlbYj-Alw39m0xH4PExlNUic) +![](XE4JxuQTK7XUZ4sRNL0-PmNsMoxpxYqxiDLUez7z-f8cbb629.png) JVector is fast, memory-efficient, disk-aware, concurrent, easy to embed, and incremental. *Incremental* means that you can start searching your JVector index immediately. There are no batches or microbatches or "commit" stages to wait for. *Concurrent* means that you can build and search a JVector index with multiple threads simultaneously. Here you can see that doubling the number of threads adding vectors cuts build time in half, out to 32 threads. (X and Y axes are both logarithmic.) -![](https://lh4.googleusercontent.com/hwA3-thdVsb3W7OMcG1v6v8VRSlT6y8sCoR2C32zeH6qumcpAThE8J6SIKhdPQ5wF_U8AXt-B7VX7PDyaOA8Gc6AcnVVaKpHnbQNYKJGeEIaVNaHwGuhOscL-jNBthrbgJ8CjahQ5FD0fXL881KKC1Q) +![](hwA3-thdVsb3W7OMcG1v6v8VRSlT6y8sCoR2C32z-0f13c840.png) JVector is designed to be straightforward to embed while preserving high performance. [Here](https://github.com/jbellis/jvector/blob/main/jvector-examples/src/main/java/io/github/jbellis/jvector/example/SiftSmall.java) is the code to compute the index for the [SIFT dataset](http://corpus-texmex.irisa.fr/) shown above. In under 100 lines it diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_1940-2000x1500-0b6626a2.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_1940-2000x1500-0b6626a2.jpeg new file mode 100644 index 000000000..d9bc8e92a Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_1940-2000x1500-0b6626a2.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_1951-1500x2000-1e6b85d2.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_1951-1500x2000-1e6b85d2.jpeg new file mode 100644 index 000000000..c1d4435d4 Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_1951-1500x2000-1e6b85d2.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_1956-2000x1500-fd00bf48.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_1956-2000x1500-fd00bf48.jpeg new file mode 100644 index 000000000..5f0581f4d Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_1956-2000x1500-fd00bf48.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_1985-1500x2000-cc8ce7aa.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_1985-1500x2000-cc8ce7aa.jpeg new file mode 100644 index 000000000..7ac80d113 Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_1985-1500x2000-cc8ce7aa.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2003-1500x2000-93f308e8.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2003-1500x2000-93f308e8.jpeg new file mode 100644 index 000000000..0d83bec21 Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2003-1500x2000-93f308e8.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2012-2000x1500-052e0f64.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2012-2000x1500-052e0f64.jpeg new file mode 100644 index 000000000..ef2bca640 Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2012-2000x1500-052e0f64.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2022-2000x1500-df2dfd6e.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2022-2000x1500-df2dfd6e.jpeg new file mode 100644 index 000000000..abc47af5b Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2022-2000x1500-df2dfd6e.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2042-d10a96e6.jpg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2042-d10a96e6.jpg new file mode 100644 index 000000000..19cbd4005 Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2042-d10a96e6.jpg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2047-2000x1500-67cc6979.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2047-2000x1500-67cc6979.jpeg new file mode 100644 index 000000000..f860f2c5a Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2047-2000x1500-67cc6979.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2084-2-1500x2000-ff8e5163.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2084-2-1500x2000-ff8e5163.jpeg new file mode 100644 index 000000000..02dad6aae Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2084-2-1500x2000-ff8e5163.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2091-2000x1500-3d1b7439.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2091-2000x1500-3d1b7439.jpeg new file mode 100644 index 000000000..bfa9d72f1 Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2091-2000x1500-3d1b7439.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2100-44c46405.jpg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2100-44c46405.jpg new file mode 100644 index 000000000..ebc5a4eaa Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2100-44c46405.jpg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2125-2-2000x1500-cdcc41c5.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2125-2-2000x1500-cdcc41c5.jpeg new file mode 100644 index 000000000..b7705e35a Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2125-2-2000x1500-cdcc41c5.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2134-2000x1500-42d47cf4.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2134-2000x1500-42d47cf4.jpeg new file mode 100644 index 000000000..416842bea Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2134-2000x1500-42d47cf4.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2140-2000x1500-f65d1513.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2140-2000x1500-f65d1513.jpeg new file mode 100644 index 000000000..298800234 Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2140-2000x1500-f65d1513.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2157-2000x1125-599a2c5c.jpg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2157-2000x1125-599a2c5c.jpg new file mode 100644 index 000000000..d9184ca65 Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2157-2000x1125-599a2c5c.jpg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2187-2000x1500-01c523df.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2187-2000x1500-01c523df.jpeg new file mode 100644 index 000000000..a91688bed Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2187-2000x1500-01c523df.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2190-2000x1500-2eca2c2d.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2190-2000x1500-2eca2c2d.jpeg new file mode 100644 index 000000000..8708fff5b Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2190-2000x1500-2eca2c2d.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2190-4-2000x1500-ee149f13.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2190-4-2000x1500-ee149f13.jpeg new file mode 100644 index 000000000..b72c815e5 Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2190-4-2000x1500-ee149f13.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2211-2000x1500-c07bda2b.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2211-2000x1500-c07bda2b.jpeg new file mode 100644 index 000000000..beafff447 Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/IMG_2211-2000x1500-c07bda2b.jpeg differ diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/index.md b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/index.md index fc39a0b8b..78170e3f0 100644 --- a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/index.md +++ b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/index.md @@ -23,29 +23,29 @@ Between 2nd and 17th September, I gave three talks in three different cities: I traveled from Karlsruhe to Oslo (via Stuttgart Airport) and from Oslo to Hanover via plane, then to Hamburg, Hanover, back to Hamburg, and the end via Bonn back to Karlsruhe via train: -{{< img src="https://mostlynerdless.de/wp-content/uploads/2023/09/image-14.png" class="aligncenter size-full is-resized" width="422" height="675" style="width:422px;height:675px" caption="This was my first time traveling to a conference by plane because traveling to Oslo by train takes far longer (20 hours or more)." >}} +{{< img src="image-14.jpg" class="aligncenter size-full is-resized" width="422" height="675" style="width:422px;height:675px" caption="This was my first time traveling to a conference by plane because traveling to Oslo by train takes far longer (20 hours or more)." >}} This was my second two-week-long tour giving talks, after my tour d'Europe in May/June this year (see [Report of my small Tour d'Europe](https://mostlynerdless.de/blog/2023/06/15/report-of-my-small-tour-deurope/)), but this time it consisted solely of talks at conferences. The following is a short report of my trip that saw me brewing beer, giving a talk at one of my favorite conferences, and visiting Hamburg for the first time. ## Oslo I started by traveling to Oslo on Saturday before the conference, which began on Tuesday with workshops. My journey started with the 2:30 am bus from Karlsruhe to Stuttgart, where I took the 6:30 am flight to Paris and from there to Oslo. Flying in the early hours of the morning is something extraordinary: -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_1940-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/paris_airport-2000x1500.jpeg) +![](IMG_1940-2000x1500-0b6626a2.jpeg) +![](paris_airport-2000x1500-8a5c5edc.jpeg) I've never really been to Oslo before, except as a toddler, according to my parents, so I wanted to explore the city. I arrived in Oslo Saturday afternoon and stayed till Tuesday morning at the home of a friendly expat that I met via the couch-surfing platform [BeBelcome.org](https://bewelcome.org), staying there till Tuesday morning. It was great: I had the opportunity to visit the famous [Fram Polar Exploration Museum](https://frammuseum.no/), hike around the Vettakollen, and brew beer with my host: -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2012-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2022-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2003-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_1985-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_1956-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_1951-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2012-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2022-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2003-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_1985-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_1956-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_1951-1500x2000.jpeg) +![](IMG_2012-2000x1500-052e0f64.jpeg) +![](IMG_2022-2000x1500-df2dfd6e.jpeg) +![](IMG_2003-1500x2000-93f308e8.jpeg) +![](IMG_1985-1500x2000-cc8ce7aa.jpeg) +![](IMG_1956-2000x1500-fd00bf48.jpeg) +![](IMG_1951-1500x2000-1e6b85d2.jpeg) +![](IMG_2012-2000x1500-052e0f64.jpeg) +![](IMG_2022-2000x1500-df2dfd6e.jpeg) +![](IMG_2003-1500x2000-93f308e8.jpeg) +![](IMG_1985-1500x2000-cc8ce7aa.jpeg) +![](IMG_1956-2000x1500-fd00bf48.jpeg) +![](IMG_1951-1500x2000-1e6b85d2.jpeg) ## JavaZone @@ -56,12 +56,12 @@ Then, on Tuesday, it was time for the workshop day of JavaZone. I've been drawn So, speaking, there was a great honor; I can recommend this experience to anyone. It is a lovely venue with good food and great organizers who care about their speakers (shout out to [Felix Rabe](https://www.linkedin.com/in/felixrabe/), [Rafael Winterhalter](https://rafael.codes/), and [Marek Machnik](https://www.linkedin.com/in/marekmachnik/)). I started the conference by attending the "A little taste of testing the Java compiler" workshop by [Hasnae Rehioui](https://viqueen.org/): -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2042.jpg) Hasnae Rehioui, in her workshop +![](IMG_2042-d10a96e6.jpg) Hasnae Rehioui, in her workshop *If you want to start with building the OpenJDK and running JTREG tests, her [accompanying website](https://viqueen.org/notes/workshop:-testing-OpenJDK/) is an excellent place to start.* At the end of the day, I went to the speaker dinner, where I met the organizers and people like [Fabian Stäber](https://www.linkedin.com/in/fstab/) and [Gunnar Morling](https://www.morling.dev/). The view from the restaurant was majestic: -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2047-2000x1500.jpeg) +![](IMG_2047-2000x1500-67cc6979.jpeg) Then, the next day, the conference began. The conference paid for the hotel during the week. I met [Pasha Finkelshtein](https://www.linkedin.com/in/asm0dey/) and [Marit van Dijk](https://maritvandijk.com/) from [JetBrains](https://www.jetbrains.com/) at the breakfast buffet. I was that day in many talks, including the [Maven Puzzlers](https://2023.javazone.no/program/ca873dbe-7389-4ee7-a71f-7327860106c7) talk by Andres Almiray and Ixchel Ruiz: @@ -104,31 +104,31 @@ Later in the day, I went to [Theresa](https://www.linkedin.com/in/tmammarella/)M I was introduced to her the evening before, and it was great to see the only other young JDK developer (in her case, [OpenJ9](https://eclipse.dev/openj9/)) on stage. In the evening, I ate dinner with a couple of my fellow speakers, including [Marit van Dijk](https://www.linkedin.com/in/maritvandijk/), [Rustam Mehmandarov](https://www.linkedin.com/in/mehmandarov/), [Gerrit Grunwald](https://www.linkedin.com/in/gerritgrunwald/), [Raquel Pau](https://www.linkedin.com/in/raquel-pau-4010069/), [Tim te Beek](https://www.linkedin.com/in/timtebeek/), [Steve Poole](https://www.linkedin.com/in/noregressions/), [Alina Yurenko](https://www.linkedin.com/in/alinayurenko/), [Theresa Mammarella](https://www.linkedin.com/in/tmammarella/), [Mads Opheim](https://www.linkedin.com/in/madsopheim/) and [Ko Turk](https://www.linkedin.com/in/ko-turk-b271b929/). Afterward, we went to Himkok bar to relax after two days at the conference: -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2100.jpg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2084-2-1500x2000.jpeg) +![](IMG_2100-44c46405.jpg) +![](IMG_2084-2-1500x2000-ff8e5163.jpeg) The next day was my last in Oslo before moving to northern Germany. So I took the chance to explore the city center once more and made a photograph of the speaker's gift: -{{< img src="https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2091-2000x1500.jpeg" class="aligncenter size-large is-resized" width="614" height="454" style="width:614px;height:454px" caption="A Viking duke in front of the Oslo Stock Exchange" >}} +{{< img src="IMG_2091-2000x1500-3d1b7439.jpeg" class="aligncenter size-large is-resized" width="614" height="454" style="width:614px;height:454px" caption="A Viking duke in front of the Oslo Stock Exchange" >}} I had to say goodbye to Oslo and then traveled to Hamburg via Hanover Airport to stay with a friend in Hamburg. ## Hamburg The problem was that JavaZone pays the hotel till Friday, and the speaker dinner for Java Forum Nord is Monday evening. I knew someone in Hamburg, so I stayed in Hamburg from Friday night till Monday afternoon. I used the time to look into Python debugging, which eventually resulted in my [Let's create a Python Debugger together: Part 1](https://mostlynerdless.de/blog/2023/09/20/lets-create-a-python-debugger-together-part-1/) blog post, went sightseeing, watched the dark comedy [Sophia, der Tod und Ich](//www.polyfilm.at/film/sophia-der-tod-und-ich/), and visited the [Hamburger Miniaturwunderland](https://www.miniatur-wunderland.de/): -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2125-2-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2134-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2140-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2125-2-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2134-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2140-2000x1500.jpeg) +![](IMG_2125-2-2000x1500-cdcc41c5.jpeg) +![](IMG_2134-2000x1500-42d47cf4.jpeg) +![](IMG_2140-2000x1500-f65d1513.jpeg) +![](IMG_2125-2-2000x1500-cdcc41c5.jpeg) +![](IMG_2134-2000x1500-42d47cf4.jpeg) +![](IMG_2140-2000x1500-f65d1513.jpeg) While there, I had the pleasure of traveling with light luggage, as my luggage didn't arrive in Hamburg till Wednesday because it was somehow stuck in Amsterdam airport, where I had a stopover. ## Java Forum Nord The second conference on my journey was the [Java Forum Nord](https://javaforumnord.de/2023/) in Hanover on Tuesday. This conference is a small community-run event, without many sponsors and many talks in German. It was my first German Java conference, so there were many German-only speakers that I hadn't seen at a conference before. I met a few of them at the speaker's dinner on Monday and at the after-party on Tuesday: -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2157-2000x1125.jpg) Speakers' dinner with alcohol-free beer and Spätzle in Hanover +![](IMG_2157-2000x1125-599a2c5c.jpg) Speakers' dinner with alcohol-free beer and Spätzle in Hanover I enjoyed meeting Marit van Dijk again and getting to know [Sandra Parsick](https://www.sandra-parsick.de/) and [Karl Heinz Marbaise](https://www.linkedin.com/in/khmarbaise/). @@ -137,14 +137,14 @@ The day after, I traveled back to Hamburg for the [code.talks](https://codetalks ## Code.Talks This was the third conference in a row and the only one without a focus on Java. The talks were on various technologies, from NFTs to creativity. The most memorable of the conference was by far the speaker's dinner at the open kitchen restaurant [Hensslers Küche](https://www.hensslerskueche.de/) and visiting the [Heavens Bar \& Kitchen](https://www.clouds-hamburg.de/startseite) rooftop bar in St. Pauli with [Jacqueline Franßen](https://www.linkedin.com/in/jacqueline-franssen-0422341b1/), [Hannes Drittler](https://www.linkedin.com/in/hannes-drittler-06b57b151/), and [Samir Ar](https://www.linkedin.com/in/samir-ar-548599b0/) after the second day of the conference: -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2211-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2190-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2187-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2190-4-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2211-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2190-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2187-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2190-4-2000x1500.jpeg) +![](IMG_2211-2000x1500-c07bda2b.jpeg) +![](IMG_2190-2000x1500-2eca2c2d.jpeg) +![](IMG_2187-2000x1500-01c523df.jpeg) +![](IMG_2190-4-2000x1500-ee149f13.jpeg) +![](IMG_2211-2000x1500-c07bda2b.jpeg) +![](IMG_2190-2000x1500-2eca2c2d.jpeg) +![](IMG_2187-2000x1500-01c523df.jpeg) +![](IMG_2190-4-2000x1500-ee149f13.jpeg) While there, I also started preparing an upcoming talk for JCon World with Marit van Dijk and had an online meeting with Jaroslav Bachorik and Erik Österlund on the future of my JEP, so stay tuned. diff --git a/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/paris_airport-2000x1500-8a5c5edc.jpeg b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/paris_airport-2000x1500-8a5c5edc.jpeg new file mode 100644 index 000000000..9406f4967 Binary files /dev/null and b/content/posts/2023/10/02/report-of-my-trip-to-javazone-and-northern-germany/paris_airport-2000x1500-8a5c5edc.jpeg differ diff --git a/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/Community-Process-473x510.jpg b/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/Community-Process-473x510.jpg new file mode 100644 index 000000000..54c56e169 Binary files /dev/null and b/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/Community-Process-473x510.jpg differ diff --git a/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/Community-Process-473x510.png b/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/Community-Process-473x510.png deleted file mode 100644 index 47332838e..000000000 Binary files a/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/Community-Process-473x510.png and /dev/null differ diff --git a/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/Community-Process.jpg b/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/Community-Process.jpg new file mode 100644 index 000000000..fbd8848b4 Binary files /dev/null and b/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/Community-Process.jpg differ diff --git a/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/Community-Process.png b/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/Community-Process.png deleted file mode 100644 index 9a2f5dc4a..000000000 Binary files a/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/Community-Process.png and /dev/null differ diff --git a/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/index.md b/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/index.md index 7afa8e3d6..19d6b0809 100644 --- a/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/index.md +++ b/content/posts/2023/10/04/how-to-participate-in-the-foojay-community-certification-project/index.md @@ -5,7 +5,7 @@ lastmod: "2023-10-04T07:13:41+00:00" description: "Read how you can help create a community certification for Java Developers as part of the Foojay community" authors: - "janhendrik-kuperus" -image: "Community-Process.png" +image: "Community-Process.jpg" categories: - "Foojay" - "Java" @@ -32,7 +32,7 @@ There is an inherent contradiction between open sourcing the creation of a certi The diagram below outlines this process and visualizes it as an outside-in flow. Each circle is a smaller context of people with access to the source and with each advancement, the task comes closer to incorporation into the actual testing environment. -![Visualisation of the process an idea for a task will follow to increasingly tighter regulation before inclusion in a test.](Community-Process-473x510.png) +![Visualisation of the process an idea for a task will follow to increasingly tighter regulation before inclusion in a test.](Community-Process-473x510.jpg) To bring your idea into the certification exams, it will have to go through these steps: diff --git a/content/posts/2023/10/09/debugging-tips-and-tricks-a-comprehensive-guide/dmnmcjp5t4050yfqrxgj-af20a44b.jpg b/content/posts/2023/10/09/debugging-tips-and-tricks-a-comprehensive-guide/dmnmcjp5t4050yfqrxgj-af20a44b.jpg new file mode 100644 index 000000000..d8799294c Binary files /dev/null and b/content/posts/2023/10/09/debugging-tips-and-tricks-a-comprehensive-guide/dmnmcjp5t4050yfqrxgj-af20a44b.jpg differ diff --git a/content/posts/2023/10/09/debugging-tips-and-tricks-a-comprehensive-guide/index.md b/content/posts/2023/10/09/debugging-tips-and-tricks-a-comprehensive-guide/index.md index fea7e2b4b..e0798726f 100644 --- a/content/posts/2023/10/09/debugging-tips-and-tricks-a-comprehensive-guide/index.md +++ b/content/posts/2023/10/09/debugging-tips-and-tricks-a-comprehensive-guide/index.md @@ -162,7 +162,7 @@ Every debugging session is a learning opportunity. It allows developers to deepe You either love something or you don't and a lot of developers feel that they don't love debugging. I get that. It's frustrating. In fact, I often start my talks with the universal debugging gesture… -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dmnmcjp5t4050yfqrxgj.jpg) +![Image description](dmnmcjp5t4050yfqrxgj-af20a44b.jpg) However, since you made it here and are a software developer I think the potential for love is there. You just need to see debugging for what it is: a process. I think people don't hate debugging, we're frustrated by our work environment, by the fact that we make bugs and by the fact we feel stupid. Debugging is just the process we use, it's here to help. diff --git a/content/posts/2023/10/14/book-review-get-your-hands-dirty-on-clean-architecture-second-edition/image-830x1024.jpg b/content/posts/2023/10/14/book-review-get-your-hands-dirty-on-clean-architecture-second-edition/image-830x1024.jpg new file mode 100644 index 000000000..75c654b38 Binary files /dev/null and b/content/posts/2023/10/14/book-review-get-your-hands-dirty-on-clean-architecture-second-edition/image-830x1024.jpg differ diff --git a/content/posts/2023/10/14/book-review-get-your-hands-dirty-on-clean-architecture-second-edition/image-830x1024.png b/content/posts/2023/10/14/book-review-get-your-hands-dirty-on-clean-architecture-second-edition/image-830x1024.png deleted file mode 100644 index a25ea188d..000000000 Binary files a/content/posts/2023/10/14/book-review-get-your-hands-dirty-on-clean-architecture-second-edition/image-830x1024.png and /dev/null differ diff --git a/content/posts/2023/10/14/book-review-get-your-hands-dirty-on-clean-architecture-second-edition/index.md b/content/posts/2023/10/14/book-review-get-your-hands-dirty-on-clean-architecture-second-edition/index.md index 3710fa0c5..f3f676180 100644 --- a/content/posts/2023/10/14/book-review-get-your-hands-dirty-on-clean-architecture-second-edition/index.md +++ b/content/posts/2023/10/14/book-review-get-your-hands-dirty-on-clean-architecture-second-edition/index.md @@ -19,7 +19,7 @@ frozen: false **Clean Architecture helps us ensure a solid foundation for our applications** ,**and helps keep our code organized and maintainable. Furthermore when properly applied it helps keep ones team on the same page and ensures our applications stay robust and flexible over time. Of course there are a lot of pitfalls to take into account, and a lot of pros/cons to each approach. There certainly is no one size fits all approach. But luckily this book by [Tom Hombergs](https://www.linkedin.com/in/thombergs/) provides a lot of valuable practical insights.** -{{< img src="image-830x1024.png" class="aligncenter size-large is-resized" width="301" height="371" style="width:301px;height:371px" >}} +{{< img src="image-830x1024.jpg" class="aligncenter size-large is-resized" width="301" height="371" style="width:301px;height:371px" >}} ## About the book diff --git a/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/image-1-f9a95020.jpg b/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/image-1-f9a95020.jpg new file mode 100644 index 000000000..c3d8d7c07 Binary files /dev/null and b/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/image-1-f9a95020.jpg differ diff --git a/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/image-3-1b809dff.jpg b/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/image-3-1b809dff.jpg new file mode 100644 index 000000000..1de7b02fe Binary files /dev/null and b/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/image-3-1b809dff.jpg differ diff --git a/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/image-4-df0c17e0.jpg b/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/image-4-df0c17e0.jpg new file mode 100644 index 000000000..733521a95 Binary files /dev/null and b/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/image-4-df0c17e0.jpg differ diff --git a/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/image-8a05efa0.jpg b/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/image-8a05efa0.jpg new file mode 100644 index 000000000..3d787b825 Binary files /dev/null and b/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/image-8a05efa0.jpg differ diff --git a/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/index.md b/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/index.md index 2a1a3cbc8..7f09fca0b 100644 --- a/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/index.md +++ b/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/index.md @@ -5,7 +5,7 @@ lastmod: "2023-10-16T14:21:25+00:00" description: "Learn about onthrow and onjcmd and more that can improve the performance of on-demand debugging, as this allows us to trigger the start of the debugging session from outside the debugger." authors: - "johannes-bechberger" -image: "ondemanddebug.png" +image: "ondemanddebug.jpg" categories: - "Debugging" related_posts: @@ -29,7 +29,7 @@ Before I tell you more about the specific options, I want to start with the basi ## Option Application When you debug remotely in your IDE (IntelliJ IDEA in my case), the "Debug Configurations" dialog tells you which options you should pass to your remote JVM: -![](https://mostlynerdless.de/wp-content/uploads/2023/10/image.png) +![](image-8a05efa0.jpg) Just append more options by adding them to the `-agentlib` option, or by setting the `_JAVA_JDWP_OPTIONS` environment variable, which is comma-appended to the options. @@ -56,7 +56,7 @@ Address : *:5005 [jps](https://docs.oracle.com/en/java/javase/21/docs/specs/man/jps.html) is your friend if you want to find the process id of an already running JVM. I created a sample class in my [java-dbg](https://github.com/parttimenerd/java-dbg) repository on GitHub with [a small sample program](https://github.com/parttimenerd/java-dbg/blob/main/src/test/java/OnThrowAndJCmd.java) for this article. To use JCmd triggered with our IDE, we first have to create a remote debug configuration (see previous section); we can then start the sample program in the shell and trigger the start of the debugging session. Then, we start the remote debug configuration in the IDE and debug our program: -![](https://mostlynerdless.de/wp-content/uploads/2023/10/image-1.png) +![](image-1-f9a95020.jpg) A similar feature [long existed](https://mail.openjdk.org/pipermail/serviceability-dev/2019-May/028227.html) [in the SAPJVM](https://help.sap.com/docs/btp/sap-business-technology-platform/debug-application-running-on-sap-jvm). In 2019 [Christoph Langer](https://www.linkedin.com/in/christoph-langer-764280208) from SAP decided to [add it to the OpenJDK](https://bugs.openjdk.org/browse/JDK-8223456), where it was implemented in JDK 12 and has been there ever since. It is one of the many [significant contributions](https://github.com/SAP/SapMachine/wiki/Features-Contributed-by-SAP) of the SapMachine team. @@ -94,10 +94,10 @@ We run our application using the JDWP agent with the `onthrow=Ex,launch=sh tmux_ ➜ tmux attach -t jdb ``` -![](https://mostlynerdless.de/wp-content/uploads/2023/10/image-3.png) +![](image-3-1b809dff.jpg) Where we can explore the current state of the application: -![](https://mostlynerdless.de/wp-content/uploads/2023/10/image-4.png) +![](image-4-df0c17e0.jpg) Debugging a specific exception has never been easier. diff --git a/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/ondemanddebug.jpg b/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/ondemanddebug.jpg new file mode 100644 index 000000000..3d787b825 Binary files /dev/null and b/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/ondemanddebug.jpg differ diff --git a/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/ondemanddebug.png b/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/ondemanddebug.png deleted file mode 100644 index 6772c3701..000000000 Binary files a/content/posts/2023/10/16/level-up-your-java-debugging-skills-with-on-demand-debugging/ondemanddebug.png and /dev/null differ diff --git a/content/posts/2023/10/17/the-files-in-jdk-21/index.md b/content/posts/2023/10/17/the-files-in-jdk-21/index.md index 7cfff4950..07976c468 100644 --- a/content/posts/2023/10/17/the-files-in-jdk-21/index.md +++ b/content/posts/2023/10/17/the-files-in-jdk-21/index.md @@ -32,7 +32,7 @@ For this article, Eclipse Temurin [JDK 21](https://foojay.io/today/java-21-is-av * Number of class files: 27,929 (was 27,064 in JDK 20) * Number of Java files (in src.zip): 15,404 (was 15,044 in JDK 20) -![](jdk21-all-files.png) +![](jdk21-all-files.jpg) ### Modules @@ -65,7 +65,7 @@ Most of the largest class files are related to the internationalization with cha Contrary to what I said in the introduction, even if the JDK has grown size since 1.0, this hasn't been the case in the recent years. Post JDK 8, the largest JDK was JDK 9 (JavaFX, Nashorn) with 500 MB and the smallest was JDK 17 with 297 MB. When comparing new files in the *java.base* module with JDK 20, you see that a lot of new files are related to a new *jdk.internal.classfile* package. -![](jdk-21-diff-base-1024x649.png) +![](jdk-21-diff-base-1024x649.jpg) ## Conclusion diff --git a/content/posts/2023/10/17/the-files-in-jdk-21/jdk-21-diff-base-1024x649.jpg b/content/posts/2023/10/17/the-files-in-jdk-21/jdk-21-diff-base-1024x649.jpg new file mode 100644 index 000000000..1cdd76c1f Binary files /dev/null and b/content/posts/2023/10/17/the-files-in-jdk-21/jdk-21-diff-base-1024x649.jpg differ diff --git a/content/posts/2023/10/17/the-files-in-jdk-21/jdk-21-diff-base-1024x649.png b/content/posts/2023/10/17/the-files-in-jdk-21/jdk-21-diff-base-1024x649.png deleted file mode 100644 index fc66dd787..000000000 Binary files a/content/posts/2023/10/17/the-files-in-jdk-21/jdk-21-diff-base-1024x649.png and /dev/null differ diff --git a/content/posts/2023/10/17/the-files-in-jdk-21/jdk21-all-files.jpg b/content/posts/2023/10/17/the-files-in-jdk-21/jdk21-all-files.jpg new file mode 100644 index 000000000..ff0025a63 Binary files /dev/null and b/content/posts/2023/10/17/the-files-in-jdk-21/jdk21-all-files.jpg differ diff --git a/content/posts/2023/10/17/the-files-in-jdk-21/jdk21-all-files.png b/content/posts/2023/10/17/the-files-in-jdk-21/jdk21-all-files.png deleted file mode 100644 index d89700fca..000000000 Binary files a/content/posts/2023/10/17/the-files-in-jdk-21/jdk21-all-files.png and /dev/null differ diff --git a/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/0_rHXaD5-qSgbzCx6m-1024x811.jpg b/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/0_rHXaD5-qSgbzCx6m-1024x811.jpg new file mode 100644 index 000000000..3776a6f34 Binary files /dev/null and b/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/0_rHXaD5-qSgbzCx6m-1024x811.jpg differ diff --git a/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/0_rHXaD5-qSgbzCx6m-1024x811.png b/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/0_rHXaD5-qSgbzCx6m-1024x811.png deleted file mode 100644 index 56de8eb14..000000000 Binary files a/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/0_rHXaD5-qSgbzCx6m-1024x811.png and /dev/null differ diff --git a/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/1_G1pamm4hBqnJwPshTp-N_A-1024x638.jpg b/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/1_G1pamm4hBqnJwPshTp-N_A-1024x638.jpg new file mode 100644 index 000000000..58bd7031a Binary files /dev/null and b/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/1_G1pamm4hBqnJwPshTp-N_A-1024x638.jpg differ diff --git a/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/1_G1pamm4hBqnJwPshTp-N_A-1024x638.png b/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/1_G1pamm4hBqnJwPshTp-N_A-1024x638.png deleted file mode 100644 index 7523c9a4e..000000000 Binary files a/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/1_G1pamm4hBqnJwPshTp-N_A-1024x638.png and /dev/null differ diff --git a/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/index.md b/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/index.md index 1a03ef695..58e24bd38 100644 --- a/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/index.md +++ b/content/posts/2023/10/18/beyond-pass-fail-a-modern-approach-to-java-integration-testing/index.md @@ -43,7 +43,7 @@ Unfortunately, over-investing in unit tests has its downturns. I have seen huge, The fact that it was easy to produce so many unit tests turned out to be a two-edged sword. The tests often induced a 'false sense of confidence' that did not take into account the many biases that these tests fall into. Each test would look at a very narrow scope and validate only one happy path in a complex distributed system. A developer, reviewing thousands of green tests in the build would assume that his code change is well tested, often being surprised when real-world issues started occurring soon after merging the code. -{{< img src="0_rHXaD5-qSgbzCx6m-1024x811.png" class="aligncenter size-large is-resized" width="677" height="536" style="width:677px;height:536px" caption="source: https://turnoff.us/geek/software-test/" >}} +{{< img src="0_rHXaD5-qSgbzCx6m-1024x811.jpg" class="aligncenter size-large is-resized" width="677" height="536" style="width:677px;height:536px" caption="source: https://turnoff.us/geek/software-test/" >}} To complicate matters, in some programming languages, injecting dependencies to allow mocking at every level, as unit tests require, entails complex changes, which do not necessarily lead to better design. The practice of 'refactoring for better testability', once vaunted as advantageous in producing less closely coupled components, soon became an obstacle as the cost of that abstraction became clear. Modern dev practices often favor simplicity over multi-layered modular designs and unit tests unfortunately strictly require the latter. @@ -167,7 +167,7 @@ One of the tragedies of integration tests is that they produce a wealth of usefu Thankfully, this too is an area where the technology landscape is different today. [OpenTelemetry](https://opentelemetry.io/docs/instrumentation/java/automatic/) has made it easy to collect data produced by testing, even without making any code changes. To make that raw data into something more practical that we can use to assess our code changes, we can use tools that can digest and analyze that data. One such project that I am personally involved in is [Digma](https://digma.ai/), a free tool for developers, which focuses on analyzing the code by studying this type of observability data. It is a simple IDE plugin that runs locally on your machine and completely abstracts the logistics around OTEL and collecting and analyzing metrics and traces. We can set Digma up by installing it into the IDE via the [plugin marketplace](https://plugins.jetbrains.com/plugin/19470-digma-continuous-feedback): -![](1_G1pamm4hBqnJwPshTp-N_A-1024x638.png) +![](1_G1pamm4hBqnJwPshTp-N_A-1024x638.jpg) #### Trace-based testing, continuously diff --git a/content/posts/2023/10/20/not-a-single-trace/7u8t3xrcqant5csbca8q-343078b1.png b/content/posts/2023/10/20/not-a-single-trace/7u8t3xrcqant5csbca8q-343078b1.png new file mode 100644 index 000000000..6846400a9 Binary files /dev/null and b/content/posts/2023/10/20/not-a-single-trace/7u8t3xrcqant5csbca8q-343078b1.png differ diff --git a/content/posts/2023/10/20/not-a-single-trace/asos6n5teuwhx95u4r3a-9a1cc70a.jpg b/content/posts/2023/10/20/not-a-single-trace/asos6n5teuwhx95u4r3a-9a1cc70a.jpg new file mode 100644 index 000000000..c23b0f99d Binary files /dev/null and b/content/posts/2023/10/20/not-a-single-trace/asos6n5teuwhx95u4r3a-9a1cc70a.jpg differ diff --git a/content/posts/2023/10/20/not-a-single-trace/index.md b/content/posts/2023/10/20/not-a-single-trace/index.md index 889d3eab9..6d20c01cb 100644 --- a/content/posts/2023/10/20/not-a-single-trace/index.md +++ b/content/posts/2023/10/20/not-a-single-trace/index.md @@ -59,11 +59,11 @@ I wrote about this extensively in a previous post about the [Tong motion needed Observability is somewhat resistant to examples, everything I try to come up with feels a bit synthetic and unrealistic when I examine it after the fact. Having said that, I looked at my modified version of the venerable Spring Pet Clinic demo using [digma.ai](http://digma.ai). Running it showed several interesting concepts taken by Digma. -![Digma](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7u8t3xrcqant5csbca8q.png) +![Digma](7u8t3xrcqant5csbca8q-343078b1.png) Probably the most interesting feature is the ability to look at what's going on in the server at this moment. This is an amazing exploratory tool that provides a holistic view for a moment in-time. But the thing I want to focus on is the "Insights" column on the right. Digma tries to combine the separate traces into a coherent narrative. It's not bad at it but it's still a machine, some of that value should probably still be done manually since it can't understand the why, only the what. It seems it can detect the venerable Spring [N+1 problem](https://digma.ai/blog/n1-query-problem-and-how-to-detect-it/) seamlessly. -![Digma Trace View](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/asos6n5teuwhx95u4r3a.png) +![Digma Trace View](asos6n5teuwhx95u4r3a-9a1cc70a.jpg) But this is only the start. One of my favorite things is the ability to look at tracing data next to a histogram and list of errors in a single view. Is performance impacted because there are errors? diff --git a/content/posts/2023/10/21/domain-deadline-dog-driven-development/dogdriven.jpg b/content/posts/2023/10/21/domain-deadline-dog-driven-development/dogdriven.jpg new file mode 100644 index 000000000..bd56ba6b0 Binary files /dev/null and b/content/posts/2023/10/21/domain-deadline-dog-driven-development/dogdriven.jpg differ diff --git a/content/posts/2023/10/21/domain-deadline-dog-driven-development/dogdriven.png b/content/posts/2023/10/21/domain-deadline-dog-driven-development/dogdriven.png deleted file mode 100644 index 153e4bdab..000000000 Binary files a/content/posts/2023/10/21/domain-deadline-dog-driven-development/dogdriven.png and /dev/null differ diff --git a/content/posts/2023/10/21/domain-deadline-dog-driven-development/index.md b/content/posts/2023/10/21/domain-deadline-dog-driven-development/index.md index b263ba514..ad02a2d01 100644 --- a/content/posts/2023/10/21/domain-deadline-dog-driven-development/index.md +++ b/content/posts/2023/10/21/domain-deadline-dog-driven-development/index.md @@ -6,7 +6,7 @@ description: "Many Something-Driven Developments are available nowadays! Which a canonical: "https://webtechie.be/post/2023-07-25-domain-deadline-dog-driven-development/" authors: - "frankdelporte" -image: "dogdriven.png" +image: "dogdriven.jpg" categories: - "Opinion" related_posts: diff --git a/content/posts/2023/10/22/book-review-developing-apps-with-gpt-4-and-chatgpt/index.md b/content/posts/2023/10/22/book-review-developing-apps-with-gpt-4-and-chatgpt/index.md index 5cf05a4d6..0f36af7f0 100644 --- a/content/posts/2023/10/22/book-review-developing-apps-with-gpt-4-and-chatgpt/index.md +++ b/content/posts/2023/10/22/book-review-developing-apps-with-gpt-4-and-chatgpt/index.md @@ -24,7 +24,7 @@ Now, given the rapid shift in this field, a lot of us are left with a lot of que That's where this useful book by [Olivier Caelen](https://www.linkedin.com/in/oliviercaelen) and [Marie-Alice Blete](https://www.linkedin.com/in/mblete) comes in particularly handy. It offers us some interesting insights into the various models, and how to make use of these using the ChatGPT Python library. -{{< img src="https://m.media-amazon.com/images/I/910nFKaAHeL._SL1500_.jpg" class="aligncenter is-resized" style="width:320px;height:420px" >}} +{{< img src="910nFKaAHeL._SL1500_.jpg" class="aligncenter is-resized" style="width:320px;height:420px" >}} **price** : €59.99 for the eBook **publication date** : September 2023 diff --git a/content/posts/2023/10/23/resizing-images-on-the-fly/index.md b/content/posts/2023/10/23/resizing-images-on-the-fly/index.md index 28f75f255..83230b21f 100644 --- a/content/posts/2023/10/23/resizing-images-on-the-fly/index.md +++ b/content/posts/2023/10/23/resizing-images-on-the-fly/index.md @@ -155,7 +155,7 @@ services: 1. Simple web server hosting the HTML and the main image -We can now test the above setup with the browser's Developer Tools, emulating small screen devices, *i.e.* , iPhone SE. The result is the following: [![](test-set-up-result.png)](test-set-up-result.png) +We can now test the above setup with the browser's Developer Tools, emulating small screen devices, *i.e.* , iPhone SE. The result is the following: [![](test-set-up-result.jpg)](test-set-up-result.jpg) * Because of the screen resolution, the image requested is the 400px width, not the original one. You can see it in the request's URL * The returned image is in WebP format; its weight is 14.4kb diff --git a/content/posts/2023/10/23/resizing-images-on-the-fly/test-set-up-result.jpg b/content/posts/2023/10/23/resizing-images-on-the-fly/test-set-up-result.jpg new file mode 100644 index 000000000..372f6f9fa Binary files /dev/null and b/content/posts/2023/10/23/resizing-images-on-the-fly/test-set-up-result.jpg differ diff --git a/content/posts/2023/10/23/resizing-images-on-the-fly/test-set-up-result.png b/content/posts/2023/10/23/resizing-images-on-the-fly/test-set-up-result.png deleted file mode 100644 index 0e59830b4..000000000 Binary files a/content/posts/2023/10/23/resizing-images-on-the-fly/test-set-up-result.png and /dev/null differ diff --git a/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/F7trXMkWEAAtsf0-c4f138da.jpg b/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/F7trXMkWEAAtsf0-c4f138da.jpg new file mode 100644 index 000000000..511fab16a Binary files /dev/null and b/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/F7trXMkWEAAtsf0-c4f138da.jpg differ diff --git a/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/image-2.jpg b/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/image-2.jpg new file mode 100644 index 000000000..5b6d8b6df Binary files /dev/null and b/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/image-2.jpg differ diff --git a/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/image-2.png b/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/image-2.png deleted file mode 100644 index c46c5186a..000000000 Binary files a/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/image-2.png and /dev/null differ diff --git a/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/image-png-Oct-12-2023-03-49-00-8874-PM-db998b5b.jpg b/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/image-png-Oct-12-2023-03-49-00-8874-PM-db998b5b.jpg new file mode 100644 index 000000000..ed85c16f6 Binary files /dev/null and b/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/image-png-Oct-12-2023-03-49-00-8874-PM-db998b5b.jpg differ diff --git a/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/index.md b/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/index.md index 4b49d702a..470564709 100644 --- a/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/index.md +++ b/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/index.md @@ -17,17 +17,17 @@ frozen: false --- [Devoxx Belgium 2023](https://devoxx.be/), the premier Java developer conference, held in Antwerp, Belgium is an event we eagerly anticipate. As representatives of Payara, a sponsor of the conference, we had the privilege of attending this year's gathering, which took place at the iconic Kinepolis Antwerpen Cinema. -![](https://blog.payara.fish/hubfs/image-png-Oct-12-2023-03-49-00-8874-PM.png) +![](image-png-Oct-12-2023-03-49-00-8874-PM-db998b5b.jpg) The conference ran seamlessly, reflecting the organizers' dedication to creating a productive environment for learning, networking, and fostering our shared enthusiasm for technology. We were thrilled to participate in an event that was such a focal point for Java developers. ![](https://blog.payara.fish/hs-fs/hubfs/image-png-Oct-12-2023-03-55-38-8960-PM.png?width=327&height=347&name=image-png-Oct-12-2023-03-55-38-8960-PM.png) Our booth was a hub of activity throughout the conference, attracting engaged attendees interested in exploring Payara's contributions to the Java and Jakarta EE development landscape. The reception we received highlighted the active and vibrant Java community at Devoxx Belgium. -Attendees were very interested to learn more about Payara Server and Payara Micro. But [Payara Cloud](https://www.payara.fish/products/payara-cloud/) definitely stole the show for us this time, attendees were very interested to see the innovations we were bringing to Jakarta EE.![](https://blog.payara.fish/hubfs/undefined.jpeg) +Attendees were very interested to learn more about Payara Server and Payara Micro. But [Payara Cloud](https://www.payara.fish/products/payara-cloud/) definitely stole the show for us this time, attendees were very interested to see the innovations we were bringing to Jakarta EE.![](undefined-fefc31f6.jpeg) Meeting James Gosling, a true luminary in the Java world, was a memorable experience. Conversations with him were enlightening, offering insight into Java's rich history and its evolution. His presence added a touch of history to the event, and we felt honoured to share the same space with him. -![](image-2.png) +![](image-2.jpg) Patrik's well-attended talk, "Elementary Full-stack Development with Hypermedia and Java 21," was a key highlight. It provided an opportunity to showcase the capabilities of Java 21 and left the audience inspired to explore the future of Java development. [You can watch the talk on YouTube here](https://youtube.com/watch?v=Ldi1hYQCfFY%3Flist%3DPLRsbF2sD7JVoylItQFt2RKpLsYasx1c3F). @@ -40,4 +40,4 @@ Antwerp's architectural beauty and historical significance provided a fascinatin In conclusion, Devoxx Belgium 2023 was a success. It underlined the commitment and passion of the Java community and celebrated its thriving ecosystem. The well-organized event, valuable connections, and enlightening discussions made our participation truly worthwhile. Our presence at Kinepolis Antwerpen Cinema underscored Payara's dedication to the Java Community. Devoxx Belgium 2023 left us with enriched knowledge, new acquaintances, and a refreshed enthusiasm for Java. As we look ahead, we are excited to see the path technology, the community, and Payara will take. Until next time, Devoxx! -![Image](https://pbs.twimg.com/media/F7trXMkWEAAtsf0?format=jpg&name=small) +![Image](F7trXMkWEAAtsf0-c4f138da.jpg) diff --git a/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/undefined-fefc31f6.jpeg b/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/undefined-fefc31f6.jpeg new file mode 100644 index 000000000..8d1c7fbaf Binary files /dev/null and b/content/posts/2023/10/24/payara-makes-a-splash-at-devoxx-belgium-2023/undefined-fefc31f6.jpeg differ diff --git a/content/posts/2023/10/25/java-21-jep-445-unnamed-classes-and-instance-main-methods/index.md b/content/posts/2023/10/25/java-21-jep-445-unnamed-classes-and-instance-main-methods/index.md index 2893102d5..5e2abb8b3 100644 --- a/content/posts/2023/10/25/java-21-jep-445-unnamed-classes-and-instance-main-methods/index.md +++ b/content/posts/2023/10/25/java-21-jep-445-unnamed-classes-and-instance-main-methods/index.md @@ -34,7 +34,7 @@ It's ideal for students or anyone who wants to start experimenting with Java. It The video above and this post are inspired by [a post by Tom Cools](https://www.tomcools.be/post/april-2023-onboarding-now/), and to be honest, I stole a bit of his approach as I first want to show you the older [JEP 330: "Launch Single-File Source-Code Programs"](https://openjdk.org/jeps/330). Thanks to this feature, introduced in Java 11 you can already execute a single Java-file without the need to compile the code to byte code with `javac` as visiualized in this diagram: -![](jep330.png) +![](jep330.jpg) With the changes brought by JEP 330, the conversion from Java code to byte code, is "hidden". It still happens, but you, as a user, don't need to take care of it. diff --git a/content/posts/2023/10/25/java-21-jep-445-unnamed-classes-and-instance-main-methods/jep330.jpg b/content/posts/2023/10/25/java-21-jep-445-unnamed-classes-and-instance-main-methods/jep330.jpg new file mode 100644 index 000000000..dd119a72b Binary files /dev/null and b/content/posts/2023/10/25/java-21-jep-445-unnamed-classes-and-instance-main-methods/jep330.jpg differ diff --git a/content/posts/2023/10/25/java-21-jep-445-unnamed-classes-and-instance-main-methods/jep330.png b/content/posts/2023/10/25/java-21-jep-445-unnamed-classes-and-instance-main-methods/jep330.png deleted file mode 100644 index 955a6af33..000000000 Binary files a/content/posts/2023/10/25/java-21-jep-445-unnamed-classes-and-instance-main-methods/jep330.png and /dev/null differ diff --git a/content/posts/2023/10/25/navigating-behaviour-with-events/Screenshot-2023-10-17-at-4.04.33-PM.jpg b/content/posts/2023/10/25/navigating-behaviour-with-events/Screenshot-2023-10-17-at-4.04.33-PM.jpg new file mode 100644 index 000000000..63411cb9c Binary files /dev/null and b/content/posts/2023/10/25/navigating-behaviour-with-events/Screenshot-2023-10-17-at-4.04.33-PM.jpg differ diff --git a/content/posts/2023/10/25/navigating-behaviour-with-events/Screenshot-2023-10-17-at-4.04.33-PM.png b/content/posts/2023/10/25/navigating-behaviour-with-events/Screenshot-2023-10-17-at-4.04.33-PM.png deleted file mode 100644 index b20809e2a..000000000 Binary files a/content/posts/2023/10/25/navigating-behaviour-with-events/Screenshot-2023-10-17-at-4.04.33-PM.png and /dev/null differ diff --git a/content/posts/2023/10/25/navigating-behaviour-with-events/index.md b/content/posts/2023/10/25/navigating-behaviour-with-events/index.md index 58e288038..fe8e9a415 100644 --- a/content/posts/2023/10/25/navigating-behaviour-with-events/index.md +++ b/content/posts/2023/10/25/navigating-behaviour-with-events/index.md @@ -5,7 +5,7 @@ lastmod: "2024-01-09T12:58:51+00:00" description: "The practices of Event-Driven Architecture and Behaviour-Driven Development have more in common than may at first be apparent." authors: - "george-ball" -image: "Screenshot-2023-10-17-at-4.04.33-PM.png" +image: "Screenshot-2023-10-17-at-4.04.33-PM.jpg" categories: - "Java" - "Java Core" diff --git a/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/F7hNsheWUAA0Y46-2000x1500-25a1d10f.jpg b/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/F7hNsheWUAA0Y46-2000x1500-25a1d10f.jpg new file mode 100644 index 000000000..df4050894 Binary files /dev/null and b/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/F7hNsheWUAA0Y46-2000x1500-25a1d10f.jpg differ diff --git a/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/Screenshot-2023-10-11-at-13.00.17-2000x1-5295a20f.jpg b/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/Screenshot-2023-10-11-at-13.00.17-2000x1-5295a20f.jpg new file mode 100644 index 000000000..29315cfe4 Binary files /dev/null and b/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/Screenshot-2023-10-11-at-13.00.17-2000x1-5295a20f.jpg differ diff --git a/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/image-3-1b809dff.jpg b/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/image-3-1b809dff.jpg new file mode 100644 index 000000000..1de7b02fe Binary files /dev/null and b/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/image-3-1b809dff.jpg differ diff --git a/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/index.md b/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/index.md index 7b1ba0e81..254886b95 100644 --- a/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/index.md +++ b/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/index.md @@ -20,10 +20,10 @@ frozen: false **In my previous Java-related blog post called [Level-up your Java Debugging Skills with on-demand Debugging](https://foojay.io/today/level-up-your-java-debugging-skills-with-on-demand-debugging/), I showed you how to use the `onthrow` option of the JDWP agent to start the debugging session on the first throw of a specific exception.** This gave us a mysterious error in JDB: -![](https://mostlynerdless.de/wp-content/uploads/2023/10/image-3.png) +![](image-3-1b809dff.jpg) And I asked if somebody had any ideas. No one had, but I was at Devoxx Belgium and happened to talk with [Aleksey Shipilev](https://shipilev.net/) about it at the Corretto booth: -![](https://mostlynerdless.de/wp-content/uploads/2023/10/F7hNsheWUAA0Y46-2000x1500.jpg) Two OpenJDK developers having fun at Devoxx: Investigating a jdb bug with Shipilev +![](F7hNsheWUAA0Y46-2000x1500-25a1d10f.jpg) Two OpenJDK developers having fun at Devoxx: Investigating a jdb bug with Shipilev in the Coretto booth ([Tweet](https://twitter.com/parttimen3rd/status/1709201492115095904)) We got a rough idea of what was happening, and now that I'm back from Devoxx, I have the time to investigate it properly. But to recap: How can you use the `onthrow` option and reproduce the bug? @@ -149,7 +149,7 @@ void JNICALL Exception( > [JVMTI Documentation](https://docs.oracle.com/en/java/javase/17/docs/specs/jvmti.html#Exception) On every exception, this handler [checks](https://github.com/openjdk/jdk/blob/ad7a8e86e0334390f87ae44cf749d2b47f1409a1/src/jdk.jdwp.agent/share/native/libjdwp/debugInit.c#L469) if the exception has the name passed to the `onthrow` option. If the exception matches, then the agent initializes the debugging session: -![](https://mostlynerdless.de/wp-content/uploads/2023/10/onthrow-2000x1085.png) +![](onthrow-2000x1085-35597a3a.jpg) The only problem here is that `cbEarlyException` is passed all the exception information but doesn't pass it to the `initialize` method. This causes the JDWP-agent to send out an Exception event with all fields being `null`, as you saw in the previous section. @@ -202,7 +202,7 @@ main[1] ``` But does fixing this issue also mean that IDEs like IntelliJ IDEA now support attaching to agents with `onthrow` enabled? Yes, at least if we set a breakpoint somewhere after the first exception has been thrown (like with the `onjcmd` option): -![](https://mostlynerdless.de/wp-content/uploads/2023/10/Screenshot-2023-10-11-at-13.00.17-2000x1111.png) +![](Screenshot-2023-10-11-at-13.00.17-2000x1-5295a20f.jpg) ## Conclusion diff --git a/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/onthrow-2000x1085-35597a3a.jpg b/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/onthrow-2000x1085-35597a3a.jpg new file mode 100644 index 000000000..6adbd3e22 Binary files /dev/null and b/content/posts/2023/10/26/jdwp-onthrow-and-a-mysterious-error/onthrow-2000x1085-35597a3a.jpg differ diff --git a/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/build-server-gradle.jpg b/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/build-server-gradle.jpg new file mode 100644 index 000000000..f131efa32 Binary files /dev/null and b/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/build-server-gradle.jpg differ diff --git a/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/build-server-gradle.png b/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/build-server-gradle.png deleted file mode 100644 index fbaf088af..000000000 Binary files a/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/build-server-gradle.png and /dev/null differ diff --git a/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/buildserver-00803d1c.jpg b/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/buildserver-00803d1c.jpg new file mode 100644 index 000000000..94f40c7f5 Binary files /dev/null and b/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/buildserver-00803d1c.jpg differ diff --git a/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/gradle-d63d0fa1.jpg b/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/gradle-d63d0fa1.jpg new file mode 100644 index 000000000..778837d7d Binary files /dev/null and b/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/gradle-d63d0fa1.jpg differ diff --git a/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/index.md b/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/index.md index afdfe0a63..34f42b185 100644 --- a/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/index.md +++ b/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/index.md @@ -5,7 +5,7 @@ lastmod: "2023-11-01T08:04:30+00:00" description: "Microsoft and Gradle Enterprise have joined forces to explore a novel approach to Gradle project import and building, based on the Build Server Protocol (BSP)." authors: - "nick-zhu" -image: "build-server-gradle.png" +image: "build-server-gradle.jpg" categories: - "Gradle" - "Tools" @@ -50,11 +50,11 @@ If you want to explore the new Gradle project development experience based on th #### Step 1 -- Install the "Extension Pack for Java" extension. -[![Image javaext](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/09/javaext.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/09/javaext.png) +[![Image javaext](javaext-280d47cf.png)](javaext-280d47cf.png) #### Step 2 -- Install the "Gradle for Java" extension. -[![Gradle extension pack](https://devblogs.microsoft.com/java-ch/wp-content/uploads/sites/59/2023/09/gradle.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/09/gradle.png) +[![Gradle extension pack](gradle-d63d0fa1.jpg)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/09/gradle.png) #### Step 3 -- Open your Gradle project in VS Code. If the project has been opened in VS Code before, open the command palette (F1) and execute the command "Java: Clean Java Language Server Workspace \> Reload and delete." @@ -62,7 +62,7 @@ If you want to explore the new Gradle project development experience based on th #### Step 4 -- Checking Gradle Build Server Status Output -[![Image buildserver](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/09/buildserver.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/09/buildserver.png) +[![Image buildserver](buildserver-00803d1c.jpg)](buildserver-00803d1c.jpg) > If you encounter any issues during your trial or have any suggestions, please feel free to let us know by [creating a GitHub Issue](https://github.com/microsoft/vscode-gradle/issues). ### Future Plans @@ -75,11 +75,11 @@ This way, even if users have customized complex build processes for testing or r To use all features mentioned above, please download and install [Extension Pack for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) on Visual Studio Code. -[![Extension pack for Java](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png) +[![Extension pack for Java](javapack-892c0338.png)](javapack-892c0338.png) If you are a Spring developer working on a Spring Boot application, you can also download the [Spring Boot Extension Pack](https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-boot-dev-pack) for specialized Spring experience. -[![Spring boot extension pack](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png) +[![Spring boot extension pack](spring-ac42cb4c.png)](spring-ac42cb4c.png) ### Feedback and suggestions diff --git a/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/javaext-280d47cf.png b/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/javaext-280d47cf.png new file mode 100644 index 000000000..0fd0e0b34 Binary files /dev/null and b/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/javaext-280d47cf.png differ diff --git a/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/javapack-892c0338.png b/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/javapack-892c0338.png new file mode 100644 index 000000000..c05f90e30 Binary files /dev/null and b/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/javapack-892c0338.png differ diff --git a/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/spring-ac42cb4c.png b/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/spring-ac42cb4c.png new file mode 100644 index 000000000..c3d38f0a6 Binary files /dev/null and b/content/posts/2023/10/30/elevating-java-development-in-visual-studio-code-experience-the-new-build-server-for-gradle/spring-ac42cb4c.png differ diff --git a/content/posts/2023/10/31/javafx-links-of-october-2023/index.md b/content/posts/2023/10/31/javafx-links-of-october-2023/index.md index dc43534b2..239949d41 100644 --- a/content/posts/2023/10/31/javafx-links-of-october-2023/index.md +++ b/content/posts/2023/10/31/javafx-links-of-october-2023/index.md @@ -6,7 +6,7 @@ description: "Have fun with this overview of the \"JavaFX LinksOfTheWeek\" that canonical: "https://webtechie.be/post/2023-10-27-javafx-links-of-october-2023/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2023/10/31/javafx-links-of-october-2023/jfxcentral.jpg b/content/posts/2023/10/31/javafx-links-of-october-2023/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2023/10/31/javafx-links-of-october-2023/jfxcentral.jpg differ diff --git a/content/posts/2023/10/31/javafx-links-of-october-2023/jfxcentral.png b/content/posts/2023/10/31/javafx-links-of-october-2023/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2023/10/31/javafx-links-of-october-2023/jfxcentral.png and /dev/null differ diff --git a/content/posts/2023/11/01/glassfish-embedded-a-simple-way-to-run-jakarta-ee-apps/GlassFish-embedded-6db74999.jpg b/content/posts/2023/11/01/glassfish-embedded-a-simple-way-to-run-jakarta-ee-apps/GlassFish-embedded-6db74999.jpg new file mode 100644 index 000000000..e1a85a350 Binary files /dev/null and b/content/posts/2023/11/01/glassfish-embedded-a-simple-way-to-run-jakarta-ee-apps/GlassFish-embedded-6db74999.jpg differ diff --git a/content/posts/2023/11/01/glassfish-embedded-a-simple-way-to-run-jakarta-ee-apps/index.md b/content/posts/2023/11/01/glassfish-embedded-a-simple-way-to-run-jakarta-ee-apps/index.md index c221fb929..ef650fdf0 100644 --- a/content/posts/2023/11/01/glassfish-embedded-a-simple-way-to-run-jakarta-ee-apps/index.md +++ b/content/posts/2023/11/01/glassfish-embedded-a-simple-way-to-run-jakarta-ee-apps/index.md @@ -24,7 +24,7 @@ I've been asked by the Eclipse GlassFish project to say a few words about how I I started using GlassFish while GlassFish was in Oracle's hands as a reference implementation of Java EE. Some time ago, there were suggestions that GlassFish was not being actively maintained. Since Oracle's donation of GlassFish to the Eclipse Foundation, with support from the Foundation's GlassFish team, and the OmniFish team (that also provides commercial support), the GlassFish project is very active and the community around it is certainly present and responsive. That's one more reason for me to continue using GlassFish in the future. -{{< img src="https://omnifish.ee/wp-content/uploads/2023/09/GlassFish-embedded.png" class="aligncenter size-full is-resized" width="264" height="135" style="width:264px;height:135px" >}} +{{< img src="GlassFish-embedded-6db74999.jpg" class="aligncenter size-full is-resized" width="264" height="135" style="width:264px;height:135px" >}} ## Overview of the APILoader Project diff --git a/content/posts/2023/11/02/putting-jfr-into-context/Screenshot-2023-10-19-at-12.28.35-2000x1-27c5707b.jpg b/content/posts/2023/11/02/putting-jfr-into-context/Screenshot-2023-10-19-at-12.28.35-2000x1-27c5707b.jpg new file mode 100644 index 000000000..e1ffe8b81 Binary files /dev/null and b/content/posts/2023/11/02/putting-jfr-into-context/Screenshot-2023-10-19-at-12.28.35-2000x1-27c5707b.jpg differ diff --git a/content/posts/2023/11/02/putting-jfr-into-context/index.md b/content/posts/2023/11/02/putting-jfr-into-context/index.md index 19343da04..951d08f1e 100644 --- a/content/posts/2023/11/02/putting-jfr-into-context/index.md +++ b/content/posts/2023/11/02/putting-jfr-into-context/index.md @@ -174,7 +174,7 @@ This prints a list of events like: ``` You can find more information on this and other events in my [JFR Event Collection](https://sap.github.io/SapMachine/jfrevents): -[![](https://mostlynerdless.de/wp-content/uploads/2023/10/Screenshot-2023-10-19-at-12.28.35-2000x1509.png)](https://sap.github.io/SapMachine/jfrevents/#fileread) +[![](Screenshot-2023-10-19-at-12.28.35-2000x1-27c5707b.jpg)](https://sap.github.io/SapMachine/jfrevents/#fileread) There are, of course, other events, but in our file server example, we're only interested in file events for now (this might change as Jaroslav adds more features to his fork). diff --git a/content/posts/2023/11/06/generative-ai-and-java-hype-or-urgent-reality/image1-700x272.jpg b/content/posts/2023/11/06/generative-ai-and-java-hype-or-urgent-reality/image1-700x272.jpg new file mode 100644 index 000000000..75f9f2e6c Binary files /dev/null and b/content/posts/2023/11/06/generative-ai-and-java-hype-or-urgent-reality/image1-700x272.jpg differ diff --git a/content/posts/2023/11/06/generative-ai-and-java-hype-or-urgent-reality/image1-700x272.png b/content/posts/2023/11/06/generative-ai-and-java-hype-or-urgent-reality/image1-700x272.png deleted file mode 100644 index 629c21872..000000000 Binary files a/content/posts/2023/11/06/generative-ai-and-java-hype-or-urgent-reality/image1-700x272.png and /dev/null differ diff --git a/content/posts/2023/11/06/generative-ai-and-java-hype-or-urgent-reality/index.md b/content/posts/2023/11/06/generative-ai-and-java-hype-or-urgent-reality/index.md index 488445589..b7eef968c 100644 --- a/content/posts/2023/11/06/generative-ai-and-java-hype-or-urgent-reality/index.md +++ b/content/posts/2023/11/06/generative-ai-and-java-hype-or-urgent-reality/index.md @@ -20,7 +20,7 @@ related_posts: frozen: false --- -![](image1-700x272.png) +![](image1-700x272.jpg) It's hard to grasp that it's been about a year since Chat GPT and other generative AI tools burst onto the scene. We're all still grappling with, well, everything about them. Whatever equilibrium we eventually find, it's clear that the world is changing. The whole world mind, not just the IT industry. diff --git a/content/posts/2023/11/07/how-to-find-dead-code-in-your-java-services/0-neVQTAom_1QPLD6V-297c1968.png b/content/posts/2023/11/07/how-to-find-dead-code-in-your-java-services/0-neVQTAom_1QPLD6V-297c1968.png new file mode 100644 index 000000000..ad6afed70 Binary files /dev/null and b/content/posts/2023/11/07/how-to-find-dead-code-in-your-java-services/0-neVQTAom_1QPLD6V-297c1968.png differ diff --git a/content/posts/2023/11/07/how-to-find-dead-code-in-your-java-services/0-qYvVZekF-qruyoxt-98ddb8af.png b/content/posts/2023/11/07/how-to-find-dead-code-in-your-java-services/0-qYvVZekF-qruyoxt-98ddb8af.png new file mode 100644 index 000000000..ab10e0a51 Binary files /dev/null and b/content/posts/2023/11/07/how-to-find-dead-code-in-your-java-services/0-qYvVZekF-qruyoxt-98ddb8af.png differ diff --git a/content/posts/2023/11/07/how-to-find-dead-code-in-your-java-services/0-sWaFg5jfWYPtTZct-067d8205.png b/content/posts/2023/11/07/how-to-find-dead-code-in-your-java-services/0-sWaFg5jfWYPtTZct-067d8205.png new file mode 100644 index 000000000..9808ca7fa Binary files /dev/null and b/content/posts/2023/11/07/how-to-find-dead-code-in-your-java-services/0-sWaFg5jfWYPtTZct-067d8205.png differ diff --git a/content/posts/2023/11/07/how-to-find-dead-code-in-your-java-services/index.md b/content/posts/2023/11/07/how-to-find-dead-code-in-your-java-services/index.md index b4a99ff32..5a7d4c03f 100644 --- a/content/posts/2023/11/07/how-to-find-dead-code-in-your-java-services/index.md +++ b/content/posts/2023/11/07/how-to-find-dead-code-in-your-java-services/index.md @@ -146,12 +146,12 @@ Source: [Gist on GitHub](https://gist.github.com/Badbond/0777680409ce28349c79241 Now that we have generated a report, we can inspect the generated `report/index.html` and look for coverage on some suspected legacy code. We are looking for red lines, which means the code is not covered. Let's dive into some examples. -{{< img src="https://miro.medium.com/v2/resize:fit:473/0*qYvVZekF-qruyoxt" class="is-resized" width="546" height="125" style="width:546px;height:125px" caption="A service method marked for deletion which has not been executed." >}} +{{< img src="0-qYvVZekF-qruyoxt-98ddb8af.png" class="is-resized" width="546" height="125" style="width:546px;height:125px" caption="A service method marked for deletion which has not been executed." >}} This bit of legacy code has been around for a few years already and has been marked as deprecated for a few months already. When searching for usages of this method across organization repositories, we find that it is indeed unused apart from tests! Time to drop it and leave our codebase cleaner. The planned migration for this service may have become easier now too, given that we have less functionality to take into account. It's time to have our developers revisit that migration. -![](https://miro.medium.com/v2/resize:fit:700/0*sWaFg5jfWYPtTZct) Part of a deserializer with support for legacy ArticleDeliveryIssue instances, still being dependent upon. +![](0-sWaFg5jfWYPtTZct-067d8205.png) Part of a deserializer with support for legacy ArticleDeliveryIssue instances, still being dependent upon. Another example: take this deserializer with some logic for handling legacy data. We wondered whether we could already drop support for these legacy objects, but apparently, it still needs to deserialize some of these instances! It's good that we didn't just ask around or do some code searches and just delete it; it could've been quite the *issue*! @@ -162,7 +162,7 @@ To see whether this is the case, we usually perform code searches to look at the Every time we introduce new tooling in production environments, we should understand its effect on application performance. This holds especially when instrumenting our code, as this can add quite some overhead in executing instructions. To understand its performance impact, we first ran it on staging environments to find any immediate problems with resource usage. This allowed us to tweak the settings accordingly. To determine the performance in production, we kept an eye out for the average duration of the request. We selected two 24-hour periods, covering different loads for this application. One period with running JaCoCo, and one without. -![](https://miro.medium.com/v2/resize:fit:700/0*neVQTAom_1QPLD6V) Average request duration in service while running with JaCoCo (red) and without (grey). +![](0-neVQTAom_1QPLD6V-297c1968.png) Average request duration in service while running with JaCoCo (red) and without (grey). From this, we observed an average overhead of 0.03%. As that is such a small overhead in the context of Picnic, we found this an acceptable price to pay for the insights we gain. diff --git a/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/HL2UN4ZvPrLgENa7ergdKqrLfcLFEp_N8I46e973-bf4ea0e4.png b/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/HL2UN4ZvPrLgENa7ergdKqrLfcLFEp_N8I46e973-bf4ea0e4.png new file mode 100644 index 000000000..200340121 Binary files /dev/null and b/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/HL2UN4ZvPrLgENa7ergdKqrLfcLFEp_N8I46e973-bf4ea0e4.png differ diff --git a/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/LW_g2JLAtaj1yq2LJeg0LBb0yTOy4ufSyurPNWW6-b959d007.jpg b/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/LW_g2JLAtaj1yq2LJeg0LBb0yTOy4ufSyurPNWW6-b959d007.jpg new file mode 100644 index 000000000..e490bffb0 Binary files /dev/null and b/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/LW_g2JLAtaj1yq2LJeg0LBb0yTOy4ufSyurPNWW6-b959d007.jpg differ diff --git a/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/LrHrgXoLj4y9_lyYCzAbtLGle6eDCqv-eyDWOVQL-e41657d3.png b/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/LrHrgXoLj4y9_lyYCzAbtLGle6eDCqv-eyDWOVQL-e41657d3.png new file mode 100644 index 000000000..3493b2156 Binary files /dev/null and b/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/LrHrgXoLj4y9_lyYCzAbtLGle6eDCqv-eyDWOVQL-e41657d3.png differ diff --git a/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/NVgYf1bDqjbDEuvOkdmDReLlE0pVj2M3A64JpNQn-d9d384e4.jpg b/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/NVgYf1bDqjbDEuvOkdmDReLlE0pVj2M3A64JpNQn-d9d384e4.jpg new file mode 100644 index 000000000..0adc49e51 Binary files /dev/null and b/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/NVgYf1bDqjbDEuvOkdmDReLlE0pVj2M3A64JpNQn-d9d384e4.jpg differ diff --git a/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/QdjBEGu-dpqVoX_EMfZ5DZPG9ND4g3KjY1HR6Yo0-7a3c36a8.jpg b/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/QdjBEGu-dpqVoX_EMfZ5DZPG9ND4g3KjY1HR6Yo0-7a3c36a8.jpg new file mode 100644 index 000000000..0eed08f17 Binary files /dev/null and b/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/QdjBEGu-dpqVoX_EMfZ5DZPG9ND4g3KjY1HR6Yo0-7a3c36a8.jpg differ diff --git a/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/hJ-53Q53ibGC0DuCaqu7yuoWpnLJB3d6g9SYUQ26-b007ec31.jpg b/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/hJ-53Q53ibGC0DuCaqu7yuoWpnLJB3d6g9SYUQ26-b007ec31.jpg new file mode 100644 index 000000000..e92f3739f Binary files /dev/null and b/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/hJ-53Q53ibGC0DuCaqu7yuoWpnLJB3d6g9SYUQ26-b007ec31.jpg differ diff --git a/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/index.md b/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/index.md index 77e4cc4c2..57dcb5251 100644 --- a/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/index.md +++ b/content/posts/2023/11/10/creating-an-openapi-generator-from-scratch-from-yaml-to-jetbrains-http-client/index.md @@ -20,7 +20,7 @@ frozen: false ### **In this article, I'll be implementing an OpenAPI generator from scratch so you can too! We'll be creating a very simple generator for the Jetbrains HTTP Client.** -![Creating an OpenAPI generator from scratch : From YAML to JetBrains HTTP Client](https://lengrand.fr/content/images/2023/11/F9_7HZZW4AEvcHF.jpeg) +![Creating an OpenAPI generator from scratch : From YAML to JetBrains HTTP Client](F9_7HZZW4AEvcHF.jpeg) This is the online version of the article with the same name I wrote for the Dutch Java Magazine. @@ -76,7 +76,7 @@ Each of those is illustrated by a method, and takes separate objects as inputs: You can find [the actual source file on GitHub](https://github.com/OpenAPITools/openapi-generator/blob/78f3b19b58df699ef883b89a7a44531407377719/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java?ref=lengrand.fr#L433). The objects for each of those methods are large `Map` classes that contain the necessary data in a semi-structured format. Here is an example of how `allModels` looks like: -![Creating an OpenAPI generator from scratch : From YAML to JetBrains HTTP Client](https://lh7-us.googleusercontent.com/NVgYf1bDqjbDEuvOkdmDReLlE0pVj2M3A64JpNQncZmFvosFOlA4tGzb1idJWD8cWexTV-tlzd18VJwJ0lgkqHYi80GZFqmj3S-oJtXwa9Y2LrRG1mU-gdlKfBIV0hZsIBm2arP9QlVTQlfIvuwS_Tc) +![Creating an OpenAPI generator from scratch : From YAML to JetBrains HTTP Client](NVgYf1bDqjbDEuvOkdmDReLlE0pVj2M3A64JpNQn-d9d384e4.jpg) *A debug view of the allModels object* @@ -125,7 +125,7 @@ $ ./bin/generate-samples.sh bin/configs/java-magazine-client-petstore-new.yaml Let's see what the generated output looks like: -![Creating an OpenAPI generator from scratch : From YAML to JetBrains HTTP Client](https://lh7-us.googleusercontent.com/QdjBEGu-dpqVoX_EMfZ5DZPG9ND4g3KjY1HR6Yo0LvChQmnRAPQBpBV-MAp6HNteXRbAb4ZOjQkQs9LhxBkj9KiZ7iRFdVKNTwNyNzNjCAQUWoc4RnipISl2kJcsKpauctW-D-Atkq7J5jEOyXcsA98) +![Creating an OpenAPI generator from scratch : From YAML to JetBrains HTTP Client](QdjBEGu-dpqVoX_EMfZ5DZPG9ND4g3KjY1HR6Yo0-7a3c36a8.jpg) *A tree view of the generated client* @@ -189,8 +189,8 @@ If we look at the data object available for operations, we end up with this, whe We can see it clearly if we look at the object during processing. -![Creating an OpenAPI generator from scratch : From YAML to JetBrains HTTP Client](https://lh7-us.googleusercontent.com/LW_g2JLAtaj1yq2LJeg0LBb0yTOy4ufSyurPNWW6XjKcdsv5GhVSASr6yWS7vYv3vmEuS9xmbZqzBa4Mqt76dg_Bv47gMoifUjxInC0-z1WkJYJRU3grz4RBApXJAZl4ZCx1irLQ69axWx5CQAe1fM0) -![Creating an OpenAPI generator from scratch : From YAML to JetBrains HTTP Client](https://lh7-us.googleusercontent.com/HL2UN4ZvPrLgENa7ergdKqrLfcLFEp_N8I46e973y1QsKWO7nzaiqSyjypk-YAdA7_fA_HdjIJR2PwI9zWAym9tVMtSLksXMMZYVmWj6oJbr84V4A90PfMWjqQZ468lQmc9eN8CJEY8h3L4apRAGcgw) +![Creating an OpenAPI generator from scratch : From YAML to JetBrains HTTP Client](LW_g2JLAtaj1yq2LJeg0LBb0yTOy4ufSyurPNWW6-b959d007.jpg) +![Creating an OpenAPI generator from scratch : From YAML to JetBrains HTTP Client](HL2UN4ZvPrLgENa7ergdKqrLfcLFEp_N8I46e973-bf4ea0e4.png) *Note: Unfortunately, to my knowledge the best way to dive into the data model is still to go pause at runtime, I haven't yet found a complete data model documentation online. If you do, let me know!* @@ -201,7 +201,7 @@ $ ./mvnw package $ ./bin/generate-samples.sh bin/configs/java-magazine-client-petstore-new.yaml ``` -![Creating an OpenAPI generator from scratch : From YAML to JetBrains HTTP Client](https://lh7-us.googleusercontent.com/hJ-53Q53ibGC0DuCaqu7yuoWpnLJB3d6g9SYUQ26-XeAVLW5JgavLfljBo08hnuyMwUsQo4Hgz5aBthp8L8jqFCpq1RBFWCz-PWFvpdofXDgR4o7QI_iyFKYMz4Afbet38-rEnzAuCXL4aCaL7ZUnZE) +![Creating an OpenAPI generator from scratch : From YAML to JetBrains HTTP Client](hJ-53Q53ibGC0DuCaqu7yuoWpnLJB3d6g9SYUQ26-b007ec31.jpg) *The result of the generation of our client* @@ -224,7 +224,7 @@ Looks great to me! Let's try to run one of the calls Looks great to me! Let's try to run one of the calls. -![Creating an OpenAPI generator from scratch : From YAML to JetBrains HTTP Client](https://lh7-us.googleusercontent.com/LrHrgXoLj4y9_lyYCzAbtLGle6eDCqv-eyDWOVQLkCkdsb2LskNOrdhBEO0c0wDMuRb9EHbh3i21TpLEcntMyd_qhHqeYgIsQDzDOD7FCrf6VNsaxe3RY1OzrzB21uqo1SxwzlF7lXZ7oqyno3FAGSo) +![Creating an OpenAPI generator from scratch : From YAML to JetBrains HTTP Client](LrHrgXoLj4y9_lyYCzAbtLGle6eDCqv-eyDWOVQL-e41657d3.png) *Running one of the calls that's just been generated* diff --git a/content/posts/2023/11/10/payara-platform-reaches-150000-monthly-users/150000-20downloads-b0e33269.jpg b/content/posts/2023/11/10/payara-platform-reaches-150000-monthly-users/150000-20downloads-b0e33269.jpg new file mode 100644 index 000000000..dbf8cd832 Binary files /dev/null and b/content/posts/2023/11/10/payara-platform-reaches-150000-monthly-users/150000-20downloads-b0e33269.jpg differ diff --git a/content/posts/2023/11/10/payara-platform-reaches-150000-monthly-users/index.md b/content/posts/2023/11/10/payara-platform-reaches-150000-monthly-users/index.md index fe65a72fc..31517f834 100644 --- a/content/posts/2023/11/10/payara-platform-reaches-150000-monthly-users/index.md +++ b/content/posts/2023/11/10/payara-platform-reaches-150000-monthly-users/index.md @@ -24,7 +24,7 @@ Designed for mission-critical systems in production and containerized Jakarta EE Developers from diverse regions and industries have embraced the platform, leveraging its capabilities to build and deploy enterprise-grade applications. The community-driven nature of Payara Platform additionally fosters collaboration and innovation, which has led to its sustained growth and development. -[![150,000 Blog Downloads](https://info.payara.fish/hubfs/blog-image-uploads/150000%20downloads.png "150,000 Blog Downloads")](https://info.payara.fish/hubfs/blog-image-uploads/150000%20downloads.png "150,000 Blog Downloads") +[![150,000 Blog Downloads](150000-20downloads-b0e33269.jpg "150,000 Blog Downloads")](150000-20downloads-b0e33269.jpg "150,000 Blog Downloads") CEO and Founder, Steve Millidge, Payara, comments: > *"**We are immensely proud of the global adoption of Payara Platform, which serves as a testament to the hard work and dedication of our community members and the excellence of our product. With more than 150,000 monthly users and counting, Payara Platform has become the go-to choice for those seeking a powerful, aggressively compatible, open source application server.*** ***This milestone demonstrates our commitment to delivering high-quality solutions that meet the evolving needs of the software development community and enterprises. We have also recently launched Payara Cloud, a fully managed cloud infrastructure management solution that fully eliminates the need of Kubernetes, and brings significant cost savings for businesses.***" diff --git a/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/ht_vs_vt_interleaving-2000x560-22833803.jpg b/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/ht_vs_vt_interleaving-2000x560-22833803.jpg new file mode 100644 index 000000000..d7bd62788 Binary files /dev/null and b/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/ht_vs_vt_interleaving-2000x560-22833803.jpg differ diff --git a/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/ht_vs_vt_pyramid-1-2000x1125-02652af5.jpg b/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/ht_vs_vt_pyramid-1-2000x1125-02652af5.jpg new file mode 100644 index 000000000..ab6415cce Binary files /dev/null and b/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/ht_vs_vt_pyramid-1-2000x1125-02652af5.jpg differ diff --git a/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/ht_vs_vt_pyramid-1-2000x1125-1.jpg b/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/ht_vs_vt_pyramid-1-2000x1125-1.jpg new file mode 100644 index 000000000..ab6415cce Binary files /dev/null and b/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/ht_vs_vt_pyramid-1-2000x1125-1.jpg differ diff --git a/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/ht_vs_vt_pyramid-1-2000x1125-1.png b/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/ht_vs_vt_pyramid-1-2000x1125-1.png deleted file mode 100644 index 609daf2a6..000000000 Binary files a/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/ht_vs_vt_pyramid-1-2000x1125-1.png and /dev/null differ diff --git a/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/index.md b/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/index.md index e51a08207..b77e05c02 100644 --- a/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/index.md +++ b/content/posts/2023/11/14/loom-is-just-hyperthreading-in-java/index.md @@ -5,7 +5,7 @@ lastmod: "2023-11-14T10:54:08+00:00" description: "I had an epiphany: Aren't virtual threads with Loom just a version of HyperThreading on the JVM?" authors: - "johannes-bechberger" -image: "ht_vs_vt_pyramid-1-2000x1125-1.png" +image: "ht_vs_vt_pyramid-1-2000x1125-1.jpg" categories: - "Java" related_posts: @@ -17,10 +17,10 @@ frozen: false --- While sitting in [Cay Horstmann](https://horstmann.com/unblog/2023-09-19/index.html)'s ["Looming Changes in Java Concurrency" talk at BaselOne](https://baselone.ch/speech.html?id=BEB1A232-BA37-4619-A7F9-33802755DFEB), I had an epiphany: Aren't virtual threads with Loom just a version of HyperThreading on the JVM? -![](https://mostlynerdless.de/wp-content/uploads/2023/10/ht_vs_vt_pyramid-1-2000x1125.png) +![](ht_vs_vt_pyramid-1-2000x1125-02652af5.jpg) Both try to utilize a computation resource fully, be it hardware core or platform thread, by multiplexing multiple tasks onto it, despite many tasks waiting regularly for IO operations to complete: -![](https://mostlynerdless.de/wp-content/uploads/2023/10/ht_vs_vt_interleaving-2000x560.png) +![](ht_vs_vt_interleaving-2000x560-22833803.jpg) When one task waits, another can be scheduled, improving overall throughput. This works especially well when longer IO operations follow short bursts of computation. diff --git a/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/hot-reload-code-ant-commander-pro-1024x391.jpg b/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/hot-reload-code-ant-commander-pro-1024x391.jpg new file mode 100644 index 000000000..db97e0c08 Binary files /dev/null and b/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/hot-reload-code-ant-commander-pro-1024x391.jpg differ diff --git a/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/hot-reload-code-ant-commander-pro-1024x391.png b/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/hot-reload-code-ant-commander-pro-1024x391.png deleted file mode 100644 index 9fa79a43e..000000000 Binary files a/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/hot-reload-code-ant-commander-pro-1024x391.png and /dev/null differ diff --git a/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/hot-reload-code-netbeans2-1024x576.jpg b/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/hot-reload-code-netbeans2-1024x576.jpg new file mode 100644 index 000000000..af9d6db30 Binary files /dev/null and b/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/hot-reload-code-netbeans2-1024x576.jpg differ diff --git a/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/hot-reload-code-netbeans2-1024x576.png b/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/hot-reload-code-netbeans2-1024x576.png deleted file mode 100644 index c78cede3e..000000000 Binary files a/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/hot-reload-code-netbeans2-1024x576.png and /dev/null differ diff --git a/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/index.md b/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/index.md index 5217f5e46..0d05e3eec 100644 --- a/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/index.md +++ b/content/posts/2023/11/15/live-recompile-reload-reexecute-java-code-in-100-loc/index.md @@ -30,7 +30,7 @@ Here are some changes that simplify your first Java program: In this article, we'll write a program (**The Reloader**) to easily play with Java code without the need to know how to compile or run the code or print the result. The code will be automatically (re)compiled, (re)loaded, (re)executed and (re)printed to the output when the .java file is saved. -![](hot-reload-code-ant-commander-pro-1024x391.png) On the left side, the Java file that I edited and saved. On the right side, the code re-executed. +![](hot-reload-code-ant-commander-pro-1024x391.jpg) On the left side, the Java file that I edited and saved. On the right side, the code re-executed. | | | | | | |------------------------------|------------|--------------|--------------------------------|--------------| @@ -170,7 +170,7 @@ public class Reloader { ``` Now start it with ***java Reloader.java PlayWithNumbers.java*** and edit the *PlayWithNumbers.java* file as you wish. -[![](hot-reload-code-netbeans2-1024x576.png)](hot-reload-code-netbeans2.png) Playing with numbers and stream. +[![](hot-reload-code-netbeans2-1024x576.jpg)](hot-reload-code-netbeans2.png) Playing with numbers and stream. ## Going further diff --git a/content/posts/2023/11/15/unit-testing-supabase-in-kotlin/Screenshot-2023-10-11-at-23.57.36.jpg b/content/posts/2023/11/15/unit-testing-supabase-in-kotlin/Screenshot-2023-10-11-at-23.57.36.jpg new file mode 100644 index 000000000..74fbd86cf Binary files /dev/null and b/content/posts/2023/11/15/unit-testing-supabase-in-kotlin/Screenshot-2023-10-11-at-23.57.36.jpg differ diff --git a/content/posts/2023/11/15/unit-testing-supabase-in-kotlin/Screenshot-2023-10-11-at-23.57.36.png b/content/posts/2023/11/15/unit-testing-supabase-in-kotlin/Screenshot-2023-10-11-at-23.57.36.png deleted file mode 100644 index 4f77c2a0e..000000000 Binary files a/content/posts/2023/11/15/unit-testing-supabase-in-kotlin/Screenshot-2023-10-11-at-23.57.36.png and /dev/null differ diff --git a/content/posts/2023/11/15/unit-testing-supabase-in-kotlin/index.md b/content/posts/2023/11/15/unit-testing-supabase-in-kotlin/index.md index 404a7b54d..2ae9e05e4 100644 --- a/content/posts/2023/11/15/unit-testing-supabase-in-kotlin/index.md +++ b/content/posts/2023/11/15/unit-testing-supabase-in-kotlin/index.md @@ -5,7 +5,7 @@ lastmod: "2023-11-19T16:46:36+00:00" description: "In this article, I'll dive into several methods I've been looking into to unit test a Kotlin application using Supabase and why I finally decided to go for a Docker Compose / Test Containers solution." authors: - "jlengrand" -image: "Screenshot-2023-10-11-at-23.57.36.png" +image: "Screenshot-2023-10-11-at-23.57.36.jpg" categories: - "Kotlin" - "Testing" diff --git a/content/posts/2023/11/21/announcing-the-bsp-repo/bsg-6e008410.png b/content/posts/2023/11/21/announcing-the-bsp-repo/bsg-6e008410.png new file mode 100644 index 000000000..03add7559 Binary files /dev/null and b/content/posts/2023/11/21/announcing-the-bsp-repo/bsg-6e008410.png differ diff --git a/content/posts/2023/11/21/announcing-the-bsp-repo/index.md b/content/posts/2023/11/21/announcing-the-bsp-repo/index.md index 850508e66..ef44f0548 100644 --- a/content/posts/2023/11/21/announcing-the-bsp-repo/index.md +++ b/content/posts/2023/11/21/announcing-the-bsp-repo/index.md @@ -40,11 +40,11 @@ Using Build Server for Gradle is straightforward. You can follow these simple st #### Step 1 -- Install the "Extension Pack for Java" extension. -[![Image javaext](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/09/javaext.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/09/javaext.png) +[![Image javaext](javaext-280d47cf.png)](javaext-280d47cf.png) #### Step 2 -- Install the "Gradle for Java" extension. (Currently, Build Server for Gradle is integrated into [Gradle for Java extension](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-gradle)) -[![](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/09/gradleext.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/09/gradleext.png) +[![](gradleext.png)](gradleext.png) After installing this extension, you can enable Build Server for Gradle for import your Gradle projects. @@ -52,7 +52,7 @@ By default, Build Server for Gradle will only import newly opened Gradle project If you wish to disable Build Server for Gradle, you can go to the settings and set '**java.gradle.buildServer.enable** d' to '**off.**' -[![Turning build server for gradle off](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/11/bsg.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2023/11/bsg.png) +[![Turning build server for gradle off](bsg-6e008410.png)](bsg-6e008410.png) ### Future Plans diff --git a/content/posts/2023/11/21/announcing-the-bsp-repo/javaext-280d47cf.png b/content/posts/2023/11/21/announcing-the-bsp-repo/javaext-280d47cf.png new file mode 100644 index 000000000..0fd0e0b34 Binary files /dev/null and b/content/posts/2023/11/21/announcing-the-bsp-repo/javaext-280d47cf.png differ diff --git a/content/posts/2023/11/22/feedback-from-calling-rust-from-python/Screenshot-2023-10-29-at-21.31.31.jpg b/content/posts/2023/11/22/feedback-from-calling-rust-from-python/Screenshot-2023-10-29-at-21.31.31.jpg new file mode 100644 index 000000000..9edd16304 Binary files /dev/null and b/content/posts/2023/11/22/feedback-from-calling-rust-from-python/Screenshot-2023-10-29-at-21.31.31.jpg differ diff --git a/content/posts/2023/11/22/feedback-from-calling-rust-from-python/Screenshot-2023-10-29-at-21.31.31.png b/content/posts/2023/11/22/feedback-from-calling-rust-from-python/Screenshot-2023-10-29-at-21.31.31.png deleted file mode 100644 index 8f3d0a1ae..000000000 Binary files a/content/posts/2023/11/22/feedback-from-calling-rust-from-python/Screenshot-2023-10-29-at-21.31.31.png and /dev/null differ diff --git a/content/posts/2023/11/22/feedback-from-calling-rust-from-python/index.md b/content/posts/2023/11/22/feedback-from-calling-rust-from-python/index.md index 3b06abbdc..efc7e68df 100644 --- a/content/posts/2023/11/22/feedback-from-calling-rust-from-python/index.md +++ b/content/posts/2023/11/22/feedback-from-calling-rust-from-python/index.md @@ -6,7 +6,7 @@ description: "Improving low-level integration with ctypes to the generic ready-t canonical: "https://blog.frankel.ch/feedback-rust-from-python/" authors: - "nicolas-frankel" -image: "Screenshot-2023-10-29-at-21.31.31.png" +image: "Screenshot-2023-10-29-at-21.31.31.jpg" categories: - "Research" - "Tutorials" diff --git a/content/posts/2023/11/24/java-for-desktop-applications-part-1/index.md b/content/posts/2023/11/24/java-for-desktop-applications-part-1/index.md index d4b19403a..1cefb3259 100644 --- a/content/posts/2023/11/24/java-for-desktop-applications-part-1/index.md +++ b/content/posts/2023/11/24/java-for-desktop-applications-part-1/index.md @@ -5,7 +5,7 @@ lastmod: "2023-11-24T09:21:13+00:00" description: "Improve your desktop applications with easy-to-apply tips!" authors: - "christopher-schnick" -image: "permission.png" +image: "permission.jpg" categories: - "Desktop" - "Java" diff --git a/content/posts/2023/11/24/java-for-desktop-applications-part-1/permission.jpg b/content/posts/2023/11/24/java-for-desktop-applications-part-1/permission.jpg new file mode 100644 index 000000000..38ff6efa9 Binary files /dev/null and b/content/posts/2023/11/24/java-for-desktop-applications-part-1/permission.jpg differ diff --git a/content/posts/2023/11/24/java-for-desktop-applications-part-1/permission.png b/content/posts/2023/11/24/java-for-desktop-applications-part-1/permission.png deleted file mode 100644 index 301a76d34..000000000 Binary files a/content/posts/2023/11/24/java-for-desktop-applications-part-1/permission.png and /dev/null differ diff --git a/content/posts/2023/11/26/custom-jfr-events-a-short-introduction/Long_Profilers_Basel_One_2023-2000x1125-9c6b045f.png b/content/posts/2023/11/26/custom-jfr-events-a-short-introduction/Long_Profilers_Basel_One_2023-2000x1125-9c6b045f.png new file mode 100644 index 000000000..cdc53e38b Binary files /dev/null and b/content/posts/2023/11/26/custom-jfr-events-a-short-introduction/Long_Profilers_Basel_One_2023-2000x1125-9c6b045f.png differ diff --git a/content/posts/2023/11/26/custom-jfr-events-a-short-introduction/custom_jfr_event-2000x1203-2ea28805.jpg b/content/posts/2023/11/26/custom-jfr-events-a-short-introduction/custom_jfr_event-2000x1203-2ea28805.jpg new file mode 100644 index 000000000..e93578c3c Binary files /dev/null and b/content/posts/2023/11/26/custom-jfr-events-a-short-introduction/custom_jfr_event-2000x1203-2ea28805.jpg differ diff --git a/content/posts/2023/11/26/custom-jfr-events-a-short-introduction/image-8a79ea31.png b/content/posts/2023/11/26/custom-jfr-events-a-short-introduction/image-8a79ea31.png new file mode 100644 index 000000000..7909570d5 Binary files /dev/null and b/content/posts/2023/11/26/custom-jfr-events-a-short-introduction/image-8a79ea31.png differ diff --git a/content/posts/2023/11/26/custom-jfr-events-a-short-introduction/index.md b/content/posts/2023/11/26/custom-jfr-events-a-short-introduction/index.md index 1ff406223..574fbb58e 100644 --- a/content/posts/2023/11/26/custom-jfr-events-a-short-introduction/index.md +++ b/content/posts/2023/11/26/custom-jfr-events-a-short-introduction/index.md @@ -22,12 +22,12 @@ frozen: false It offers many features (see [Profiling Talks](https://mostlynerdless.de/profiling-talks/)) and the ability to observe lots of information by recording over one hundred different events. If you want to know more about the existing events, visit my [JFR Event Collection](https://sapmachine.io/jfrevents) website ([related blog post](https://mostlynerdless.de/blog/2022/12/06/jfr-event-collection/)): -[![](https://mostlynerdless.de/wp-content/uploads/2023/11/image.png)](https://sapmachine.io/jfrevents) +[![](image-8a79ea31.png)](https://sapmachine.io/jfrevents) Besides these built-in events, JFR allows you to implement your events to record custom information directly in your profiling file. Let's start with a small example to motivate this. Consider for a moment that we want to run the next big thing after Software-as-a-Service: Math-as-a-Service, a service that provides customers with the freshest [Fibonacci](https://en.wikipedia.org/wiki/Fibonacci_sequence) numbers and more. -![](https://mostlynerdless.de/wp-content/uploads/2023/11/Long_Profilers_Basel_One_2023-2000x1125.png) +![](Long_Profilers_Basel_One_2023-2000x1125-9c6b045f.png) We develop this service using Javalin: @@ -101,7 +101,7 @@ static void handleRequest(Context ctx, int sessionId) { This small addition records the timing and duration of each request, as well as `n` and the session ID in the JFR profile. The sample code, including a request generator, can be found on [GitHub](https://github.com/parttimenerd/custom-jfr-event-sample). After we ran the server, we can view the recorded events in a JFR viewer, like JDK Mission Control or [my JFR viewer](https://plugins.jetbrains.com/plugin/20937-java-jfr-profiler) ([online view](https://profiler.firefox.com/public/pzwy2v3q9vnefyc6btn9q4fs2yy8et82t5651vr/marker-chart/?globalTrackOrder=0&thread=0wa&v=9)): -[![](https://mostlynerdless.de/wp-content/uploads/2023/11/custom_jfr_event-2000x1203.png)](https://share.firefox.dev/3sIyFtE) +[![](custom_jfr_event-2000x1203-2ea28805.jpg)](https://share.firefox.dev/3sIyFtE) This was my short introduction to custom JFR events; if you want to learn more, I highly recommend Gunnar Morlings [Monitoring REST APIs with Custom JDK Flight Recorder Events](https://www.morling.dev/blog/rest-api-monitoring-with-custom-jdk-flight-recorder-events/) article. diff --git a/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/Screenshot-from-2023-11-17-15-47-07-b4d3289b.jpg b/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/Screenshot-from-2023-11-17-15-47-07-b4d3289b.jpg new file mode 100644 index 000000000..70486b8ec Binary files /dev/null and b/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/Screenshot-from-2023-11-17-15-47-07-b4d3289b.jpg differ diff --git a/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/Screenshot-from-2023-11-20-12-16-59-3e626721.png b/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/Screenshot-from-2023-11-20-12-16-59-3e626721.png new file mode 100644 index 000000000..fbf1b9238 Binary files /dev/null and b/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/Screenshot-from-2023-11-20-12-16-59-3e626721.png differ diff --git a/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/image-2-636eafaf.jpg b/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/image-2-636eafaf.jpg new file mode 100644 index 000000000..75148f1c0 Binary files /dev/null and b/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/image-2-636eafaf.jpg differ diff --git a/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/image-3-b9708eb4.png b/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/image-3-b9708eb4.png new file mode 100644 index 000000000..ddc6f8906 Binary files /dev/null and b/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/image-3-b9708eb4.png differ diff --git a/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/image-5-2d43b3f2.jpg b/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/image-5-2d43b3f2.jpg new file mode 100644 index 000000000..fd205a622 Binary files /dev/null and b/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/image-5-2d43b3f2.jpg differ diff --git a/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/index.md b/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/index.md index 6a79b75b7..9c870df3a 100644 --- a/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/index.md +++ b/content/posts/2023/11/28/custom-events-in-the-blocky-world-using-jfr-in-minecraft/index.md @@ -5,7 +5,7 @@ lastmod: "2023-11-28T19:12:51+00:00" description: "I was searching for some JFR-related settings on the internet when I stumbled upon the /jfr command that exists in Minecraft..." authors: - "johannes-bechberger" -image: "https://mostlynerdless.de/wp-content/uploads/2023/11/image-2.png" +image: "image-2-636eafaf.jpg" categories: - "Java Core" - "Performance" @@ -19,21 +19,21 @@ frozen: false I was searching for some JFR-related settings on the internet when I stumbled upon the [`/jfr` command](https://minecraft.fandom.com/wiki/Commands/jfr) that exists in [Minecraft](https://www.minecraft.net): -{{< img src="https://mostlynerdless.de/wp-content/uploads/2023/11/image-2.png" class="aligncenter size-full is-resized" style="width:614px;height:auto" >}} +{{< img src="image-2-636eafaf.jpg" class="aligncenter size-full is-resized" style="width:614px;height:auto" >}} This, of course, intrigued me, especially as Minecraft apparently adds some custom JFR events: -[![](https://mostlynerdless.de/wp-content/uploads/2023/11/image-3.png)](https://minecraft.fandom.com/wiki/Commands/jfr) +[![](image-3-b9708eb4.png)](https://minecraft.fandom.com/wiki/Commands/jfr) So I had to check it out. I downloaded and started the [Java server](https://www.minecraft.net/en-us/download/server), got a demo account, and connected to my local instance. *This works with a demo account when you launch the demo world, enable the cheat mode in the settings, kick yourself via "/kick @p," and then select your own server. I found this via [this bug report](https://bugs.mojang.com/browse/MC-138478).* You then must ensure that you have OP privileges and add them, if not via the Minecraft server shell. Then, you can type `/jfr start` in the chat (launch it by typing T) to start the recording and `/jfr stop` to stop it. -{{< img src="https://mostlynerdless.de/wp-content/uploads/2023/11/Screenshot-from-2023-11-17-15-47-07.png" class="aligncenter size-full is-resized" style="width:614px;height:auto" >}} +{{< img src="Screenshot-from-2023-11-17-15-47-07-b4d3289b.jpg" class="aligncenter size-full is-resized" style="width:614px;height:auto" >}} *You see that it's my first time "playing" Minecraft, and I'm great at getting attacked. It's probably also my last time.* Minecraft stores the JFR file in the `debug` folder in the working directory of your server, both as a JFR file and as a JSON file. You can view the JFR file in a JFR viewer of your choice, like JMC or my [IntelliJ JFR plugin](https://plugins.jetbrains.com/plugin/20937-java-jfr-profiler) ([web view of the file](https://share.firefox.dev/3G5dfKr), [JFR file itself](https://mostlynerdless.de/files/blog/server-2023-11-17-155349.jfr)), and explore the custom JFR events: -[![](https://mostlynerdless.de/wp-content/uploads/2023/11/Screenshot-from-2023-11-20-12-16-59.png)](https://share.firefox.dev/3G5dfKr) +[![](Screenshot-from-2023-11-20-12-16-59-3e626721.png)](https://share.firefox.dev/3G5dfKr) This lets you get insights into the chunk generation and specific traffic patterns of the Minecraft server. @@ -90,7 +90,7 @@ class ChunkGeneration extends jdk.jfr.Event { You can find all defined events [here](https://gist.github.com/parttimenerd/a3b0c74eea0c1da89fec533ebd468479). The actual implementation of these events is only slightly larger because some events accumulate data over a period of time. I'm, of course, not the first OpenJDK developer who stumbled upon these custom events. Erik Gahlin even found them shortly after their addition in 2021 and promptly created an issue to recommend improvements (see [MC-236873](https://bugs.mojang.com/browse/MC-236873)): -[![](https://mostlynerdless.de/wp-content/uploads/2023/11/image-5.png)](https://bugs.mojang.com/browse/MC-236873) +[![](image-5-2d43b3f2.jpg)](https://bugs.mojang.com/browse/MC-236873) ## Conclusion diff --git a/content/posts/2023/12/04/jetbrains-ai-launch-event/DSGN-18145_AI_Launch_Blog-Social-Share-1280x720-2x-1024x576.jpg b/content/posts/2023/12/04/jetbrains-ai-launch-event/DSGN-18145_AI_Launch_Blog-Social-Share-1280x720-2x-1024x576.jpg new file mode 100644 index 000000000..10165ee82 Binary files /dev/null and b/content/posts/2023/12/04/jetbrains-ai-launch-event/DSGN-18145_AI_Launch_Blog-Social-Share-1280x720-2x-1024x576.jpg differ diff --git a/content/posts/2023/12/04/jetbrains-ai-launch-event/DSGN-18145_AI_Launch_Blog-Social-Share-1280x720-2x-1024x576.png b/content/posts/2023/12/04/jetbrains-ai-launch-event/DSGN-18145_AI_Launch_Blog-Social-Share-1280x720-2x-1024x576.png deleted file mode 100644 index ecfaced7f..000000000 Binary files a/content/posts/2023/12/04/jetbrains-ai-launch-event/DSGN-18145_AI_Launch_Blog-Social-Share-1280x720-2x-1024x576.png and /dev/null differ diff --git a/content/posts/2023/12/04/jetbrains-ai-launch-event/index.md b/content/posts/2023/12/04/jetbrains-ai-launch-event/index.md index f3c6c84df..113dc612f 100644 --- a/content/posts/2023/12/04/jetbrains-ai-launch-event/index.md +++ b/content/posts/2023/12/04/jetbrains-ai-launch-event/index.md @@ -5,7 +5,7 @@ lastmod: "2023-12-04T11:32:34+00:00" description: "Don’t miss the online JetBrains AI launch event, where we'll release our AI-powered coding companion, JetBrains AI Assistant." authors: - "marit-van-dijk" -image: "DSGN-18145_AI_Launch_Blog-Social-Share-1280x720-2x-1024x576.png" +image: "DSGN-18145_AI_Launch_Blog-Social-Share-1280x720-2x-1024x576.jpg" categories: - "Developer Tools" - "Events" @@ -28,4 +28,4 @@ Free yourself from the routine and stay in the flow like never before! Join the [JetBrains AI launch event online](https://jb.gg/aihere)! **December 6, 5:00 pm (CET) \| 8:00 am (PST).** Learn more about JetBrains AI and AI Assistant from the creators themselves. -![](DSGN-18145_AI_Launch_Blog-Social-Share-1280x720-2x-1024x576.png) +![](DSGN-18145_AI_Launch_Blog-Social-Share-1280x720-2x-1024x576.jpg) diff --git a/content/posts/2023/12/06/couch-to-fully-observed-code-with-spring-boot-3-2-micrometer-tracing-and-digma/digma-trace.jpg b/content/posts/2023/12/06/couch-to-fully-observed-code-with-spring-boot-3-2-micrometer-tracing-and-digma/digma-trace.jpg new file mode 100644 index 000000000..b9acac69f Binary files /dev/null and b/content/posts/2023/12/06/couch-to-fully-observed-code-with-spring-boot-3-2-micrometer-tracing-and-digma/digma-trace.jpg differ diff --git a/content/posts/2023/12/06/couch-to-fully-observed-code-with-spring-boot-3-2-micrometer-tracing-and-digma/digma-trace.png b/content/posts/2023/12/06/couch-to-fully-observed-code-with-spring-boot-3-2-micrometer-tracing-and-digma/digma-trace.png deleted file mode 100644 index 7131598f3..000000000 Binary files a/content/posts/2023/12/06/couch-to-fully-observed-code-with-spring-boot-3-2-micrometer-tracing-and-digma/digma-trace.png and /dev/null differ diff --git a/content/posts/2023/12/06/couch-to-fully-observed-code-with-spring-boot-3-2-micrometer-tracing-and-digma/index.md b/content/posts/2023/12/06/couch-to-fully-observed-code-with-spring-boot-3-2-micrometer-tracing-and-digma/index.md index 3622fc8cf..4924789f2 100644 --- a/content/posts/2023/12/06/couch-to-fully-observed-code-with-spring-boot-3-2-micrometer-tracing-and-digma/index.md +++ b/content/posts/2023/12/06/couch-to-fully-observed-code-with-spring-boot-3-2-micrometer-tracing-and-digma/index.md @@ -68,7 +68,7 @@ That's it! All that remains now is to launch your application and run some traff It is tempting to look at the ability to quickly navigate from the code to the relevant trace as the holy grail of leveraging tracing and observability while coding. However, if you try to go down that path you'll soon find that the individual trace is just not that important. -![](digma-trace.png) +![](digma-trace.jpg) Traces are a great way to understand code behavior and provide a good "request handling anatomy" as a reference or guide for any developer working on a piece of code. However, the granularity level of the individual trace runs a serious risk of spamming and cluttering our view with irrelevant data. More importantly, we may end up missing critical data such as errors, bad performance, or issues with the flow of control simply because that specific chosen trace does not contain them. diff --git a/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/IMG_2578-2000x1500-91cf16ab.jpeg b/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/IMG_2578-2000x1500-91cf16ab.jpeg new file mode 100644 index 000000000..08930436a Binary files /dev/null and b/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/IMG_2578-2000x1500-91cf16ab.jpeg differ diff --git a/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/eclipse_buttons-74184c16.png b/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/eclipse_buttons-74184c16.png new file mode 100644 index 000000000..1ed2cf6c6 Binary files /dev/null and b/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/eclipse_buttons-74184c16.png differ diff --git a/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/eclipse_remote_dbg_dialog-e5248aee.jpg b/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/eclipse_remote_dbg_dialog-e5248aee.jpg new file mode 100644 index 000000000..76de42600 Binary files /dev/null and b/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/eclipse_remote_dbg_dialog-e5248aee.jpg differ diff --git a/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/image-9-a2b8aadf.png b/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/image-9-a2b8aadf.png new file mode 100644 index 000000000..051ca2e34 Binary files /dev/null and b/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/image-9-a2b8aadf.png differ diff --git a/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/index.md b/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/index.md index efebbd366..5b95c01a2 100644 --- a/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/index.md +++ b/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/index.md @@ -5,7 +5,7 @@ lastmod: "2023-12-06T17:17:48+00:00" description: "The ability to disconnect and then reattach debuggers is helpful for many complex debugging scenarios and can help you debug faster." authors: - "johannes-bechberger" -image: "https://mostlynerdless.de/wp-content/uploads/2023/10/reattach-2000x573.png" +image: "reattach-2000x573-0300f385.jpg" categories: - "Debugging" related_posts: @@ -29,7 +29,7 @@ This is quite useful because the JDWP agent has to do substantial initialization Other things, like class loading, were slower with an attached debugger in older JDK versions (see [JDK-8227269](https://bugs.openjdk.org/browse/JDK-8227269)). But what happens after you end the debugging session? Is your debugged program aborted, and if not, can you reattach your debugger at a later point in time? The answer is as always: It depends. Or, more precisely: It depends on the remote debugger you're using and how you terminate the debugging session. -![](https://mostlynerdless.de/wp-content/uploads/2023/10/reattach-2000x573.png) +![](reattach-2000x573-0300f385.jpg) But why should you disconnect and then reattach a debugger? It allows you to not run the debugger during longer ignorable stretches of your application's execution. The overhead of running the JDWP agent waiting for a connection is minimal compared to the plethora of events sent from the agent to the debugger during a debugging session (like class loading events, see [A short primer on Java debugging internals](https://mostlynerdless.de/blog/2022/12/27/a-short-primer-on-java-debugging-internals/)). @@ -62,16 +62,16 @@ NetBeans, IntelliJ IDEA, and Eclipse all support reattaching after ending a debu ## Terminating an Application with IDEs NetBeans is the only IDE of the three that does not support this (as far as I can ascertain). IntelliJ IDEA and Eclipse both support it, with Eclipse having the more straight-forward UI: -![](https://mostlynerdless.de/wp-content/uploads/2023/10/eclipse_buttons.png) +![](eclipse_buttons-74184c16.png) If the *terminate* button is not active, then you might have to tick the *Allow termination of remote VM* check-box in the remote configuration settings: -![](https://mostlynerdless.de/wp-content/uploads/2023/10/eclipse_remote_dbg_dialog.png) +![](eclipse_remote_dbg_dialog-e5248aee.jpg) IntelliJ IDEA's UI is, in this instance, arguably less discoverable: To terminate the application, you have to close the specific debugging session tab explicitly. -![](https://mostlynerdless.de/wp-content/uploads/2023/10/intellij_dbg_buttons.png) +![](intellij_dbg_buttons-d888d7ee.png) This then results in a popup that offers you the ability to terminate: -![](https://mostlynerdless.de/wp-content/uploads/2023/10/image-9.png) +![](image-9-a2b8aadf.png) ## Conclusion @@ -80,4 +80,4 @@ The ability to disconnect and then reattach debuggers is helpful for many comple I hope you enjoyed this addendum to my [Level-up your Java Debugging Skills with on-demand Debugging](https://mostlynerdless.de/blog/2023/10/03/level-up-your-java-debugging-skills-with-on-demand-debugging/) blog post. If you want even more debugging from me, come to my talk at the ConFoo conference in Montreal on the 23rd of February, and hopefully, next year a conference or user group near you. **This article is part of my work in the [SapMachine](https://sapmachine.io/) team at [SAP](https://sap.com/), making profiling and debugging easier for everyone. It appeared first on my personal blog [mostlynerdless.de](https://mostlynerdless.de/) and was supported by rainy weather and the subsequent afternoon in a cafe in Bratislava:** -![](https://mostlynerdless.de/wp-content/uploads/2023/10/IMG_2578-2000x1500.jpeg) +![](IMG_2578-2000x1500-91cf16ab.jpeg) diff --git a/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/intellij_dbg_buttons-d888d7ee.png b/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/intellij_dbg_buttons-d888d7ee.png new file mode 100644 index 000000000..0ff50f6a2 Binary files /dev/null and b/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/intellij_dbg_buttons-d888d7ee.png differ diff --git a/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/reattach-2000x573-0300f385.jpg b/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/reattach-2000x573-0300f385.jpg new file mode 100644 index 000000000..8687ec9be Binary files /dev/null and b/content/posts/2023/12/06/who-killed-the-jvm-attaching-a-debugger-twice/reattach-2000x573-0300f385.jpg differ diff --git a/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-adder.jpg b/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-adder.jpg new file mode 100644 index 000000000..af7e863d4 Binary files /dev/null and b/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-adder.jpg differ diff --git a/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-adder.png b/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-adder.png deleted file mode 100644 index caf5bf54d..000000000 Binary files a/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-adder.png and /dev/null differ diff --git a/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-app.jpg b/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-app.jpg new file mode 100644 index 000000000..42bdc3dce Binary files /dev/null and b/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-app.jpg differ diff --git a/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-app.png b/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-app.png deleted file mode 100644 index ec9d6ff9e..000000000 Binary files a/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-app.png and /dev/null differ diff --git a/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-calculator.jpg b/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-calculator.jpg new file mode 100644 index 000000000..da4d6ac2b Binary files /dev/null and b/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-calculator.jpg differ diff --git a/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-calculator.png b/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-calculator.png deleted file mode 100644 index 8f683c9ea..000000000 Binary files a/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-calculator.png and /dev/null differ diff --git a/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-multiplier.jpg b/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-multiplier.jpg new file mode 100644 index 000000000..727222d64 Binary files /dev/null and b/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-multiplier.jpg differ diff --git a/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-multiplier.png b/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-multiplier.png deleted file mode 100644 index 2cc2eca24..000000000 Binary files a/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/fuchs2023-screenshot-fepcos-j-native-build-multiplier.png and /dev/null differ diff --git a/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/index.md b/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/index.md index 3a6e48ca4..3c0b3ac62 100644 --- a/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/index.md +++ b/content/posts/2023/12/13/fuchs-2023-fepcos-j-03-native-executables/index.md @@ -254,19 +254,19 @@ are piped to a file for evaluation afterwards. #### Build and run *adder.exp* -{{< img src="fuchs2023-screenshot-fepcos-j-native-build-adder.png" class="size-full is-resized" alt="Running the native executable adder.exp built by using FEPCOS-J: Calling fjp --native within the project directory causes the execution of native-image, which generates the native executable adder.exp. Further, the file adder.out contains the piped output for subsequent evaluation. Running adder.exp provides access to the system internet socket 10.1.0.1:8001, which is specified as a parameter." width="1024" height="512" style="aspect-ratio:2;width:840px;height:auto" caption="Fig. 3) Running the native executable adder.exp built by using FEPCOS-J: Calling fjp --native within the project directory (1) causes the execution of native-image, which generates the native executable adder.exp (2). Further, the file adder.out contains the piped output for subsequent evaluation. Running adder.exp (3) provides access to the system internet socket 10.1.0.1:8001, which is specified as a parameter." >}} +{{< img src="fuchs2023-screenshot-fepcos-j-native-build-adder.jpg" class="size-full is-resized" alt="Running the native executable adder.exp built by using FEPCOS-J: Calling fjp --native within the project directory causes the execution of native-image, which generates the native executable adder.exp. Further, the file adder.out contains the piped output for subsequent evaluation. Running adder.exp provides access to the system internet socket 10.1.0.1:8001, which is specified as a parameter." width="1024" height="512" style="aspect-ratio:2;width:840px;height:auto" caption="Fig. 3) Running the native executable adder.exp built by using FEPCOS-J: Calling fjp --native within the project directory (1) causes the execution of native-image, which generates the native executable adder.exp (2). Further, the file adder.out contains the piped output for subsequent evaluation. Running adder.exp (3) provides access to the system internet socket 10.1.0.1:8001, which is specified as a parameter." >}} #### Build and run *multiplier.exp* -![Running the native executable multiplier.exp built by using FEPCOS-J: Calling fjp --native within the project directory causes the execution of native-image, which generates the native executable multiplier.exp. Further, the file multiplier.out contains the piped output for subsequent evaluation. Running multiplier.exp provides access to the system internet socket 10.1.0.2:8001, which is specified as a parameter.](fuchs2023-screenshot-fepcos-j-native-build-multiplier.png) **Fig. 4) Running the native executable *multiplier.exp* built by using FEPCOS-J:** Calling *fjp --native* within the project directory **(1)** causes the execution of *native-image* , which generates the native executable *multiplier.exp* **(2)** . Further, the file *multiplier.out* contains the piped output for subsequent evaluation. Running *multiplier.exp* **(3)** provides access to the system internet socket 10.1.0.2:8001, which is specified as a parameter. +![Running the native executable multiplier.exp built by using FEPCOS-J: Calling fjp --native within the project directory causes the execution of native-image, which generates the native executable multiplier.exp. Further, the file multiplier.out contains the piped output for subsequent evaluation. Running multiplier.exp provides access to the system internet socket 10.1.0.2:8001, which is specified as a parameter.](fuchs2023-screenshot-fepcos-j-native-build-multiplier.jpg) **Fig. 4) Running the native executable *multiplier.exp* built by using FEPCOS-J:** Calling *fjp --native* within the project directory **(1)** causes the execution of *native-image* , which generates the native executable *multiplier.exp* **(2)** . Further, the file *multiplier.out* contains the piped output for subsequent evaluation. Running *multiplier.exp* **(3)** provides access to the system internet socket 10.1.0.2:8001, which is specified as a parameter. #### Build and run *calculator.exp* -![Running the native executable calculator.exp built by using FEPCOS-J: Firstly, scp copies adder.imp.jar and multiplier.imp.jar, which are the previously built system import modules of calculator's parts, into the subdirectory mlib. Calling fjp --native within the project directory causes the execution of native-image, which generates the native executable calculator.exp. Further, the file calculator.out contains the piped output for subsequent evaluation. Running calculator.exp provides access to the system internet socket 10.0.0.1:8001, which is specified as a parameter.](fuchs2023-screenshot-fepcos-j-native-build-calculator.png) **Fig. 5) Running the native executable *calculator.exp* built by using FEPCOS-J:** Firstly, *scp* copies *adder.imp.jar* and *multiplier.imp.jar* , which are the previously built system import modules of *calculator* 's parts, into the subdirectory *mlib* . Calling *fjp --native* within the project directory **(1)** causes the execution of *native-image* , which generates the native executable *calculator.exp* **(2)** . Further, the file *calculator.out* contains the piped output for subsequent evaluation. Running *calculator.exp* **(3)** provides access to the system internet socket 10.0.0.1:8001, which is specified as a parameter. +![Running the native executable calculator.exp built by using FEPCOS-J: Firstly, scp copies adder.imp.jar and multiplier.imp.jar, which are the previously built system import modules of calculator's parts, into the subdirectory mlib. Calling fjp --native within the project directory causes the execution of native-image, which generates the native executable calculator.exp. Further, the file calculator.out contains the piped output for subsequent evaluation. Running calculator.exp provides access to the system internet socket 10.0.0.1:8001, which is specified as a parameter.](fuchs2023-screenshot-fepcos-j-native-build-calculator.jpg) **Fig. 5) Running the native executable *calculator.exp* built by using FEPCOS-J:** Firstly, *scp* copies *adder.imp.jar* and *multiplier.imp.jar* , which are the previously built system import modules of *calculator* 's parts, into the subdirectory *mlib* . Calling *fjp --native* within the project directory **(1)** causes the execution of *native-image* , which generates the native executable *calculator.exp* **(2)** . Further, the file *calculator.out* contains the piped output for subsequent evaluation. Running *calculator.exp* **(3)** provides access to the system internet socket 10.0.0.1:8001, which is specified as a parameter. #### Build and run *app* -![Build and run the system user app: Firstly, scp copies the system import module calculator.imp.jar into the subdirectory mlib. After compiling the application with javac, native-image processes the class files. As a result, app is the generated native executable. Further, the file app.out contains the piped output for subsequent evaluation. Running app causes the expected behavior.](fuchs2023-screenshot-fepcos-j-native-build-app.png) **Fig. 6) Build and run the system user *app*:** Firstly, *scp* copies the system import module *calculator.imp.jar* into the subdirectory *mlib* . After compiling the application with ***javac*** , ***native-image*** processes the class files **(1)** . As a result, *app* is the generated native executable **(2)** . Further, the file *app.out* contains the piped output for subsequent evaluation. Running *app* **(3)** causes the expected behavior. +![Build and run the system user app: Firstly, scp copies the system import module calculator.imp.jar into the subdirectory mlib. After compiling the application with javac, native-image processes the class files. As a result, app is the generated native executable. Further, the file app.out contains the piped output for subsequent evaluation. Running app causes the expected behavior.](fuchs2023-screenshot-fepcos-j-native-build-app.jpg) **Fig. 6) Build and run the system user *app*:** Firstly, *scp* copies the system import module *calculator.imp.jar* into the subdirectory *mlib* . After compiling the application with ***javac*** , ***native-image*** processes the class files **(1)** . As a result, *app* is the generated native executable **(2)** . Further, the file *app.out* contains the piped output for subsequent evaluation. Running *app* **(3)** causes the expected behavior. ## Evaluation diff --git a/content/posts/2023/12/13/unit-testing-supabase-in-kotlin-using-test-containers-part-2/Screenshot-2023-10-11-at-23.57.36-1.jpg b/content/posts/2023/12/13/unit-testing-supabase-in-kotlin-using-test-containers-part-2/Screenshot-2023-10-11-at-23.57.36-1.jpg new file mode 100644 index 000000000..74fbd86cf Binary files /dev/null and b/content/posts/2023/12/13/unit-testing-supabase-in-kotlin-using-test-containers-part-2/Screenshot-2023-10-11-at-23.57.36-1.jpg differ diff --git a/content/posts/2023/12/13/unit-testing-supabase-in-kotlin-using-test-containers-part-2/Screenshot-2023-10-11-at-23.57.36-1.png b/content/posts/2023/12/13/unit-testing-supabase-in-kotlin-using-test-containers-part-2/Screenshot-2023-10-11-at-23.57.36-1.png deleted file mode 100644 index 4f77c2a0e..000000000 Binary files a/content/posts/2023/12/13/unit-testing-supabase-in-kotlin-using-test-containers-part-2/Screenshot-2023-10-11-at-23.57.36-1.png and /dev/null differ diff --git a/content/posts/2023/12/13/unit-testing-supabase-in-kotlin-using-test-containers-part-2/index.md b/content/posts/2023/12/13/unit-testing-supabase-in-kotlin-using-test-containers-part-2/index.md index b78cd3940..6e5538a0b 100644 --- a/content/posts/2023/12/13/unit-testing-supabase-in-kotlin-using-test-containers-part-2/index.md +++ b/content/posts/2023/12/13/unit-testing-supabase-in-kotlin-using-test-containers-part-2/index.md @@ -5,7 +5,7 @@ lastmod: "2023-12-13T08:48:41+00:00" description: "In this article we continue diving into TestContainers and Supabase, and run unit tests against a full local self-hosted Supabase." authors: - "jlengrand" -image: "Screenshot-2023-10-11-at-23.57.36-1.png" +image: "Screenshot-2023-10-11-at-23.57.36-1.jpg" categories: - "Kotlin" - "Testing" diff --git a/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/IMG_2632-2000x1500-4975ea10.jpeg b/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/IMG_2632-2000x1500-4975ea10.jpeg new file mode 100644 index 000000000..f28a9eedf Binary files /dev/null and b/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/IMG_2632-2000x1500-4975ea10.jpeg differ diff --git a/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/image-2-a3dd1d7e.jpg b/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/image-2-a3dd1d7e.jpg new file mode 100644 index 000000000..4f62a5c52 Binary files /dev/null and b/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/image-2-a3dd1d7e.jpg differ diff --git a/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/image-6-7c4163f1.jpg b/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/image-6-7c4163f1.jpg new file mode 100644 index 000000000..c1089640e Binary files /dev/null and b/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/image-6-7c4163f1.jpg differ diff --git a/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/image-7-bd046ec9.jpg b/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/image-7-bd046ec9.jpg new file mode 100644 index 000000000..fc79869b2 Binary files /dev/null and b/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/image-7-bd046ec9.jpg differ diff --git a/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/image-8-2000x1279-ea8a4bb4.jpg b/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/image-8-2000x1279-ea8a4bb4.jpg new file mode 100644 index 000000000..516030f4f Binary files /dev/null and b/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/image-8-2000x1279-ea8a4bb4.jpg differ diff --git a/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/image-9-2000x1279-14d111bf.jpg b/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/image-9-2000x1279-14d111bf.jpg new file mode 100644 index 000000000..be15b0bba Binary files /dev/null and b/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/image-9-2000x1279-14d111bf.jpg differ diff --git a/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/index.md b/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/index.md index 23093ba22..05c551287 100644 --- a/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/index.md +++ b/content/posts/2023/12/14/profiling-maven-projects-with-my-intellij-profiler-plugin/index.md @@ -21,24 +21,24 @@ frozen: false ### Or: I just released version 0.0.11 with a cool new feature that I can't wait to tell you about... According to the recent [JetBrains survey](https://www.jetbrains.com/lp/devecosystem-2023/java/), most people use Maven as their build system and build Spring Boot applications with Java. Yet my profiling plugin for IntelliJ only supports profiling pure Java run configurations. Configurations where the JVM gets passed the main class to run. This is great for tiny examples where you directly right-click on the `main` method and profile the whole application using the context menu: -![](https://mostlynerdless.de/wp-content/uploads/2023/12/image-2.png) +![](image-2-a3dd1d7e.jpg) But this is not great when you're using the Maven build system and usually run your application using the `exec` goal, or, god forbid, use [Spring Boot](https://spring.io/projects/spring-boot) or [Quarkus](https://quarkus.io/)-related goals. Support for these goals has been requested multiple times, and last week, I came around to implementing it (while also two other bugs). So now you can profile your Spring Boot, like the Spring[pet-clinic](https://github.com/spring-projects/spring-petclinic), application running with `spring-boot:run`: -![](https://mostlynerdless.de/wp-content/uploads/2023/12/image-6.png) +![](image-6-7c4163f1.jpg) Giving you a profile like: -![](https://mostlynerdless.de/wp-content/uploads/2023/12/image-9-2000x1279.png) +![](image-9-2000x1279-14d111bf.jpg) Or your Quarkus application running with `quarkus:dev`: -![](https://mostlynerdless.de/wp-content/uploads/2023/12/image-7.png) +![](image-7-bd046ec9.jpg) Giving you a profile like: -![](https://mostlynerdless.de/wp-content/uploads/2023/12/image-8-2000x1279.png) +![](image-8-2000x1279-ea8a4bb4.jpg) This works specifically by using the options of these goals, which allows the profiler plugin to pass profiling-specific JVM options. If the plugin doesn't detect a directly supported plugin, it passes the JVM options via the `MAVEN_OPTS` environment variable. This should work with the `exec` goals and others. Gradle script support has also been requested, but despite searching the whole internet till the night, I didn't find any way to add JVM options to the JVM that Gradle runs for the Spring Boot or run tasks without modifying the `build.gradle` file itself (see [Baeldung](https://www.baeldung.com/java-gradle-bootrun-pass-jvm-options)). -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2632-2000x1500.jpeg) I left when it was dark and rode out into the night with my bike. Visiting other lost souls in the pursuit of sweet potato curry. +![](IMG_2632-2000x1500-4975ea10.jpeg) I left when it was dark and rode out into the night with my bike. Visiting other lost souls in the pursuit of sweet potato curry. Only [Quarku's `quarkusDev`](https://quarkus.io/guides/gradle-tooling) task has the proper options so that I can pass the JVM options. So, for now, I only have basic Quarkus support but nothing else. Maybe one of my readers knows how I could still provide profiling support for non-Quarkus projects. diff --git a/content/posts/2023/12/20/writing-c-code-in-java/index.md b/content/posts/2023/12/20/writing-c-code-in-java/index.md index 72edc9eee..d8904063b 100644 --- a/content/posts/2023/12/20/writing-c-code-in-java/index.md +++ b/content/posts/2023/12/20/writing-c-code-in-java/index.md @@ -5,7 +5,7 @@ lastmod: "2023-12-20T09:21:57+00:00" description: "The Foreign Function & Memory API (also called Project Panama) has come a long way since it started." authors: - "johannes-bechberger" -image: "panama-2000x981-1.png" +image: "panama-2000x981-1.jpg" categories: - "Java" - "Java Core" @@ -17,7 +17,7 @@ related_posts: frozen: false --- -![](https://mostlynerdless.de/wp-content/uploads/2023/12/panama-2000x981.png) +![](panama-2000x981-0ceeab3a.jpg) **The Foreign Function \& Memory API (also called Project Panama) has come a long way since it started. You can find the latest version implemented in JDK 21 as a preview feature (use `--enable-preview` to enable it) which is specified by the [JEP 454](https://openjdk.org/jeps/454):** > By efficiently invoking foreign functions (i.e., code outside the JVM), and by safely accessing foreign memory (i.e., memory not managed by the JVM), the API enables Java programs to call native libraries and process native data without the brittleness and danger of JNI. diff --git a/content/posts/2023/12/20/writing-c-code-in-java/panama-2000x981-0ceeab3a.jpg b/content/posts/2023/12/20/writing-c-code-in-java/panama-2000x981-0ceeab3a.jpg new file mode 100644 index 000000000..2cdf5f5f9 Binary files /dev/null and b/content/posts/2023/12/20/writing-c-code-in-java/panama-2000x981-0ceeab3a.jpg differ diff --git a/content/posts/2023/12/20/writing-c-code-in-java/panama-2000x981-1.jpg b/content/posts/2023/12/20/writing-c-code-in-java/panama-2000x981-1.jpg new file mode 100644 index 000000000..2cdf5f5f9 Binary files /dev/null and b/content/posts/2023/12/20/writing-c-code-in-java/panama-2000x981-1.jpg differ diff --git a/content/posts/2023/12/20/writing-c-code-in-java/panama-2000x981-1.png b/content/posts/2023/12/20/writing-c-code-in-java/panama-2000x981-1.png deleted file mode 100644 index a783d83c3..000000000 Binary files a/content/posts/2023/12/20/writing-c-code-in-java/panama-2000x981-1.png and /dev/null differ diff --git a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.45.51-700x394.jpg b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.45.51-700x394.jpg new file mode 100644 index 000000000..0676920a0 Binary files /dev/null and b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.45.51-700x394.jpg differ diff --git a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.45.51-700x394.png b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.45.51-700x394.png deleted file mode 100644 index e65a843ce..000000000 Binary files a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.45.51-700x394.png and /dev/null differ diff --git a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.46.44-700x394.jpg b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.46.44-700x394.jpg new file mode 100644 index 000000000..97d91ff3c Binary files /dev/null and b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.46.44-700x394.jpg differ diff --git a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.46.44-700x394.png b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.46.44-700x394.png deleted file mode 100644 index 847cbc040..000000000 Binary files a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.46.44-700x394.png and /dev/null differ diff --git a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.08-700x394.jpg b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.08-700x394.jpg new file mode 100644 index 000000000..8d08719eb Binary files /dev/null and b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.08-700x394.jpg differ diff --git a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.08-700x394.png b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.08-700x394.png deleted file mode 100644 index 69618d12c..000000000 Binary files a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.08-700x394.png and /dev/null differ diff --git a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.20-700x394.jpg b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.20-700x394.jpg new file mode 100644 index 000000000..78702c268 Binary files /dev/null and b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.20-700x394.jpg differ diff --git a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.20-700x394.png b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.20-700x394.png deleted file mode 100644 index 5dd20f311..000000000 Binary files a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.20-700x394.png and /dev/null differ diff --git a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.37-700x394.jpg b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.37-700x394.jpg new file mode 100644 index 000000000..778bb1d89 Binary files /dev/null and b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.37-700x394.jpg differ diff --git a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.37-700x394.png b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.37-700x394.png deleted file mode 100644 index 7359c96b9..000000000 Binary files a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.47.37-700x394.png and /dev/null differ diff --git a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.48.04-700x394.jpg b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.48.04-700x394.jpg new file mode 100644 index 000000000..7265eedad Binary files /dev/null and b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.48.04-700x394.jpg differ diff --git a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.48.04-700x394.png b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.48.04-700x394.png deleted file mode 100644 index 14e3b1ea7..000000000 Binary files a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/Screenshot-2023-12-14-at-11.48.04-700x394.png and /dev/null differ diff --git a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/index.md b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/index.md index 82886a59a..ac7d56b5b 100644 --- a/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/index.md +++ b/content/posts/2023/12/21/lntellij-idea-selectively-commit-changes-to-a-file/index.md @@ -24,29 +24,29 @@ In [IntelliJ IDEA](https://www.jetbrains.com/idea/) (as of version [2023.3](http We can see which files were changed by opening the **Commit tool window** (**⌘0** on macOS, or **Alt+0** on Windows/Linux). Here we can open the diff for a particular file to see which changes were made to that file, using **⌘D** (macOS) / **Ctrl+D** (Windows/Linux). -{{< img src="Screenshot-2023-12-14-at-11.45.51-700x394.png" class="size-medium" alt="IntelliJ IDEA showing a diff in a file. There are multiple checkboxes in the gutter of the changed file for different changes to the file." width="700" height="394" >}} +{{< img src="Screenshot-2023-12-14-at-11.45.51-700x394.jpg" class="size-medium" alt="IntelliJ IDEA showing a diff in a file. There are multiple checkboxes in the gutter of the changed file for different changes to the file." width="700" height="394" >}} In the diff, we have the option to include specific changes to our commit, by clicking the **Include into commit** checkbox in the gutter next to each chunk of modified, deleted or newly added code. -{{< img src="Screenshot-2023-12-14-at-11.46.44-700x394.png" class="size-medium" alt="IntelliJ IDEA showing a diff in a file and checkboxes in the gutter of the changed file. A tooltip on a checkbox shows 'Include into commit'." width="700" height="394" >}} +{{< img src="Screenshot-2023-12-14-at-11.46.44-700x394.jpg" class="size-medium" alt="IntelliJ IDEA showing a diff in a file and checkboxes in the gutter of the changed file. A tooltip on a checkbox shows 'Include into commit'." width="700" height="394" >}} We can even select specific lines from a change to include in a commit. To commit only a specific line from a chunk, right-click the line you want to include and select **Split Chunk and Include Current Line into Commit**. -{{< img src="Screenshot-2023-12-14-at-11.47.08-700x394.png" class="size-medium" alt="IntelliJ IDEA showing a diff in a file with a checkbox in the gutter of the changed file. The context menu shows the option 'Split Chunk and Include Current Line into Commit' highlighted." width="700" height="394" >}} +{{< img src="Screenshot-2023-12-14-at-11.47.08-700x394.jpg" class="size-medium" alt="IntelliJ IDEA showing a diff in a file with a checkbox in the gutter of the changed file. The context menu shows the option 'Split Chunk and Include Current Line into Commit' highlighted." width="700" height="394" >}} Alternatively, hover over the gutter and select the checkbox next to the line you want to include in the commit. Or, if we change our mind, we can also hover over the gutter and clear the checkbox next to the line we want to exclude. -{{< img src="Screenshot-2023-12-14-at-11.47.20-700x394.png" class="size-medium" alt="IntelliJ IDEA showing a diff in a file. There are multiple checkboxes in the gutter of the changed file. A tooltip on one of the checkboxes shows 'Include into commit'." width="700" height="394" >}} +{{< img src="Screenshot-2023-12-14-at-11.47.20-700x394.jpg" class="size-medium" alt="IntelliJ IDEA showing a diff in a file. There are multiple checkboxes in the gutter of the changed file. A tooltip on one of the checkboxes shows 'Include into commit'." width="700" height="394" >}} Once we have selected all the changes we want to commit, we write a meaningful commit message, and select **Commit**. Any unselected changes will stay in the current change list, so that you can commit them separately later. What if we don't want to add these changes to the same pull request, not even in a separate commit? Maybe you want to do some more cleaning up in your code base, and create a separate pull request for those changes later. We can undo this commit and move these changes to a different change list. To do so, select **Move to Another Changelist** from the context menu of a modified chunk. -{{< img src="Screenshot-2023-12-14-at-11.47.37-700x394.png" class="size-medium" alt="IntelliJ IDEA showing a diff in a file with a checkbox in the gutter of the changed file and a context menu with the option 'Move Lines to Another Changelist' highlighted." width="700" height="394" >}} +{{< img src="Screenshot-2023-12-14-at-11.47.37-700x394.jpg" class="size-medium" alt="IntelliJ IDEA showing a diff in a file with a checkbox in the gutter of the changed file and a context menu with the option 'Move Lines to Another Changelist' highlighted." width="700" height="394" >}} Next, we can name our new changelist. The changes will be assigned to this changelist and we can see it in the **Commit tool window**. -{{< img src="Screenshot-2023-12-14-at-11.48.04-700x394.png" class="size-medium" alt="IntelliJ IDEA showing a diff in a file with a popup on top. The popup is titled Move Lines to Another Changelist and the new changelist is named 'Fixes'." width="700" height="394" >}} +{{< img src="Screenshot-2023-12-14-at-11.48.04-700x394.jpg" class="size-medium" alt="IntelliJ IDEA showing a diff in a file with a popup on top. The popup is titled Move Lines to Another Changelist and the new changelist is named 'Fixes'." width="700" height="394" >}} {{< youtube AW5Xv8n3iEo >}} diff --git a/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/index.md b/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/index.md index a3bf3924c..38d273a41 100644 --- a/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/index.md +++ b/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/index.md @@ -27,10 +27,10 @@ One critical aspect of Spring Boot dependency management is security. Software v Software composition analysis (SCA) tools are a very useful tool for developers. They cover an easy solution to managing dependencies, handling security vulnerabilities, navigating licensing issues, and ensuring compliance in your software projects. By using [++Snyk Open Source++](https://snyk.io/product/open-source-security-management/) as your SCA, you can easily find out if your Spring Boot packages contain vulnerabilities. In the case of my example project, I found multiple vulnerabilities. The first is a high-severity security issue in \`netty-codec-http2\`. This is a transitive dependency brought in by my \`spring-boot-start-webflux\`, as you can see below. -![blog-sprint-boot-dos-vuln](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1701273846%2Fblog-sprint-boot-dos-vuln.jpg&w=2560&q=75) +![blog-sprint-boot-dos-vuln](snyk-io-c70cd66c.jpg) The second vulnerability I would like to discuss is a medium severity arbitrary code execution issue brought in via the \`snakeyaml\` package. This is also a transitive dependency, this time brought in by \`spring-boot-starter-security\`. -![blog-spring-boot-ACE-vuln](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1701273846%2Fblog-spring-boot-ACE-vuln.jpg&w=2560&q=75) +![blog-spring-boot-ACE-vuln](snyk-io-2ef4d031.jpg) I won't go into the actual problem of individual vulnerabilities today, but you can check out the dedicated [++blog post++](https://snyk.io/blog/unsafe-deserialization-snakeyaml-java-cve-2022-1471/) for more information on the \`snakeyaml\` problem. Let's focus on solving the problem and implementing the best solution. @@ -132,7 +132,7 @@ plugins { ``` I would advise everyone to go the extra mile and update their entire spring boot version to the latest appropriate version. To find out what that is, simply go to https://start.spring.io. -![blog-sprint-boot-initializer](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1701273847%2Fblog-sprint-boot-initializer.jpg&w=2560&q=75) +![blog-sprint-boot-initializer](snyk-io-ae153397.jpg) ### Updating transitive dependencies @@ -214,10 +214,10 @@ Regularly scanning your codebase proactively addresses security issues and reduc Below, I scanned my application with the [++Snyk CLI++](https://snyk.io/platform/snyk-cli/) both before and after remediation. The remediation path I chose was updating the general Spring Boot version and updating the specific version property for \`snakeyaml\`. Before: -![blog-spring-boot-21-paths](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1701273847%2Fblog-spring-boot-21-paths.jpg&w=2560&q=75) +![blog-spring-boot-21-paths](snyk-io-f7bdfd42.jpg) After: -![blog-sprint-boot-6-paths](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1701273847%2Fblog-sprint-boot-6-paths.jpg&w=2560&q=75) +![blog-sprint-boot-6-paths](snyk-io-1072c619.jpg) So, remember, when you find a vulnerability with Snyk related to a dependency in your Spring Boot application, follow these steps: diff --git a/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/snyk-io-1072c619.jpg b/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/snyk-io-1072c619.jpg new file mode 100644 index 000000000..4b81ad381 Binary files /dev/null and b/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/snyk-io-1072c619.jpg differ diff --git a/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/snyk-io-2ef4d031.jpg b/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/snyk-io-2ef4d031.jpg new file mode 100644 index 000000000..8ca4e6891 Binary files /dev/null and b/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/snyk-io-2ef4d031.jpg differ diff --git a/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/snyk-io-ae153397.jpg b/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/snyk-io-ae153397.jpg new file mode 100644 index 000000000..4bf45700e Binary files /dev/null and b/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/snyk-io-ae153397.jpg differ diff --git a/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/snyk-io-c70cd66c.jpg b/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/snyk-io-c70cd66c.jpg new file mode 100644 index 000000000..242304b78 Binary files /dev/null and b/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/snyk-io-c70cd66c.jpg differ diff --git a/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/snyk-io-f7bdfd42.jpg b/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/snyk-io-f7bdfd42.jpg new file mode 100644 index 000000000..e86c47000 Binary files /dev/null and b/content/posts/2023/12/22/handling-security-vulnerabilities-in-spring-boot/snyk-io-f7bdfd42.jpg differ diff --git a/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/flow-software-architecture-1024x438.jpg b/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/flow-software-architecture-1024x438.jpg new file mode 100644 index 000000000..7b3c5459d Binary files /dev/null and b/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/flow-software-architecture-1024x438.jpg differ diff --git a/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/flow-software-architecture-1024x438.png b/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/flow-software-architecture-1024x438.png deleted file mode 100644 index f23743de7..000000000 Binary files a/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/flow-software-architecture-1024x438.png and /dev/null differ diff --git a/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/flow-software-architecture.jpg b/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/flow-software-architecture.jpg new file mode 100644 index 000000000..350d1ffa0 Binary files /dev/null and b/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/flow-software-architecture.jpg differ diff --git a/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/flow-software-architecture.png b/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/flow-software-architecture.png deleted file mode 100644 index 77b3dcb23..000000000 Binary files a/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/flow-software-architecture.png and /dev/null differ diff --git a/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/index.md b/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/index.md index 850424148..b0c048eec 100644 --- a/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/index.md +++ b/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/index.md @@ -40,7 +40,7 @@ If no plugin fits your requirements, writing your own is possible. You can leverage APISIX on Kubernetes as an Ingress Controller. APISIX provides a Helm Chart for this. -## [![](flow-software-architecture-1024x438.png)](flow-software-architecture.png) +## [![](flow-software-architecture-1024x438.jpg)](flow-software-architecture.jpg) ## Apache ShardingSphere @@ -88,7 +88,7 @@ SeaTunnel comes with a web UI, which provides visual management of jobs, schedul * The **storage** offers an interface over a supported backend. Supported backends include ElasticSearch, H2, MySQL, TiDB, and BanyanDB, a custom storage engine developed for SkyWalking * Finally, a web **UI** allows visualizing SkyWalking's data -[![](ui_ServiceMesh-1024x527.png)](ui_ServiceMesh.png) +[![](ui_ServiceMesh-1024x527.jpg)](ui_ServiceMesh.png) Skywalking supports a couple of formats, including OpenTelemetry. Given the industry's current focus on OpenTelemetry, I recommend seriously considering this option. diff --git a/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/ui_ServiceMesh-1024x527.jpg b/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/ui_ServiceMesh-1024x527.jpg new file mode 100644 index 000000000..99ca95b0b Binary files /dev/null and b/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/ui_ServiceMesh-1024x527.jpg differ diff --git a/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/ui_ServiceMesh-1024x527.png b/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/ui_ServiceMesh-1024x527.png deleted file mode 100644 index 698d0786e..000000000 Binary files a/content/posts/2023/12/24/five-apache-projects-you-probably-havent-heard-of-yet/ui_ServiceMesh-1024x527.png and /dev/null differ diff --git a/content/posts/2023/12/28/when-should-we-move-to-microservices/aj4tjmm940wtoyc7acqc-dd992d16.jpg b/content/posts/2023/12/28/when-should-we-move-to-microservices/aj4tjmm940wtoyc7acqc-dd992d16.jpg new file mode 100644 index 000000000..b01d6d864 Binary files /dev/null and b/content/posts/2023/12/28/when-should-we-move-to-microservices/aj4tjmm940wtoyc7acqc-dd992d16.jpg differ diff --git a/content/posts/2023/12/28/when-should-we-move-to-microservices/f9a6wz5o78jdpdkob49e-1952943a.jpg b/content/posts/2023/12/28/when-should-we-move-to-microservices/f9a6wz5o78jdpdkob49e-1952943a.jpg new file mode 100644 index 000000000..46007490e Binary files /dev/null and b/content/posts/2023/12/28/when-should-we-move-to-microservices/f9a6wz5o78jdpdkob49e-1952943a.jpg differ diff --git a/content/posts/2023/12/28/when-should-we-move-to-microservices/index.md b/content/posts/2023/12/28/when-should-we-move-to-microservices/index.md index 62183ab6e..784a3e6f2 100644 --- a/content/posts/2023/12/28/when-should-we-move-to-microservices/index.md +++ b/content/posts/2023/12/28/when-should-we-move-to-microservices/index.md @@ -54,7 +54,7 @@ Most of what it means is that we need to make several big changes to the way we In an ideal world, all our operations will be simple and contained in a small microservice. The service mesh framework surrounding our microservices will handle all the global complexities and manage our individual services for us. But that isn't the real world. In reality, our Microservices might have a transactional state that carries between the services. External services might fail and for that, we need to take some unique approaches. -[![Copyright @forrestbrazeal licensed as Creative Commons BY-NC-ND](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aj4tjmm940wtoyc7acqc.png)](https://www.goodtechthings.com/marco-polo/) +[![Copyright @forrestbrazeal licensed as Creative Commons BY-NC-ND](aj4tjmm940wtoyc7acqc-dd992d16.jpg)](https://www.goodtechthings.com/marco-polo/) ### Reliance on the DevOps Team @@ -101,7 +101,7 @@ That is a successful transaction. With a regular database, this would be one tra * If deducting the funds fails we need to restore the funds, remove the recipient and remove the allocation. * Finally if adding the funds to the recipient fails we need to run all the undo operations! -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qi9pxeg2pamioeymurcs.png) +![Image description](qi9pxeg2pamioeymurcs-c13932c5.png) Another problem in Saga is illustrated in the CAP theorem. CAP stands for Consistency, Availability and Partition Tolerance. The problem is we need to pick any two… Don't get me wrong, you might have all three. But in a case of a failure you can only guarantee two. @@ -111,7 +111,7 @@ Consistency means that every read receives the most recent write on an error. Tolerance means that everything will keep working even if many messages get dropped along the way. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rexzy211esbry0eu2m03.png) +![Image description](rexzy211esbry0eu2m03-7a112026.png) This differs greatly from our historic approach to failure with transactions. @@ -179,7 +179,7 @@ Microservices will cost more. There's no way around that. There are special case The trade-offs of monolith vs. microservice are illustrated nicely in the following radar chart. Notice that this chart was designed with a large project in mind. The smaller the project, the better the picture is for the Monolith. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f9a6wz5o78jdpdkob49e.png) +![Image description](f9a6wz5o78jdpdkob49e-1952943a.jpg) Notice that Microservices deliver a benefit in larger projects in fault tolerance and team independence. But they pay a price in cost. They can reduce R\&D spend but they mostly shift it to DevOps so that isn't a major benefit. diff --git a/content/posts/2023/12/28/when-should-we-move-to-microservices/qi9pxeg2pamioeymurcs-c13932c5.png b/content/posts/2023/12/28/when-should-we-move-to-microservices/qi9pxeg2pamioeymurcs-c13932c5.png new file mode 100644 index 000000000..dfa84ca84 Binary files /dev/null and b/content/posts/2023/12/28/when-should-we-move-to-microservices/qi9pxeg2pamioeymurcs-c13932c5.png differ diff --git a/content/posts/2023/12/28/when-should-we-move-to-microservices/rexzy211esbry0eu2m03-7a112026.png b/content/posts/2023/12/28/when-should-we-move-to-microservices/rexzy211esbry0eu2m03-7a112026.png new file mode 100644 index 000000000..018356dd2 Binary files /dev/null and b/content/posts/2023/12/28/when-should-we-move-to-microservices/rexzy211esbry0eu2m03-7a112026.png differ diff --git a/content/posts/2023/12/29/securing-symmetric-encryption-algorithms-in-java/index.md b/content/posts/2023/12/29/securing-symmetric-encryption-algorithms-in-java/index.md index 7ed5943c4..2e1b7300a 100644 --- a/content/posts/2023/12/29/securing-symmetric-encryption-algorithms-in-java/index.md +++ b/content/posts/2023/12/29/securing-symmetric-encryption-algorithms-in-java/index.md @@ -94,7 +94,7 @@ Now that we've built a known insecure encryption algorithm into a project, we'll First, [++sign up for a free Snyk account++](https://app.snyk.io/login/). You can easily get started using your GitHub, Bitbucket, Azure AD, or Docker account. I then connected my GitHub repository to Snyk. Snyk Code's static analysis immediately warns me that my application uses a Broken or Risky Cryptographic Algorithm. This is spot on since I have multiple references to DES in the service above. The Snyk Code engine also advises me to consider using AES, which aligns with the advice from OWASP. -![blog-secure-encryption-priotity-score](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1697638240%2Fblog-secure-encryption-priotity-score.jpg&w=2560&q=75) +![blog-secure-encryption-priotity-score](snyk-io-56b9d005.jpg) Despite using AES in the short snippet below, I am using the CBC mode which is not considered secure. @@ -109,7 +109,7 @@ Despite using AES in the short snippet below, I am using the CBC mode which is n ``` Snyk will also identify the use of insecure modes, among other things. The screenshot below is taken from the [++Snyk plugin++](https://plugins.jetbrains.com/plugin/10972-snyk-security--code-open-source-container-iac-configurations) that scans my code inside of InteliJ IDEA and provides useful information, like external fix examples. -![blog-secure-encryption-vuln-broken](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1697638242%2Fblog-secure-encryption-vuln-broken.jpg&w=2560&q=75) +![blog-secure-encryption-vuln-broken](snyk-io-85e85c79.jpg) Changing the `EncryptionService` to a version that uses `AES/GCM/NoPadding`, like below, is a far better solution than I had before and is in line with the current advice that OWASP provides. diff --git a/content/posts/2023/12/29/securing-symmetric-encryption-algorithms-in-java/snyk-io-56b9d005.jpg b/content/posts/2023/12/29/securing-symmetric-encryption-algorithms-in-java/snyk-io-56b9d005.jpg new file mode 100644 index 000000000..aa2e73afa Binary files /dev/null and b/content/posts/2023/12/29/securing-symmetric-encryption-algorithms-in-java/snyk-io-56b9d005.jpg differ diff --git a/content/posts/2023/12/29/securing-symmetric-encryption-algorithms-in-java/snyk-io-85e85c79.jpg b/content/posts/2023/12/29/securing-symmetric-encryption-algorithms-in-java/snyk-io-85e85c79.jpg new file mode 100644 index 000000000..e19434bc0 Binary files /dev/null and b/content/posts/2023/12/29/securing-symmetric-encryption-algorithms-in-java/snyk-io-85e85c79.jpg differ diff --git a/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/ai_descriptions-2000x903-ba3beb9c.jpg b/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/ai_descriptions-2000x903-ba3beb9c.jpg new file mode 100644 index 000000000..92d3a3aad Binary files /dev/null and b/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/ai_descriptions-2000x903-ba3beb9c.jpg differ diff --git a/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/image-10-2000x1604-8922453a.jpg b/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/image-10-2000x1604-8922453a.jpg new file mode 100644 index 000000000..0767d55b4 Binary files /dev/null and b/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/image-10-2000x1604-8922453a.jpg differ diff --git a/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/image-11-85ef6031.png b/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/image-11-85ef6031.png new file mode 100644 index 000000000..f22f35042 Binary files /dev/null and b/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/image-11-85ef6031.png differ diff --git a/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/image-12-831f3459.jpg b/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/image-12-831f3459.jpg new file mode 100644 index 000000000..922453561 Binary files /dev/null and b/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/image-12-831f3459.jpg differ diff --git a/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/index.md b/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/index.md index d9fe639ad..c2d9fbb23 100644 --- a/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/index.md +++ b/content/posts/2023/12/29/using-ai-to-create-jfr-event-descriptions/index.md @@ -22,14 +22,14 @@ JFR (JDK Flight Recorder) is the default profiler for OpenJDK (see [my other blo What makes JFR stand out from the other profilers is the ability to log many, many different events that contain lots of information, like information on class loading, JIT compilation, and garbage collection. You can see a list of all available events on my [JFR Event Collection](https://sap.github.io/SapMachine/jfrevents/) website: -![](https://mostlynerdless.de/wp-content/uploads/2023/12/image-10-2000x1604.png) +![](image-10-2000x1604-8922453a.jpg) This website gives an overview of the events, with descriptions from the OpenJDK, their properties, examples, configurations, and the JDK versions in which every event is present. However, few descriptions are available, and the available texts are mostly single sentences. **TL:DR: I used GPT3.5 to create a description for every event by giving it the part of the OpenJDK source code that creates the event.** For most events, I state the lack of a description, coupled with a request that the knowledgeable reader might contribute one: -![](https://mostlynerdless.de/wp-content/uploads/2023/12/image-11.png) +![](image-11-85ef6031.png) But as you can see, there is not really any progress in creating documentation. So, I have some options left: @@ -40,7 +40,7 @@ But as you can see, there is not really any progress in creating documentation. With 1. and 2. infeasible, I started working on the AI approach, implementing it in my [JFR event collector tool](https://github.com/parttimenerd/jfreventcollector) that collects the information displayed on the website. I tried to use local AI models for this project but failed, so I started using GPT3.5-turbo and testing it on the [OpenAI ChatGPT](https://chat.openai.com/) website. The main structure of my endeavor is as follows: -![](https://mostlynerdless.de/wp-content/uploads/2023/12/ai_descriptions-2000x903.png) +![](ai_descriptions-2000x903-ba3beb9c.jpg) For every event, I first collect all usages and creations in the OpenJDK source, and then I construct a prompt of the following form that includes the surrounding context of the source locations: > Explain the JFR event \ concisely so that the reader, proficient in JFR, knows the meaning and relevance of the event to profiling and its fields, without giving code snippets or referencing the code directly, take the following code as the context of its usage and keep it short and structured @@ -115,7 +115,7 @@ But this event has also a description: Why did I choose this event, then? Because it allows you to compare the LLM generated and the OpenJDK developer's written description. Keep in mind that the LLM did not get passed the event description. The generated version is similar, yet more text. You can find my implementation on [GitHub](https://github.com/parttimenerd/jfreventcollector/blob/main/src/main/kotlin/me/bechberger/collector/AIDescriptionAdder.kt) (GPLv2.0 licensed) and the generated documentation on the [JFR Event Collection](https://sap.github.io/SapMachine/jfrevents/): -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/image-12.png)](https://sap.github.io/SapMachine/jfrevents/index.html#reservedstackactivation) +[![](image-12-831f3459.jpg)](https://sap.github.io/SapMachine/jfrevents/index.html#reservedstackactivation) ## Conclusion diff --git a/content/posts/2024/01/03/semantic-versioning-your-java-libraries/index.md b/content/posts/2024/01/03/semantic-versioning-your-java-libraries/index.md index d15360c36..4e137925a 100644 --- a/content/posts/2024/01/03/semantic-versioning-your-java-libraries/index.md +++ b/content/posts/2024/01/03/semantic-versioning-your-java-libraries/index.md @@ -5,7 +5,7 @@ lastmod: "2024-01-03T15:10:36+00:00" description: "Refine Java library versions seamlessly with Semantic Versioning, ensuring compatibility and efficient upgrades. Learn More!" authors: - "jago-de-vreede" -image: "maven.png" +image: "maven.jpg" categories: - "Java" - "Maven" diff --git a/content/posts/2024/01/03/semantic-versioning-your-java-libraries/maven.jpg b/content/posts/2024/01/03/semantic-versioning-your-java-libraries/maven.jpg new file mode 100644 index 000000000..eef584e14 Binary files /dev/null and b/content/posts/2024/01/03/semantic-versioning-your-java-libraries/maven.jpg differ diff --git a/content/posts/2024/01/03/semantic-versioning-your-java-libraries/maven.png b/content/posts/2024/01/03/semantic-versioning-your-java-libraries/maven.png deleted file mode 100644 index 1e27e76af..000000000 Binary files a/content/posts/2024/01/03/semantic-versioning-your-java-libraries/maven.png and /dev/null differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/F7hNsheWUAA0Y46-2000x1500-fdc8d4e3.jpg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/F7hNsheWUAA0Y46-2000x1500-fdc8d4e3.jpg new file mode 100644 index 000000000..df4050894 Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/F7hNsheWUAA0Y46-2000x1500-fdc8d4e3.jpg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1012-2000x1475-e8466b47.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1012-2000x1475-e8466b47.jpeg new file mode 100644 index 000000000..0db007698 Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1012-2000x1475-e8466b47.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1059-2000x1500-ebefba4c.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1059-2000x1500-ebefba4c.jpeg new file mode 100644 index 000000000..5f61618ad Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1059-2000x1500-ebefba4c.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1070-1500x2000-147344e3.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1070-1500x2000-147344e3.jpeg new file mode 100644 index 000000000..9697534bd Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1070-1500x2000-147344e3.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1138-2000x1500-a75b15f0.jpg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1138-2000x1500-a75b15f0.jpg new file mode 100644 index 000000000..36f7afe2b Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1138-2000x1500-a75b15f0.jpg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1146-1500x2000-99a6fe77.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1146-1500x2000-99a6fe77.jpeg new file mode 100644 index 000000000..f083bef8f Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1146-1500x2000-99a6fe77.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1164-2000x1500-1d70e47b.jpg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1164-2000x1500-1d70e47b.jpg new file mode 100644 index 000000000..fec5dd0ae Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1164-2000x1500-1d70e47b.jpg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1240-1500x2000-5db7da70.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1240-1500x2000-5db7da70.jpeg new file mode 100644 index 000000000..588a3cfbd Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1240-1500x2000-5db7da70.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1288-1-1500x2000-298b5442.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1288-1-1500x2000-298b5442.jpeg new file mode 100644 index 000000000..4366e3da6 Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1288-1-1500x2000-298b5442.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1288-1500x2000-94709ce0.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1288-1500x2000-94709ce0.jpeg new file mode 100644 index 000000000..4366e3da6 Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1288-1500x2000-94709ce0.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1306-2-2000x1500-9045fbca.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1306-2-2000x1500-9045fbca.jpeg new file mode 100644 index 000000000..cbab55f27 Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1306-2-2000x1500-9045fbca.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1344-3-2000x1500-43d9a713.jpg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1344-3-2000x1500-43d9a713.jpg new file mode 100644 index 000000000..248fa9f2b Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1344-3-2000x1500-43d9a713.jpg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1660-2000x1500-84e6b33c.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1660-2000x1500-84e6b33c.jpeg new file mode 100644 index 000000000..677df4985 Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1660-2000x1500-84e6b33c.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1928-2000x1500-aaa97499.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1928-2000x1500-aaa97499.jpeg new file mode 100644 index 000000000..3cab61b6b Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1928-2000x1500-aaa97499.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1938-2000x1500-25678d3b.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1938-2000x1500-25678d3b.jpeg new file mode 100644 index 000000000..0ec3894cc Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_1938-2000x1500-25678d3b.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2091-2000x1500-3d1b7439.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2091-2000x1500-3d1b7439.jpeg new file mode 100644 index 000000000..bfa9d72f1 Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2091-2000x1500-3d1b7439.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2100-44c46405.jpg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2100-44c46405.jpg new file mode 100644 index 000000000..ebc5a4eaa Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2100-44c46405.jpg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2392-2000x1500-b7d264ec.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2392-2000x1500-b7d264ec.jpeg new file mode 100644 index 000000000..a88cfc5dd Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2392-2000x1500-b7d264ec.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2406-2000x1500-5e943dcb.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2406-2000x1500-5e943dcb.jpeg new file mode 100644 index 000000000..2e5f32e63 Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2406-2000x1500-5e943dcb.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2451-2000x1500-af3eea12.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2451-2000x1500-af3eea12.jpeg new file mode 100644 index 000000000..01636d01f Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2451-2000x1500-af3eea12.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2468-2000x1500-d402b1f3.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2468-2000x1500-d402b1f3.jpeg new file mode 100644 index 000000000..33d2124fc Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2468-2000x1500-d402b1f3.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2482-2000x1500-5aff6315.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2482-2000x1500-5aff6315.jpeg new file mode 100644 index 000000000..28c64cb98 Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2482-2000x1500-5aff6315.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2506-2000x1500-9a4b5f84.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2506-2000x1500-9a4b5f84.jpeg new file mode 100644 index 000000000..5e6ebf6cd Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2506-2000x1500-9a4b5f84.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2557-2000x1500-d2bffc70.jpeg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2557-2000x1500-d2bffc70.jpeg new file mode 100644 index 000000000..facdc3014 Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2557-2000x1500-d2bffc70.jpeg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2583-2000x1500-d74b3f01.jpg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2583-2000x1500-d74b3f01.jpg new file mode 100644 index 000000000..16e83a43e Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/IMG_2583-2000x1500-d74b3f01.jpg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-15-2000x1333-82151179.jpg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-15-2000x1333-82151179.jpg new file mode 100644 index 000000000..629a60672 Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-15-2000x1333-82151179.jpg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-16-2000x1500-00cd8d98.jpg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-16-2000x1500-00cd8d98.jpg new file mode 100644 index 000000000..739a38650 Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-16-2000x1500-00cd8d98.jpg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-17-2000x1500-735fd208.jpg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-17-2000x1500-735fd208.jpg new file mode 100644 index 000000000..004bdceee Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-17-2000x1500-735fd208.jpg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-18-2000x1500-b40712c3.jpg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-18-2000x1500-b40712c3.jpg new file mode 100644 index 000000000..4c0bd8675 Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-18-2000x1500-b40712c3.jpg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-19-2000x1334-c2d532e9.jpg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-19-2000x1334-c2d532e9.jpg new file mode 100644 index 000000000..363076f5c Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-19-2000x1334-c2d532e9.jpg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-6-40b237b8.jpg b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-6-40b237b8.jpg new file mode 100644 index 000000000..9bf018380 Binary files /dev/null and b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/image-6-40b237b8.jpg differ diff --git a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/index.md b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/index.md index 64c91ae72..09c4fa148 100644 --- a/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/index.md +++ b/content/posts/2024/01/05/looking-back-on-one-year-of-speaking-and-blogging/index.md @@ -20,72 +20,72 @@ frozen: false This article is a recollection of the year's highlights. If you want a complete list of my presentations, visit my [Talks](https://mostlynerdless.de/talks/) page or the [Presentations](https://github.com/SAP/SapMachine/wiki/Presentations) page in the SapMachine Wiki. Before this year, I only gave a few presentations at my local hacker conference, [Gulaschprogrammiernacht](https://entropia.de/GPN), and two at local user groups. But then, at the end of December 2022, [Abby Bangser](https://www.infoq.com/profile/Abby-Bangser/) asked me whether I wanted to give a talk at [QCon London](https://qconlondon.com/) 2023. She apparently noticed me because I started blogging on performance topics, which only a few people do. This resulted in my first proper conference talk with the title "[Is Your Java Application Slow? Check out These Open-Source Profilers](https://www.infoq.com/presentations/profilers-open-source/)" and my InfoQ article [Unleash the Power of Open Source Java Profilers: Comparing VisualVM, JMC, and async-profiler](https://www.infoq.com/presentations/profilers-open-source/). I gave a version of this talk at almost every conference I attended. -![](https://mostlynerdless.de/wp-content/uploads/2023/12/image-15-2000x1333.png) +![](image-15-2000x1333-82151179.jpg) QCon London was a great experience, albeit I traveled via TGV and Eurostar on my birthday. It was only the second time that I'd been to London, so it was great to explore the city (and have my first article, [Writing a Profiler in 240 Lines of Pure Java](https://mostlynerdless.de/blog/2023/03/27/writing-a-profiler-in-240-lines-of-pure-java/), on the top of the hacker news front page), visiting the [British Museum](https://www.britishmuseum.org/) and walking along the Themes: -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1059-2000x1500.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1059-2000x1500.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1070-1500x2000.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1070-1500x2000.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1146-1500x2000.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1146-1500x2000.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1138-2000x1500.jpg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1138-2000x1500.jpg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1164-2000x1500.jpg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1164-2000x1500.jpg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1059-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1070-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1146-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1138-2000x1500.jpg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1164-2000x1500.jpg) +[![](IMG_1059-2000x1500-ebefba4c.jpeg)](IMG_1059-2000x1500-ebefba4c.jpeg) +[![](IMG_1070-1500x2000-147344e3.jpeg)](IMG_1070-1500x2000-147344e3.jpeg) +[![](IMG_1146-1500x2000-99a6fe77.jpeg)](IMG_1146-1500x2000-99a6fe77.jpeg) +[![](IMG_1138-2000x1500-a75b15f0.jpg)](IMG_1138-2000x1500-a75b15f0.jpg) +[![](IMG_1164-2000x1500-1d70e47b.jpg)](IMG_1164-2000x1500-1d70e47b.jpg) +![](IMG_1059-2000x1500-ebefba4c.jpeg) +![](IMG_1070-1500x2000-147344e3.jpeg) +![](IMG_1146-1500x2000-99a6fe77.jpeg) +![](IMG_1138-2000x1500-a75b15f0.jpg) +![](IMG_1164-2000x1500-1d70e47b.jpg) But this wasn't actually my first conference talk if you include my two 15-minute talks at [FOSDEM 2023](https://archive.fosdem.org/2023/) in February, one of which was based on my work on Firefox Profiler: {{< youtube HWPnzbCvua0 >}} FOSDEM is an open-source conference where a lot of different open-source communities meet: -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1012-2000x1475.jpeg) +![](IMG_1012-2000x1475-e8466b47.jpeg) The best thing about FOSDEM was meeting all the lovely [Foojay](https://foojay.io/) people at the Foojay dinner, many of whom I met again at countless other conferences, like [JavaZone](https://2023.javazone.no/) in September: -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2100.jpg) In a bar with my fellow speakers +![](IMG_2100-44c46405.jpg) In a bar with my fellow speakers But more on Oslo later. Speaking at QCon London and FOSDEM was frightening, but I learned a lot in the process, so I started submitting my talks to a few conferences and user groups, resulting in my first [Tour](https://mostlynerdless.de/blog/2023/06/15/report-of-my-small-tour-deurope/)d'Europe in May/June this year: -![](https://mostlynerdless.de/wp-content/uploads/2023/06/image-6.png) +![](image-6-40b237b8.jpg) I originally just wanted to give a talk at the JUG Milano while I was there any way on holiday with two friends. Sadly, the vacation fell through due to medical reasons, but Mario Fusco offered me a stay at his place in beautiful Gorgonzola/Milan so I could visit Milan and give my talk: -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1306-2-2000x1500.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1306-2-2000x1500.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1288-1-1500x2000.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1288-1-1500x2000.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1240-1500x2000.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1240-1500x2000.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1288-1500x2000.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1288-1500x2000.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/06/IMG_1344-3-2000x1500.jpg)](https://mostlynerdless.de/wp-content/uploads/2023/06/IMG_1344-3-2000x1500.jpg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1306-2-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1288-1-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1240-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1288-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/06/IMG_1344-3-2000x1500.jpg) +[![](IMG_1306-2-2000x1500-9045fbca.jpeg)](IMG_1306-2-2000x1500-9045fbca.jpeg) +[![](IMG_1288-1-1500x2000-298b5442.jpeg)](IMG_1288-1-1500x2000-298b5442.jpeg) +[![](IMG_1240-1500x2000-5db7da70.jpeg)](IMG_1240-1500x2000-5db7da70.jpeg) +[![](IMG_1288-1500x2000-94709ce0.jpeg)](IMG_1288-1500x2000-94709ce0.jpeg) +[![](IMG_1344-3-2000x1500-43d9a713.jpg)](IMG_1344-3-2000x1500-43d9a713.jpg) +![](IMG_1306-2-2000x1500-9045fbca.jpeg) +![](IMG_1288-1-1500x2000-298b5442.jpeg) +![](IMG_1240-1500x2000-5db7da70.jpeg) +![](IMG_1288-1500x2000-94709ce0.jpeg) +![](IMG_1344-3-2000x1500-43d9a713.jpg) It was where I gave my first presentation in Italy. It was the first time I've ever been to Italy, but I hope to return with a new talk next year. After my stop in Italy, I spoke at a [meet-up in Munich](https://www.meetup.com/openvaluemuenchen/events/293736106/), [a small conference in the Netherlands](https://jdriven.com/full-stack-conference-2023), and gave three new talks at two small conferences in Karlsruhe. All in all, I gave eight talks in around two weeks. You can read more about this endeavor in my [Report of my small Tour d'Europe](https://mostlynerdless.de/blog/2023/06/15/report-of-my-small-tour-deurope/). This was quite exhausting, so I only gave a single talk at a user group until September. But I met someone at one of the Karlsruhe conferences who told me at a dinner a month later that I should look into a new topic... In the meantime, I used August to go on a sailing vacation in Croatia (couch sailing with [Zelimir Cernelic](https://tupko.wordpress.com/)c) and had a great time despite some rumblings regarding my JEP: -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1938-2000x1500.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1938-2000x1500.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1660-2000x1500.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1660-2000x1500.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1928-2000x1500.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1928-2000x1500.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/image-16-2000x1500.png)](https://mostlynerdless.de/wp-content/uploads/2023/12/image-16-2000x1500.png) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1938-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1660-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_1928-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/image-16-2000x1500.png) +[![](IMG_1938-2000x1500-25678d3b.jpeg)](IMG_1938-2000x1500-25678d3b.jpeg) +[![](IMG_1660-2000x1500-84e6b33c.jpeg)](IMG_1660-2000x1500-84e6b33c.jpeg) +[![](IMG_1928-2000x1500-aaa97499.jpeg)](IMG_1928-2000x1500-aaa97499.jpeg) +[![](image-16-2000x1500-00cd8d98.jpg)](image-16-2000x1500-00cd8d98.jpg) +![](IMG_1938-2000x1500-25678d3b.jpeg) +![](IMG_1660-2000x1500-84e6b33c.jpeg) +![](IMG_1928-2000x1500-aaa97499.jpeg) +![](image-16-2000x1500-00cd8d98.jpg) Before the vacation, I carelessly applied to a few conferences in the fall, including [JavaZone](https://2023.javazone.no/) in Oslo and [Devoxx Belgium](https://devoxx.be/). Still, I would have never dreamed of being a speaker at both in my first year as a proper speaker. Being at JavaZone in September, followed by two smaller conferences in northern Germany, was excellent, especially with all the gorgeous food and getting my first duke: -![](https://mostlynerdless.de/wp-content/uploads/2023/09/IMG_2091-2000x1500.jpeg) +![](IMG_2091-2000x1500-3d1b7439.jpeg) You can read more on this journey in my [Report of my trip to JavaZone and northern Germany](https://mostlynerdless.de/blog/2023/09/29/report-of-my-trip-to-javazone-and-northern-germany/). Then, in October, I went to Devoxx Belgium, meeting people like Alexsey Shipilev -![](https://mostlynerdless.de/wp-content/uploads/2023/12/F7hNsheWUAA0Y46-2000x1500.jpg) Fixing a bug with Alexsey at Devoxx Belgium; see my article [JDWP, onthrow and a mysterious error](https://mostlynerdless.de/blog/2023/10/11/jdwp-onthrow-and-a-mysterious-error/) +![](F7hNsheWUAA0Y46-2000x1500-fdc8d4e3.jpg) Fixing a bug with Alexsey at Devoxx Belgium; see my article [JDWP, onthrow and a mysterious error](https://mostlynerdless.de/blog/2023/10/11/jdwp-onthrow-and-a-mysterious-error/) and eating lunch with four of the Java architects, including Brian Goetz and Alan Bateman: -![](https://mostlynerdless.de/wp-content/uploads/2023/12/image-17-2000x1500.png) +![](image-17-2000x1500-735fd208.jpg) Giving a talk at such a well-known conference was a real highlight of my year: -![](https://mostlynerdless.de/wp-content/uploads/2023/12/image-19-2000x1334.png) +![](image-19-2000x1334-c2d532e9.jpg) You can see a recording here: @@ -100,26 +100,26 @@ After Devoxx, I gave my newly created talk on Debugger internals in JUG Darmstad After these two JUGs, I went to Basel to give a talk at [Basel One](https://baselone.ch/speech.html?id=771854C5-8D91-4397-8F2D-BDC421D3CD61). After five conferences, two user groups, and eight articles, I needed a break, so I went on vacation to Bratislava, visiting a good friend there and hiking together for two days in the Tatra mountains: -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2406-2000x1500.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2406-2000x1500.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2468-2000x1500.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2468-2000x1500.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2451-2000x1500.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2451-2000x1500.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2506-2000x1500.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2506-2000x1500.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2482-2000x1500.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2482-2000x1500.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2392-2000x1500.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2392-2000x1500.jpeg) -[![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2557-2000x1500.jpeg)](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2557-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2406-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2468-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2451-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2506-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2482-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2392-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2557-2000x1500.jpeg) +[![](IMG_2406-2000x1500-5e943dcb.jpeg)](IMG_2406-2000x1500-5e943dcb.jpeg) +[![](IMG_2468-2000x1500-d402b1f3.jpeg)](IMG_2468-2000x1500-d402b1f3.jpeg) +[![](IMG_2451-2000x1500-af3eea12.jpeg)](IMG_2451-2000x1500-af3eea12.jpeg) +[![](IMG_2506-2000x1500-9a4b5f84.jpeg)](IMG_2506-2000x1500-9a4b5f84.jpeg) +[![](IMG_2482-2000x1500-5aff6315.jpeg)](IMG_2482-2000x1500-5aff6315.jpeg) +[![](IMG_2392-2000x1500-b7d264ec.jpeg)](IMG_2392-2000x1500-b7d264ec.jpeg) +[![](IMG_2557-2000x1500-d2bffc70.jpeg)](IMG_2557-2000x1500-d2bffc70.jpeg) +![](IMG_2406-2000x1500-5e943dcb.jpeg) +![](IMG_2468-2000x1500-d402b1f3.jpeg) +![](IMG_2451-2000x1500-af3eea12.jpeg) +![](IMG_2506-2000x1500-9a4b5f84.jpeg) +![](IMG_2482-2000x1500-5aff6315.jpeg) +![](IMG_2392-2000x1500-b7d264ec.jpeg) +![](IMG_2557-2000x1500-d2bffc70.jpeg) Then, at the beginning of November, I gave a talk at [J-Fall](https://jfall.nl) in the Netherlands, the biggest one-day conference in Europe: -![](https://mostlynerdless.de/wp-content/uploads/2023/12/image-18-2000x1500.png) +![](image-18-2000x1500-b40712c3.jpg) While there, I stayed with Ties van de Ven, a speaker I first met at FOSDEM. At my first conferences, I knew no other speaker; later speaker dinners felt more like reunions: -![A](https://mostlynerdless.de/wp-content/uploads/2023/12/IMG_2583-2000x1500.jpg) At the speakers' dinner at J-Fall with Simon Martinelli and Tim te Beek +![A](IMG_2583-2000x1500-d74b3f01.jpg) At the speakers' dinner at J-Fall with Simon Martinelli and Tim te Beek While I was giving presentations and writing about Java profilers and debuggers, I also wrote a five-part series on creating a Python debugger called [Let's create a debugger together](https://mostlynerdless.de/blog/tag/lets-create-a-debugger-together/), which culminated in my first presentation at my [local Python Meet-Up](https://www.meetup.com/pydata-suedwest/events/294504138/): diff --git a/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/foojay-java-tutorial-1-973x1024.jpg b/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/foojay-java-tutorial-1-973x1024.jpg new file mode 100644 index 000000000..5768fd4e1 Binary files /dev/null and b/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/foojay-java-tutorial-1-973x1024.jpg differ diff --git a/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/foojay-java-tutorial-1-973x1024.png b/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/foojay-java-tutorial-1-973x1024.png deleted file mode 100644 index bd8e84949..000000000 Binary files a/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/foojay-java-tutorial-1-973x1024.png and /dev/null differ diff --git a/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/index.md b/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/index.md index cf7f7f7b0..9082c3d34 100644 --- a/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/index.md +++ b/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/index.md @@ -29,7 +29,7 @@ Certainly! I'm Gokul the founder of JDoodle, and I have over 20 years of experie Over the years, I've transitioned through diverse roles, from engineering management and IT architecture to management consulting. Each of these positions has given me a unique perspective. I'm glad we can help Foojay with this initiative. ***Example of executable code integration with JDoodle into the [Foojay Java Quickstart Tutorial](https://foojay.io/java-quick-start/quick-start-tutorial/reading-a-text-file/):*** -![](foojay-java-tutorial-1-973x1024.png) +![](foojay-java-tutorial-1-973x1024.jpg) ***What was your initial goal when you started with JDoodle?*** @@ -48,7 +48,7 @@ Furthermore, in our constant quest to offer more value to our users, we've intro ***JDoodle supports 80+ languages and 2 databases. Those are big numbers! How did you achieve this?*** Achieving support for 76+ languages and 2 databases on JDoodle was predominantly user-driven. As I mentioned earlier, the platform's growth and direction have been significantly influenced by the needs and feedback of our users. Whenever a user reached out with a request for a new language or a feature, we took it upon ourselves to find a way to accommodate it. -![](jdoodle-supported-languages-1024x695.png) +![](jdoodle-supported-languages-1024x695.jpg) This commitment to our community's requirements and our relentless drive to cater to them led us to the extensive list of languages and databases we support today. And our mission doesn't stop here. We're continuously working to expand our offerings, and I'm excited to share that we're on track to support more than 100 languages soon. This journey is a testament to the symbiotic relationship between JDoodle and its users, where their needs shape our growth, and our platform empowers their coding journey. diff --git a/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/jdoodle-supported-languages-1024x695.jpg b/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/jdoodle-supported-languages-1024x695.jpg new file mode 100644 index 000000000..18d13dcd1 Binary files /dev/null and b/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/jdoodle-supported-languages-1024x695.jpg differ diff --git a/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/jdoodle-supported-languages-1024x695.png b/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/jdoodle-supported-languages-1024x695.png deleted file mode 100644 index 87bea9ffa..000000000 Binary files a/content/posts/2024/01/08/interview-with-gokul-chandrasekaran-the-creator-of-jdoodle/jdoodle-supported-languages-1024x695.png and /dev/null differ diff --git a/content/posts/2024/01/09/effective-cloud-native-development-eclipse-ide-open-liberty/EclipseLibertyTools3-700x429.jpg b/content/posts/2024/01/09/effective-cloud-native-development-eclipse-ide-open-liberty/EclipseLibertyTools3-700x429.jpg new file mode 100644 index 000000000..dee8be531 Binary files /dev/null and b/content/posts/2024/01/09/effective-cloud-native-development-eclipse-ide-open-liberty/EclipseLibertyTools3-700x429.jpg differ diff --git a/content/posts/2024/01/09/effective-cloud-native-development-eclipse-ide-open-liberty/EclipseLibertyTools3-700x429.png b/content/posts/2024/01/09/effective-cloud-native-development-eclipse-ide-open-liberty/EclipseLibertyTools3-700x429.png deleted file mode 100644 index 105ed9520..000000000 Binary files a/content/posts/2024/01/09/effective-cloud-native-development-eclipse-ide-open-liberty/EclipseLibertyTools3-700x429.png and /dev/null differ diff --git a/content/posts/2024/01/09/effective-cloud-native-development-eclipse-ide-open-liberty/index.md b/content/posts/2024/01/09/effective-cloud-native-development-eclipse-ide-open-liberty/index.md index bf4940194..76d7409c2 100644 --- a/content/posts/2024/01/09/effective-cloud-native-development-eclipse-ide-open-liberty/index.md +++ b/content/posts/2024/01/09/effective-cloud-native-development-eclipse-ide-open-liberty/index.md @@ -51,7 +51,7 @@ Liberty Tools automatically detects Liberty Maven or Gradle projects. These proj If you're used to using actions in the Eclipse IDE through the project explorer **Run As** option, this can also be done for the same set of actions offered through the Liberty Tools plugin (if you'd rather use this approach instead of using the dashboard). -![Screenshot of Liberty Tools run as options in the Eclipse IDE](EclipseLibertyTools3-700x429.png) +![Screenshot of Liberty Tools run as options in the Eclipse IDE](EclipseLibertyTools3-700x429.jpg) ### Rapid, iterative development with Liberty dev mode diff --git a/content/posts/2024/01/09/hello-ebpf-developing-ebpf-apps-in-java-1/image-20-e3856a18.png b/content/posts/2024/01/09/hello-ebpf-developing-ebpf-apps-in-java-1/image-20-e3856a18.png new file mode 100644 index 000000000..11fb2c6d1 Binary files /dev/null and b/content/posts/2024/01/09/hello-ebpf-developing-ebpf-apps-in-java-1/image-20-e3856a18.png differ diff --git a/content/posts/2024/01/09/hello-ebpf-developing-ebpf-apps-in-java-1/image-23-b8a15636.png b/content/posts/2024/01/09/hello-ebpf-developing-ebpf-apps-in-java-1/image-23-b8a15636.png new file mode 100644 index 000000000..1663d0837 Binary files /dev/null and b/content/posts/2024/01/09/hello-ebpf-developing-ebpf-apps-in-java-1/image-23-b8a15636.png differ diff --git a/content/posts/2024/01/09/hello-ebpf-developing-ebpf-apps-in-java-1/index.md b/content/posts/2024/01/09/hello-ebpf-developing-ebpf-apps-in-java-1/index.md index fe2d2e033..5b618057a 100644 --- a/content/posts/2024/01/09/hello-ebpf-developing-ebpf-apps-in-java-1/index.md +++ b/content/posts/2024/01/09/hello-ebpf-developing-ebpf-apps-in-java-1/index.md @@ -21,7 +21,7 @@ frozen: false This has historically been used for writing custom package filters in firewalls. Still, nowadays, it is used for monitoring and tracing, becoming an ever more critical building block of modern observability tools. To quote from [ebpf.io](https://ebpf.io/what-is-ebpf/): > -{{< img src="https://mostlynerdless.de/wp-content/uploads/2023/12/image-20.png" class="aligncenter size-full is-resized" style="width:524px;height:auto" >}} +{{< img src="image-20-e3856a18.png" class="aligncenter size-full is-resized" style="width:524px;height:auto" >}} > > Historically, the operating system has always been an ideal place to implement observability, security, and networking functionality due to the kernel's privileged ability to oversee and control the entire system. At the same time, an operating system kernel is hard to evolve due to its central role and high requirement towards stability and security. The rate of innovation at the operating system level has thus traditionally been lower compared to functionality implemented outside of the operating system.[](https://ebpf.io/static/e293240ecccb9d506587571007c36739/f2674/overview.png) @@ -39,12 +39,12 @@ But there are none for Java, which is a pity. So... I decided to write bindings *That's why I wrote [From C to Java Code using Panama](https://mostlynerdless.de/blog/2023/12/11/from-c-to-java-code-using-panama/) a few weeks ago.* Anyway, I'm starting my new blog series and eBPF library [hello-ebpf](https://github.com/parttimenerd/hello-ebpf): -![](https://mostlynerdless.de/wp-content/uploads/2023/12/text2102.png) +![](text2102.png) Let's discover eBPF together. Join me on the journey to write all examples from the [Learning eBPF book](https://cilium.isovalent.com/hubfs/Learning-eBPF%20-%20Full%20book.pdf) (get it also from [Bookshop.org](https://bookshop.org/p/books/learning-ebpf-programming-the-linux-kernel-for-enhanced-observability-networking-and-security-liz-rice/19244244?ean=9781098135126), [Amazon](https://www.amazon.com/Learning-eBPF-Programming-Observability-Networking/dp/1098135121), or [O'Reilly](https://www.oreilly.com/library/view/learning-ebpf/9781098135119/)) by Liz Rice and more in Java, implementing a Java library for eBPF along the way, with a blog series to document the journey. I highly recommend reading the book alongside my articles; for this blog post, I read the book till page 18. The project is still in its infancy, but I hope that we can eventually extend the overview image from [ebpf.io](https://ebpf.io/what-is-ebpf/) with a [duke](https://wiki.openjdk.org/display/duke/Main): -![](https://mostlynerdless.de/wp-content/uploads/2023/12/image-23.png) +![](image-23-b8a15636.png) ## Goals diff --git a/content/posts/2024/01/10/journey-of-a-java-champion-bert-jan-schrijvers-path-to-mastery-and-community-leadership/3QKuapgd38k12XDJB7Z-xXttOfcFE-2KjPOtsfL5-62036c08.png b/content/posts/2024/01/10/journey-of-a-java-champion-bert-jan-schrijvers-path-to-mastery-and-community-leadership/3QKuapgd38k12XDJB7Z-xXttOfcFE-2KjPOtsfL5-62036c08.png new file mode 100644 index 000000000..56ccfb0f8 Binary files /dev/null and b/content/posts/2024/01/10/journey-of-a-java-champion-bert-jan-schrijvers-path-to-mastery-and-community-leadership/3QKuapgd38k12XDJB7Z-xXttOfcFE-2KjPOtsfL5-62036c08.png differ diff --git a/content/posts/2024/01/10/journey-of-a-java-champion-bert-jan-schrijvers-path-to-mastery-and-community-leadership/image.jpg b/content/posts/2024/01/10/journey-of-a-java-champion-bert-jan-schrijvers-path-to-mastery-and-community-leadership/image.jpg new file mode 100644 index 000000000..61005583d Binary files /dev/null and b/content/posts/2024/01/10/journey-of-a-java-champion-bert-jan-schrijvers-path-to-mastery-and-community-leadership/image.jpg differ diff --git a/content/posts/2024/01/10/journey-of-a-java-champion-bert-jan-schrijvers-path-to-mastery-and-community-leadership/image.png b/content/posts/2024/01/10/journey-of-a-java-champion-bert-jan-schrijvers-path-to-mastery-and-community-leadership/image.png deleted file mode 100644 index 8b9e5d80e..000000000 Binary files a/content/posts/2024/01/10/journey-of-a-java-champion-bert-jan-schrijvers-path-to-mastery-and-community-leadership/image.png and /dev/null differ diff --git a/content/posts/2024/01/10/journey-of-a-java-champion-bert-jan-schrijvers-path-to-mastery-and-community-leadership/index.md b/content/posts/2024/01/10/journey-of-a-java-champion-bert-jan-schrijvers-path-to-mastery-and-community-leadership/index.md index 29bb3c3cc..e65557340 100644 --- a/content/posts/2024/01/10/journey-of-a-java-champion-bert-jan-schrijvers-path-to-mastery-and-community-leadership/index.md +++ b/content/posts/2024/01/10/journey-of-a-java-champion-bert-jan-schrijvers-path-to-mastery-and-community-leadership/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -{{< img src="image.png" class="alignright size-full" width="400" height="400" >}} +{{< img src="image.jpg" class="alignright size-full" width="400" height="400" >}} Bert Jan is CTO at [OpenValue](https://www.openvalue.eu/) and focuses on Java, software architecture, Continuous Delivery and DevOps. @@ -58,7 +58,7 @@ Obviously, community events like J-Fall, Devoxx and JavaZone play a big part the **Bert:** Do whatever works for you, but be prepared to spend time regularly catching up with the latest new developments. Personally, my main sources for this are my Twitter feed and tech conferences. Via Twitter, I get daily updates on what's new in tech. When something big is happening, this is typically tweeted about by multiple people, so big things become hard to miss. -At conferences, I try to focus on visiting talks about new things I'd like to learn about and on catching up with old and new friends, and hearing what they're working on. I think JUGs and conferences play a major role in helping developers keep up with new technology. But be aware - technology is not always about the latest, greatest and newest; it's also about delivering value with boring tech ![😉](https://lh7-us.googleusercontent.com/3QKuapgd38k12XDJB7Z-xXttOfcFE-2KjPOtsfL5_NAYa2xNtPe9UXm0v0tUiIlRReCvTmIKi-QyEJhBGd5zNBMiv0gGuyNmP0rtpBAYsUMsy2XIeIT-3RSUsBhJ8oZ3NKbinkrSMd5KvsHc03Qnnuw) +At conferences, I try to focus on visiting talks about new things I'd like to learn about and on catching up with old and new friends, and hearing what they're working on. I think JUGs and conferences play a major role in helping developers keep up with new technology. But be aware - technology is not always about the latest, greatest and newest; it's also about delivering value with boring tech ![😉](3QKuapgd38k12XDJB7Z-xXttOfcFE-2KjPOtsfL5-62036c08.png) That's why I love talks about projects leveraging a piece of technology to fulfill business goals. Everyone can get to a "hello world" stage with a new piece of tech, but when someone is sharing a year or more of experience with using a piece of tech in production, that's where I really find value in those types of talks. > *Do whatever works for you, but be prepared to spend time regularly catching up with the latest new developments.* diff --git a/content/posts/2024/01/17/payara-platform-roadmap-2024/image-4.jpg b/content/posts/2024/01/17/payara-platform-roadmap-2024/image-4.jpg new file mode 100644 index 000000000..ac5927bfd Binary files /dev/null and b/content/posts/2024/01/17/payara-platform-roadmap-2024/image-4.jpg differ diff --git a/content/posts/2024/01/17/payara-platform-roadmap-2024/image-4.png b/content/posts/2024/01/17/payara-platform-roadmap-2024/image-4.png deleted file mode 100644 index baee811d7..000000000 Binary files a/content/posts/2024/01/17/payara-platform-roadmap-2024/image-4.png and /dev/null differ diff --git a/content/posts/2024/01/17/payara-platform-roadmap-2024/index.md b/content/posts/2024/01/17/payara-platform-roadmap-2024/index.md index 676ce6881..8915e6a2c 100644 --- a/content/posts/2024/01/17/payara-platform-roadmap-2024/index.md +++ b/content/posts/2024/01/17/payara-platform-roadmap-2024/index.md @@ -108,7 +108,7 @@ At the end of 2023, we launched [our new Payara Starter](https://start.payara.fi * Performance both raw speed and resource usage * Application instrumentation and core telemetry -![](image-4.png) +![](image-4.jpg) ### [](https://info.payara.fish/hubfs/payara%20Core.png)Payara Server diff --git a/content/posts/2024/01/18/hello-ebpf-recording-data-in-basic-ebpf-maps-2/ebpf_maps-2000x425-9d972575.png b/content/posts/2024/01/18/hello-ebpf-recording-data-in-basic-ebpf-maps-2/ebpf_maps-2000x425-9d972575.png new file mode 100644 index 000000000..4c2df76c3 Binary files /dev/null and b/content/posts/2024/01/18/hello-ebpf-recording-data-in-basic-ebpf-maps-2/ebpf_maps-2000x425-9d972575.png differ diff --git a/content/posts/2024/01/18/hello-ebpf-recording-data-in-basic-ebpf-maps-2/index.md b/content/posts/2024/01/18/hello-ebpf-recording-data-in-basic-ebpf-maps-2/index.md index 5932a2e03..04a047859 100644 --- a/content/posts/2024/01/18/hello-ebpf-recording-data-in-basic-ebpf-maps-2/index.md +++ b/content/posts/2024/01/18/hello-ebpf-recording-data-in-basic-ebpf-maps-2/index.md @@ -56,7 +56,7 @@ This is what this week's article is all about. ## Communication When two regular programs want to share information, they either send data via sockets or use shared memory that both programs can access: -![](https://mostlynerdless.de/wp-content/uploads/2024/01/sockets_and_shared_mem-2000x865.png) +![](sockets_and_shared_mem-2000x865-db368419.jpg) eBPF uses none of the above two approaches: Working with sockets makes a shared state hard to maintain, and using shared memory is difficult because the eBPF program lives in the kernel and the Java program in userland. @@ -70,7 +70,7 @@ Accessing any userland memory from eBPF at all is deemed to be experimental, acc > [BPF Design Q\&A](https://www.kernel.org/doc/html/v6.6-rc5/bpf/bpf_design_QA.html#q-can-bpf-overwrite-arbitrary-user-memory)[](https://www.kernel.org/doc/html/v6.6-rc5/bpf/bpf_design_QA.html#bpf-design-q-a) But how can we then communicate? This is where eBPF maps come in: -![](https://mostlynerdless.de/wp-content/uploads/2024/01/ebpf_maps-2000x425.png) BPF 'maps' provide generic storage of different types for sharing data between kernel and user space. There are several storage types available, including hash, array, bloom filter and radix-tree. Several of the map types exist to support specific BPF helpers that perform actions based on the map contents. +![](ebpf_maps-2000x425-9d972575.png) BPF 'maps' provide generic storage of different types for sharing data between kernel and user space. There are several storage types available, including hash, array, bloom filter and radix-tree. Several of the map types exist to support specific BPF helpers that perform actions based on the map contents. > > BPF maps are accessed from user space via the `bpf` syscall, which provides commands to create maps, lookup elements, update elements and delete elements. > [LINUX Kernel Documentation](https://www.kernel.org/doc/html/latest/bpf/maps.html) diff --git a/content/posts/2024/01/18/hello-ebpf-recording-data-in-basic-ebpf-maps-2/sockets_and_shared_mem-2000x865-db368419.jpg b/content/posts/2024/01/18/hello-ebpf-recording-data-in-basic-ebpf-maps-2/sockets_and_shared_mem-2000x865-db368419.jpg new file mode 100644 index 000000000..48dcad919 Binary files /dev/null and b/content/posts/2024/01/18/hello-ebpf-recording-data-in-basic-ebpf-maps-2/sockets_and_shared_mem-2000x865-db368419.jpg differ diff --git a/content/posts/2024/01/22/controlling-led-strips-with-java-and-jbang/index.md b/content/posts/2024/01/22/controlling-led-strips-with-java-and-jbang/index.md index 41824dde0..ab3686eef 100644 --- a/content/posts/2024/01/22/controlling-led-strips-with-java-and-jbang/index.md +++ b/content/posts/2024/01/22/controlling-led-strips-with-java-and-jbang/index.md @@ -278,7 +278,7 @@ Closing /dev/ttyS0 This is only a short introduction, the [Pi4J website offers more detailed information and extra examples](https://pi4j.com/examples/jbang/), including the use of LED matrixes and a JavaFX user interface to define the colors being displayed on a LED strip. {{< gallery >}} -javafx-ui-1024x589.png +javafx-ui-1024x589.jpg matrix-line-1024x473.jpg matrix-test-1024x473.jpg {{< /gallery >}} diff --git a/content/posts/2024/01/22/controlling-led-strips-with-java-and-jbang/javafx-ui-1024x589.jpg b/content/posts/2024/01/22/controlling-led-strips-with-java-and-jbang/javafx-ui-1024x589.jpg new file mode 100644 index 000000000..ccdfc706e Binary files /dev/null and b/content/posts/2024/01/22/controlling-led-strips-with-java-and-jbang/javafx-ui-1024x589.jpg differ diff --git a/content/posts/2024/01/22/controlling-led-strips-with-java-and-jbang/javafx-ui-1024x589.png b/content/posts/2024/01/22/controlling-led-strips-with-java-and-jbang/javafx-ui-1024x589.png deleted file mode 100644 index ea3f00b3f..000000000 Binary files a/content/posts/2024/01/22/controlling-led-strips-with-java-and-jbang/javafx-ui-1024x589.png and /dev/null differ diff --git a/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/index.md b/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/index.md index 5c9213f78..3fe67de69 100644 --- a/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/index.md +++ b/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/index.md @@ -7,7 +7,7 @@ canonical: "https://mariadb.com/resources/blog/benchmark-jdbc-connectors-and-jav authors: - "diego-mariadb" - "pieter-humphrey" -image: "https://github.com/mariadb-developers/blog-images/blob/main/ops-sec1.png?raw=true" +image: "ops-sec1-9cc789b6.png" categories: - "Databases" related_posts: @@ -98,19 +98,19 @@ Notice how platform threads are created and used (pool) vs how virtual threads a Here are the benchmark results: -![](https://github.com/mariadb-developers/blog-images/blob/main/ops-sec1.png?raw=true) +![](ops-sec1-9cc789b6.png) As expected, virtual threads permit way more operations per second. To be fair, results using the platform pool of threads can perform better: I've run this test with different pool sizes, to see if the results differ. The best performance using platform threads was achieved when pool has 4 connections: -![](https://github.com/mariadb-developers/blog-images/blob/main/ops-sec2.png?raw=true) +![](ops-sec2-e19b782f.png) When using platform threads, having a smaller pool (4 connections vs 16) avoids context switching making performance better. Expectations when dealing with virtual threads are more natural: context switching for virtual threads is way less costly, so having more connections to pool just permits executing more queries simultaneously. I've run the benchmark using 16 connections with the MySQL connector too, for the MySQL Connector the performance difference wasn't that big: -![](https://github.com/mariadb-developers/blog-images/blob/main/ops-sec3.png?raw=true) +![](ops-sec3-d505b3e8.png) Virtual threads are incredible but still have some limitations. For example there's a limitation named 'pinning'—making a virtual thread blocking like a platform thread (tip: pinning can be logged using the Java option -Djdk.tracePinnedThreads=full). At the time of writing, the MySQL connector still makes intensive use of synchronized methods, making it susceptible to issues related to pinning. This explains the difference between the performance of the MariaDB connector and MySQL's connector. @@ -118,7 +118,7 @@ Virtual threads are incredible but still have some limitations. For example ther While at it, here is the benchmark achieved comparing a platform/virtual threads with JDBC connector and [MariaDB R2DBC connector](https://mariadb.com/downloads/connectors/connectors-data-access/r2dbc-connector). (Results differ to the previous one, because this was run on 2 others machines with different ping) -![](https://github.com/mariadb-developers/blog-images/blob/main/r2dbc-compare.png?raw=true) +![](r2dbc-compare-06f74759.png) R2DBC is a non-blocking connector based on specifications that differ from JDBC. This benchmark confirms that R2DBC presents a huge improvement compared to traditional threads. The main advantage of R2DBC is that it can already be used with frameworks like Spring Data R2DBC, but in terms of performance, virtual threads dethrone R2DBC. diff --git a/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/ops-sec1-9cc789b6.png b/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/ops-sec1-9cc789b6.png new file mode 100644 index 000000000..ca548cfd2 Binary files /dev/null and b/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/ops-sec1-9cc789b6.png differ diff --git a/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/ops-sec2-e19b782f.png b/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/ops-sec2-e19b782f.png new file mode 100644 index 000000000..3f60e9bae Binary files /dev/null and b/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/ops-sec2-e19b782f.png differ diff --git a/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/ops-sec3-d505b3e8.png b/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/ops-sec3-d505b3e8.png new file mode 100644 index 000000000..e88489c2c Binary files /dev/null and b/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/ops-sec3-d505b3e8.png differ diff --git a/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/r2dbc-compare-06f74759.png b/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/r2dbc-compare-06f74759.png new file mode 100644 index 000000000..e14b2b8de Binary files /dev/null and b/content/posts/2024/01/23/benchmark-jdbc-connectors-and-java-21-virtual-threads/r2dbc-compare-06f74759.png differ diff --git a/content/posts/2024/01/25/java-flight-recording-and-analysis-with-azul-mission-control/azul-mission-control-screenshot-1024x534.jpg b/content/posts/2024/01/25/java-flight-recording-and-analysis-with-azul-mission-control/azul-mission-control-screenshot-1024x534.jpg new file mode 100644 index 000000000..a94888b8a Binary files /dev/null and b/content/posts/2024/01/25/java-flight-recording-and-analysis-with-azul-mission-control/azul-mission-control-screenshot-1024x534.jpg differ diff --git a/content/posts/2024/01/25/java-flight-recording-and-analysis-with-azul-mission-control/azul-mission-control-screenshot-1024x534.png b/content/posts/2024/01/25/java-flight-recording-and-analysis-with-azul-mission-control/azul-mission-control-screenshot-1024x534.png deleted file mode 100644 index 392bb4c93..000000000 Binary files a/content/posts/2024/01/25/java-flight-recording-and-analysis-with-azul-mission-control/azul-mission-control-screenshot-1024x534.png and /dev/null differ diff --git a/content/posts/2024/01/25/java-flight-recording-and-analysis-with-azul-mission-control/index.md b/content/posts/2024/01/25/java-flight-recording-and-analysis-with-azul-mission-control/index.md index de47ec397..0c8feb4ca 100644 --- a/content/posts/2024/01/25/java-flight-recording-and-analysis-with-azul-mission-control/index.md +++ b/content/posts/2024/01/25/java-flight-recording-and-analysis-with-azul-mission-control/index.md @@ -25,7 +25,7 @@ frozen: false By utilizing JFR, you gain valuable insights into the runtime behavior of your Java applications. It helps you to optimize performance, identify and troubleshoot issues, and ensure better overall reliability. JFR is designed with very low overhead, allowing its use in production environments with minimal impact on the performance of your application. You can use a JFR recording to examine your application with various tools, such as Azul Mission Control. -![](azul-mission-control-screenshot-1024x534.png) +![](azul-mission-control-screenshot-1024x534.jpg) ## Azul Mission Control diff --git a/content/posts/2024/01/26/book-review-tidy-first/index.md b/content/posts/2024/01/26/book-review-tidy-first/index.md index 6d5d73943..9670f0cc2 100644 --- a/content/posts/2024/01/26/book-review-tidy-first/index.md +++ b/content/posts/2024/01/26/book-review-tidy-first/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![Tidy first](https://learning.oreilly.com/library/cover/9781098151232/250w/) +![Tidy first](learning-oreilly-com-a8475420.jpg) price: €39.99 for the eBook diff --git a/content/posts/2024/01/26/book-review-tidy-first/learning-oreilly-com-a8475420.jpg b/content/posts/2024/01/26/book-review-tidy-first/learning-oreilly-com-a8475420.jpg new file mode 100644 index 000000000..51a4ff1de Binary files /dev/null and b/content/posts/2024/01/26/book-review-tidy-first/learning-oreilly-com-a8475420.jpg differ diff --git a/content/posts/2024/01/31/javafx-links-of-january-2024/index.md b/content/posts/2024/01/31/javafx-links-of-january-2024/index.md index 6b03366b4..a7c6757c1 100644 --- a/content/posts/2024/01/31/javafx-links-of-january-2024/index.md +++ b/content/posts/2024/01/31/javafx-links-of-january-2024/index.md @@ -6,7 +6,7 @@ description: "This is the first JavaFX LinksOfTheMonth review for 2024, an overv canonical: "https://webtechie.be/post/2024-01-26-javafx-links-of-january-2024/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2024/01/31/javafx-links-of-january-2024/jfxcentral.jpg b/content/posts/2024/01/31/javafx-links-of-january-2024/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2024/01/31/javafx-links-of-january-2024/jfxcentral.jpg differ diff --git a/content/posts/2024/01/31/javafx-links-of-january-2024/jfxcentral.png b/content/posts/2024/01/31/javafx-links-of-january-2024/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2024/01/31/javafx-links-of-january-2024/jfxcentral.png and /dev/null differ diff --git a/content/posts/2024/02/02/hello-ebpf-recording-data-in-event-buffers-3/index.md b/content/posts/2024/02/02/hello-ebpf-recording-data-in-event-buffers-3/index.md index 6342ccf38..15a8dff76 100644 --- a/content/posts/2024/02/02/hello-ebpf-recording-data-in-event-buffers-3/index.md +++ b/content/posts/2024/02/02/hello-ebpf-recording-data-in-event-buffers-3/index.md @@ -5,7 +5,7 @@ lastmod: "2024-02-02T14:45:03+00:00" description: "How to use another kind of eBPF maps, the perf event buffer, and run tests with docker and JUnit 5." authors: - "johannes-bechberger" -image: "https://mostlynerdless.de/wp-content/uploads/2024/01/perf_event_buffer.png" +image: "perf_event_buffer-52d5107b.png" categories: - "Java" - "Observability" @@ -29,7 +29,7 @@ This week, I'll show you briefly how to use another kind of eBPF maps, the perf Data structures, like the hash map described in the previous article, are great for storing data but have their limitation when we want to pass new bits of information continuously from the eBPF program to our user-land application. This is especially pertinent when recording performance events. So, [in 2015, the Linux kernel got a new map type](https://github.com/torvalds/linux/commit/457f44363a8894135c85b7a9afd2bd8196db24ab): `BPF_MAP_TYPE_PERF_EVENT_ARRAY`. This map type functions as a fixed-size ring buffer that can store elements of a given size and is allocated per CPU. The eBPF program submits data to the buffer, and the user-land application retrieves it. When the buffer is full, data can't be submitted, and a drop counter is incremented. -![](https://mostlynerdless.de/wp-content/uploads/2024/01/perf_event_buffer.png) +![](perf_event_buffer-52d5107b.png) *Perf Event Buffers have their issues, as explained by [Andrii Nakryiko](https://nakryiko.com/posts/bpf-ringbuf/), so in* [2020](https://github.com/torvalds/linux/commit/bf99c936f9478a05d51e9f101f90de70bee9a89c),*[eBPF got ring buffers](https://www.kernel.org/doc/html/latest/bpf/ringbuf.html), which have less overhead. Perf Event Buffers are still used, as only Linux 5.8 and above supports ring buffers. It doesn't make a difference for our toy examples, but I'll show you how to use ring buffers in a few weeks.* diff --git a/content/posts/2024/02/02/hello-ebpf-recording-data-in-event-buffers-3/perf_event_buffer-52d5107b.png b/content/posts/2024/02/02/hello-ebpf-recording-data-in-event-buffers-3/perf_event_buffer-52d5107b.png new file mode 100644 index 000000000..d7206d5f7 Binary files /dev/null and b/content/posts/2024/02/02/hello-ebpf-recording-data-in-event-buffers-3/perf_event_buffer-52d5107b.png differ diff --git a/content/posts/2024/02/12/is-jdwps-onjcmd-feature-worth-using/Figure_1-1-420aa1b3.png b/content/posts/2024/02/12/is-jdwps-onjcmd-feature-worth-using/Figure_1-1-420aa1b3.png new file mode 100644 index 000000000..8dfd6872f Binary files /dev/null and b/content/posts/2024/02/12/is-jdwps-onjcmd-feature-worth-using/Figure_1-1-420aa1b3.png differ diff --git a/content/posts/2024/02/12/is-jdwps-onjcmd-feature-worth-using/Figure_1-2-2000x1500-3124717d.png b/content/posts/2024/02/12/is-jdwps-onjcmd-feature-worth-using/Figure_1-2-2000x1500-3124717d.png new file mode 100644 index 000000000..3de29e241 Binary files /dev/null and b/content/posts/2024/02/12/is-jdwps-onjcmd-feature-worth-using/Figure_1-2-2000x1500-3124717d.png differ diff --git a/content/posts/2024/02/12/is-jdwps-onjcmd-feature-worth-using/Figure_1-3-2000x1500-fb2846af.png b/content/posts/2024/02/12/is-jdwps-onjcmd-feature-worth-using/Figure_1-3-2000x1500-fb2846af.png new file mode 100644 index 000000000..207e9acac Binary files /dev/null and b/content/posts/2024/02/12/is-jdwps-onjcmd-feature-worth-using/Figure_1-3-2000x1500-fb2846af.png differ diff --git a/content/posts/2024/02/12/is-jdwps-onjcmd-feature-worth-using/index.md b/content/posts/2024/02/12/is-jdwps-onjcmd-feature-worth-using/index.md index 61ff10dfa..316230305 100644 --- a/content/posts/2024/02/12/is-jdwps-onjcmd-feature-worth-using/index.md +++ b/content/posts/2024/02/12/is-jdwps-onjcmd-feature-worth-using/index.md @@ -69,7 +69,7 @@ Summary ``` You can see that the run-time difference between "with JDWP" and "with onjcmd" is 0.5s, way below the standard deviations of both benchmarks. Plotting the benchmark results using box plots visualizes this fact: -![](https://mostlynerdless.de/wp-content/uploads/2024/02/Figure_1-1.png) +![](Figure_1-1-420aa1b3.png) Or, more analytically, [Welch's t-test](https://en.wikipedia.org/wiki/Welch's_t-test) doesn't rule out the possibility of both benchmarks producing the same run-time distribution with p=0.5. There is, therefore, no measurable effect on the performance if we use the onjcmd feature. But what we do notice is that enabling the JDWP agent results in an increase in the run-time by 4%. @@ -97,7 +97,7 @@ Summary 1.51 ± 0.09 times faster than "with JDWP" ``` -![](https://mostlynerdless.de/wp-content/uploads/2024/02/Figure_1-2-2000x1500.png) +![](Figure_1-2-2000x1500-3124717d.png) We excluded the finagle-chirper sub-benchmark here, as it causes the run-time to increase drastically. The sub-benchmark alone does not cause any problems, so the GC run possibly causes the performance hit before the sub-benchmark, which cleans up after the dotty sub-benchmark. Dotty is run directly before finagle-chirper. @@ -136,7 +136,7 @@ Summary 1.07 ± 0.02 times faster than "with JDWP" ``` -![](https://mostlynerdless.de/wp-content/uploads/2024/02/Figure_1-3-2000x1500.png) +![](Figure_1-3-2000x1500-fb2846af.png) This clearly shows the significant impact of the change. 11.0.3 came out on Apr 18, 2019, and 11.0.9 on Jul 15, 2020, so the onjcmd improved on-demand debugging for almost a year. diff --git a/content/posts/2024/02/13/dtrace-revisited-advanced-debugging-techniques/index.md b/content/posts/2024/02/13/dtrace-revisited-advanced-debugging-techniques/index.md index cebbd580a..cf01108c4 100644 --- a/content/posts/2024/02/13/dtrace-revisited-advanced-debugging-techniques/index.md +++ b/content/posts/2024/02/13/dtrace-revisited-advanced-debugging-techniques/index.md @@ -232,11 +232,11 @@ Let's say you're facing elevated disk write issues that are causing the performa rwbypid.d can help you with that, it can generate a list of processes and the number of calls they have for read/write based on the process id as seen in the following screenshot: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qb5v35jg9mtqp8ianffx.png) +![Image description](qb5v35jg9mtqp8ianffx-bef98094.png) We can use this information to better understand IO issues in our code or even in 3rd party applications/libraries. `iosnoop` is another tool that helps us track IO operations but with more details: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mhsosdd39vgz5mzu70ge.png) +![Image description](mhsosdd39vgz5mzu70ge-ca522b83.png) In diagnosing elusive system issues, DTrace shines by enabling detailed observation of system calls, file operations, and network activities. For instance, it can be used to uncover the root cause of unexpected system behaviors or to trace the origin of security breaches, offering a level of detail that is often unattainable with other debugging tools. diff --git a/content/posts/2024/02/13/dtrace-revisited-advanced-debugging-techniques/mhsosdd39vgz5mzu70ge-ca522b83.png b/content/posts/2024/02/13/dtrace-revisited-advanced-debugging-techniques/mhsosdd39vgz5mzu70ge-ca522b83.png new file mode 100644 index 000000000..c04c70cb6 Binary files /dev/null and b/content/posts/2024/02/13/dtrace-revisited-advanced-debugging-techniques/mhsosdd39vgz5mzu70ge-ca522b83.png differ diff --git a/content/posts/2024/02/13/dtrace-revisited-advanced-debugging-techniques/qb5v35jg9mtqp8ianffx-bef98094.png b/content/posts/2024/02/13/dtrace-revisited-advanced-debugging-techniques/qb5v35jg9mtqp8ianffx-bef98094.png new file mode 100644 index 000000000..8a136ea48 Binary files /dev/null and b/content/posts/2024/02/13/dtrace-revisited-advanced-debugging-techniques/qb5v35jg9mtqp8ianffx-bef98094.png differ diff --git a/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/ai-spec-700x492.jpg b/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/ai-spec-700x492.jpg new file mode 100644 index 000000000..bb2aed6f9 Binary files /dev/null and b/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/ai-spec-700x492.jpg differ diff --git a/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/ai-spec-700x492.png b/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/ai-spec-700x492.png deleted file mode 100644 index 9d2df3c64..000000000 Binary files a/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/ai-spec-700x492.png and /dev/null differ diff --git a/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/index.md b/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/index.md index 79d1b9dbb..643b13833 100644 --- a/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/index.md +++ b/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/index.md @@ -96,7 +96,7 @@ And for reasons mainly of ethical consideration and on how to engage with whole Mostly now, the access and usage of an AI systems is managed by individual or additional license restriction. -![](llama-2-700x458.png) +![](llama-2-700x458.jpg) But this imposes barriers against use, difficulties to adopt and improve, problem in control over the technology and weak oversight and transparency. @@ -111,7 +111,7 @@ What we need is: Open-Source shows that when you eliminate the obstacles to learning, using, sharing and enhancing software systems, everyone benefits. These benefits come from using licenses that follow the Open-Source Definition. The benefits can be expressed as autonomy, transparency, and cooperative improvement. They are necessary for everyone in AI. We need basic freedoms to help users create and use AI systems that are trustworthy and clear.(Reference #4) -![](ai-spec-700x492.png) +![](ai-spec-700x492.jpg) The current draft version is here \> [The Open Source AI Definition – draft v. 0.0.5 – Open Source Initiative](https://opensource.org/deepdive/drafts/the-open-source-ai-definition-draft-v-0-0-5/ "The Open Source AI Definition – draft v. 0.0.5 – Open Source Initiative") and it follows the definition of AI system adopted by the Organization for Economic and Co-operation Development (OECD). @@ -125,11 +125,11 @@ For each AI systems (such as Pythia, Llama, BLOOM, Mistral, Phi2, Olmo etc.) the The plan and schedule of Open Initiative about this spec is to have a release candidate (RC) at the end of October'24. -![](timeline-700x390.png) +![](timeline-700x390.jpg) Stakeholders engaged in this varies from system and license creators, regulators, end users and the subject. -![](stakeholders-700x392.png) +![](stakeholders-700x392.jpg) Ongoing and following tasks of this spec for Open-Source Initiative are: diff --git a/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/llama-2-700x458.jpg b/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/llama-2-700x458.jpg new file mode 100644 index 000000000..89f0100f6 Binary files /dev/null and b/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/llama-2-700x458.jpg differ diff --git a/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/llama-2-700x458.png b/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/llama-2-700x458.png deleted file mode 100644 index 1443b7bc1..000000000 Binary files a/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/llama-2-700x458.png and /dev/null differ diff --git a/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/stakeholders-700x392.jpg b/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/stakeholders-700x392.jpg new file mode 100644 index 000000000..09b16cb1c Binary files /dev/null and b/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/stakeholders-700x392.jpg differ diff --git a/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/stakeholders-700x392.png b/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/stakeholders-700x392.png deleted file mode 100644 index 3bdd95bc9..000000000 Binary files a/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/stakeholders-700x392.png and /dev/null differ diff --git a/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/timeline-700x390.jpg b/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/timeline-700x390.jpg new file mode 100644 index 000000000..288bad4dd Binary files /dev/null and b/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/timeline-700x390.jpg differ diff --git a/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/timeline-700x390.png b/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/timeline-700x390.png deleted file mode 100644 index 03b4ce304..000000000 Binary files a/content/posts/2024/02/15/state-of-open-source-and-free-ai-a-fosdem-recap/timeline-700x390.png and /dev/null differ diff --git a/content/posts/2024/02/21/cloud-cost-optimization-is-hard-java-can-help/CCO-Blog-Chart-2-768x668-e2b91fb6.jpg b/content/posts/2024/02/21/cloud-cost-optimization-is-hard-java-can-help/CCO-Blog-Chart-2-768x668-e2b91fb6.jpg new file mode 100644 index 000000000..3d7aece3c Binary files /dev/null and b/content/posts/2024/02/21/cloud-cost-optimization-is-hard-java-can-help/CCO-Blog-Chart-2-768x668-e2b91fb6.jpg differ diff --git a/content/posts/2024/02/21/cloud-cost-optimization-is-hard-java-can-help/Screenshot-2023-12-13-at-9.49.27-E2-80-A-88401ed5.png b/content/posts/2024/02/21/cloud-cost-optimization-is-hard-java-can-help/Screenshot-2023-12-13-at-9.49.27-E2-80-A-88401ed5.png new file mode 100644 index 000000000..b3a38aece Binary files /dev/null and b/content/posts/2024/02/21/cloud-cost-optimization-is-hard-java-can-help/Screenshot-2023-12-13-at-9.49.27-E2-80-A-88401ed5.png differ diff --git a/content/posts/2024/02/21/cloud-cost-optimization-is-hard-java-can-help/index.md b/content/posts/2024/02/21/cloud-cost-optimization-is-hard-java-can-help/index.md index b60bf9536..35fd47ddd 100644 --- a/content/posts/2024/02/21/cloud-cost-optimization-is-hard-java-can-help/index.md +++ b/content/posts/2024/02/21/cloud-cost-optimization-is-hard-java-can-help/index.md @@ -33,7 +33,7 @@ Users see the potential benefits immediately. There is no capital expenditure to ## Controlling overspending is hard Unfortunately, many users never realize those cost savings, and cloud costs often prove even more expensive. -![Cloud Cost Optimization is hard for Java Workloads: reasons for overspending](https://www.azul.com/wp-content/uploads/Screenshot-2023-12-13-at-9.49.27%E2%80%AFAM-1024x592.png) Source: S\&P Global +![Cloud Cost Optimization is hard for Java Workloads: reasons for overspending](Screenshot-2023-12-13-at-9.49.27-E2-80-A-88401ed5.png) Source: S\&P Global In fact, in a [recent survey by S\&P Global Market Research](https://www.youtube.com/watch?v=nAP3bYxdsZw&t=1s), 27% of respondents said scaling up resources to address unanticipated demand and spend was the biggest reason for overspending on IaaS/PaaS/[public cloud](https://www.azul.com/glossary/public-cloud/) in 2022. Another 15% cited over-provisioning – or committing more resources than needed. @@ -54,7 +54,7 @@ With JVM-based applications, when new service instances start, the warmup time d ## Switching your Java runtime helps reduce cloud waste The good news is that Azul is adapting the Java platform to make applications run faster and address these issues. -![Cloud Cost Optimization is hard for Java Workloads: ReadyNow Latency Line Chart](https://www.azul.com/wp-content/uploads/Latency-Line-Chart-min.jpg) +![Cloud Cost Optimization is hard for Java Workloads: ReadyNow Latency Line Chart](Latency-Line-Chart-min.jpg) We've developed a high-performance version of the JVM called Azul Platform Prime. This Java runtime addresses users' frequent pain points regarding cloud cost optimization for Java workloads and JVM performance: latency associated with garbage collection (GC), throughput of transactions, and warmup time. @@ -66,7 +66,7 @@ Azul Platform Prime includes three areas of change: * [The Falcon JIT compiler](https://www.azul.com/products/components/falcon-jit-compiler/). Based on the open-source LLVM project, Falcon delivers superior transaction throughput via enhanced optimizations tailored to the hardware microarchitecture. This is another way to deliver cloud cost reductions. For example, you can process up to 40% more transactions per second when running the Kafka event streaming platform. You can reduce the size of nodes in your cluster, the number of nodes, or both while still meeting your SLA. Fewer nodes and smaller nodes equal less cloud spend. * [ReadyNow warmup elimination technology](https://www.azul.com/products/components/readynow). When you have run your application or service until all frequently used code has been compiled and optimized, ReadyNow records a profile that includes all information about the compilation that has been performed, including the code generated. When the application or service starts again, the JVM uses the profile to ensure all code is compiled and ready to go before the application code starts to execute. -![Cloud Cost Optimization is hard for Java Workloads: Unused operational compute capacity](https://www.azul.com/wp-content/uploads/CCO-Blog-Chart-2-768x668.png) +![Cloud Cost Optimization is hard for Java Workloads: Unused operational compute capacity](CCO-Blog-Chart-2-768x668-e2b91fb6.jpg) ## Ready for a deeper dive? diff --git a/content/posts/2024/02/22/12-lessons-learned-from-doing-the-one-billion-row-challenge/1brc-flameview2-1024x421.jpg b/content/posts/2024/02/22/12-lessons-learned-from-doing-the-one-billion-row-challenge/1brc-flameview2-1024x421.jpg new file mode 100644 index 000000000..712813639 Binary files /dev/null and b/content/posts/2024/02/22/12-lessons-learned-from-doing-the-one-billion-row-challenge/1brc-flameview2-1024x421.jpg differ diff --git a/content/posts/2024/02/22/12-lessons-learned-from-doing-the-one-billion-row-challenge/1brc-flameview2-1024x421.png b/content/posts/2024/02/22/12-lessons-learned-from-doing-the-one-billion-row-challenge/1brc-flameview2-1024x421.png deleted file mode 100644 index 23d053b09..000000000 Binary files a/content/posts/2024/02/22/12-lessons-learned-from-doing-the-one-billion-row-challenge/1brc-flameview2-1024x421.png and /dev/null differ diff --git a/content/posts/2024/02/22/12-lessons-learned-from-doing-the-one-billion-row-challenge/index.md b/content/posts/2024/02/22/12-lessons-learned-from-doing-the-one-billion-row-challenge/index.md index 8c4f3ba45..1c7cd0163 100644 --- a/content/posts/2024/02/22/12-lessons-learned-from-doing-the-one-billion-row-challenge/index.md +++ b/content/posts/2024/02/22/12-lessons-learned-from-doing-the-one-billion-row-challenge/index.md @@ -126,7 +126,7 @@ The 1BRC project includes a [weather_stations.csv](https://github.com/gunnarmorl ## My implementation My strategy here was to start with the K.I.S.S. (Keep It Simple Stupid) optimization first and profile for bottlenecks. Using JFR to profile gave me some ideas on where to profile but it didn't result in the expected win quite often. -![](1brc-flameview2-1024x421.png) *-XX:StartFlightRecording=duration=15s,settings=profile,name=CalculateAverage_japplis,filename=flight-recorder.jfr,dumponexit=true* +![](1brc-flameview2-1024x421.jpg) *-XX:StartFlightRecording=duration=15s,settings=profile,name=CalculateAverage_japplis,filename=flight-recorder.jfr,dumponexit=true* And *-Dorg.eclipse.swt.browser.DefaultType=edge* in jmc.ini on Windows What you don't see in the proposed solutions are also the many attempts and code that were producing less performance. diff --git a/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/image-1-1.jpg b/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/image-1-1.jpg new file mode 100644 index 000000000..dcfeabdfb Binary files /dev/null and b/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/image-1-1.jpg differ diff --git a/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/image-1-1.png b/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/image-1-1.png deleted file mode 100644 index b6b7339f9..000000000 Binary files a/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/image-1-1.png and /dev/null differ diff --git a/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/image-1-c98b0758.jpg b/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/image-1-c98b0758.jpg new file mode 100644 index 000000000..dcfeabdfb Binary files /dev/null and b/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/image-1-c98b0758.jpg differ diff --git a/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/index.md b/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/index.md index f5fd271bc..0d70aed23 100644 --- a/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/index.md +++ b/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/index.md @@ -5,7 +5,7 @@ lastmod: "2024-02-23T08:44:52+00:00" description: "This week, we use tail calls and create our first application using hello-ebpf as a library." authors: - "johannes-bechberger" -image: "image-1-1.png" +image: "image-1-1.jpg" categories: - "Tools" related_posts: @@ -29,7 +29,7 @@ Regular C programs are divided into functions that call each other; so far in th > [bpf: introduce function calls](https://lwn.net/Articles/741773/) by Alexei Starovoitov Before this change, you had to inline the functions essentially. There is just one problem with this approach: Every new function call takes space on the stack for its call frame that contains its parameters and local variables: -![](https://mostlynerdless.de/wp-content/uploads/2024/02/tail_call-2000x599.png) +![](tail_call-2000x599-e54ab6e9.jpg) The maximum stack size is limited to [512 bytes](https://github.com/torvalds/linux/blob/841c35169323cd833294798e58b9bf63fa4fa1de/tools/include/linux/filter.h#L28), so every call frame counts for larger eBPF programs. Modern compilers will, therefore, try to inline the function calls and save space. To reduce the required stack memory, we have essentially two options besides inlining: We can either use static variables or tail calls. Andrii Nakryiko describes the former: > Starting with Linux 5.2, [d8eca5bbb2be ("bpf: implement lookup-free direct value access for maps")](https://github.com/torvalds/linux/commit/d8eca5bbb2be9) adds support for BPF global (and static) variables, which we are going to use here to get rid of on-the-stack array. @@ -40,7 +40,7 @@ Declaring a variable as static, e.g. `static int x`, means that the value is sto ## Tail Calls Now to tail calls. If the function calls another function directly before returning (or as an argument to the return statement), then the call frames can be replaced. This is called a tail call and avoids growing the stack. In eBPF, it is possible to tail call one eBPF program (entry function that gets passed a context) from another program: -![](https://mostlynerdless.de/wp-content/uploads/2024/02/image-1.png) From [ebpf.io](https://ebpf.io/what-is-ebpf/#tail--function-calls)'s section on tail calls +![](image-1-c98b0758.jpg) From [ebpf.io](https://ebpf.io/what-is-ebpf/#tail--function-calls)'s section on tail calls A tail call is achieved by storing the other program in a program array, which maps a 4-byte int to an eBPF program. The kernel function **bpf_tail_call**`(ctx, program_array, index)` can then be used to call a specific program: > This special helper is used to trigger a "tail call", or in other words, to jump into another eBPF program. The same stack frame is used (but values on stack and in registers for the caller are not accessible to the callee). This mechanism allows for program chaining, either for raising the maximum number of available eBPF instructions, or to execute given programs in conditional blocks. For security reasons, there is an upper limit to the number of successive tail calls that can be performed. diff --git a/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/tail_call-2000x599-e54ab6e9.jpg b/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/tail_call-2000x599-e54ab6e9.jpg new file mode 100644 index 000000000..a3d7739a7 Binary files /dev/null and b/content/posts/2024/02/23/hello-ebpf-tail-calls-and-your-first-ebpf-application-4/tail_call-2000x599-e54ab6e9.jpg differ diff --git a/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/Featured_1280x720_x2-1200x675-2-700x394-1.jpg b/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/Featured_1280x720_x2-1200x675-2-700x394-1.jpg new file mode 100644 index 000000000..4dad9ad83 Binary files /dev/null and b/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/Featured_1280x720_x2-1200x675-2-700x394-1.jpg differ diff --git a/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/Featured_1280x720_x2-1200x675-2-700x394-1.png b/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/Featured_1280x720_x2-1200x675-2-700x394-1.png deleted file mode 100644 index 50ecdf5d0..000000000 Binary files a/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/Featured_1280x720_x2-1200x675-2-700x394-1.png and /dev/null differ diff --git a/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/Featured_1280x720_x2-1200x675-2-700x394.jpg b/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/Featured_1280x720_x2-1200x675-2-700x394.jpg new file mode 100644 index 000000000..4dad9ad83 Binary files /dev/null and b/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/Featured_1280x720_x2-1200x675-2-700x394.jpg differ diff --git a/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/Featured_1280x720_x2-1200x675-2-700x394.png b/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/Featured_1280x720_x2-1200x675-2-700x394.png deleted file mode 100644 index 50ecdf5d0..000000000 Binary files a/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/Featured_1280x720_x2-1200x675-2-700x394.png and /dev/null differ diff --git a/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/index.md b/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/index.md index b8d1461e4..366536e58 100644 --- a/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/index.md +++ b/content/posts/2024/02/27/youre-invited-to-intellij-idea-conf-2024/index.md @@ -5,7 +5,7 @@ lastmod: "2024-02-27T08:21:01+00:00" description: "We are back and excited to invite you to IntelliJ IDEA Conf 2024, a developer-focused, live, online event that is free for all to attend!" authors: - "irina-maryasova" -image: "Featured_1280x720_x2-1200x675-2-700x394-1.png" +image: "Featured_1280x720_x2-1200x675-2-700x394-1.jpg" categories: - "Developer Tools" - "Events" @@ -27,7 +27,7 @@ You'll be able to learn about a variety of topics, like Core Java, Kotlin, Java You'll also learn more about IntelliJ IDEA performance enhancements, JetBrains AI Assistant, IntelliJ IDEA's database support, and tips and tricks to make you more productive. -![](Featured_1280x720_x2-1200x675-2-700x394.png) +![](Featured_1280x720_x2-1200x675-2-700x394.jpg) [Conference Details and Registration](https://lp.jetbrains.com/intellij-idea-conf-2024/?utm_source=partners&utm_medium=foojay&utm_campaign=intellijideaconf "Conference Details and Registration") diff --git a/content/posts/2024/02/28/builders-withers-and-records-javas-path-to-immutability/index.md b/content/posts/2024/02/28/builders-withers-and-records-javas-path-to-immutability/index.md index d64e20d88..b4c9bbb34 100644 --- a/content/posts/2024/02/28/builders-withers-and-records-javas-path-to-immutability/index.md +++ b/content/posts/2024/02/28/builders-withers-and-records-javas-path-to-immutability/index.md @@ -5,7 +5,7 @@ lastmod: "2024-03-06T11:01:56+00:00" description: "Immutability in Java with creational patterns Builders and Withers, along with a new type of immutable object in Java: Records." authors: - "jonathan-vila" -image: "sonarlint.png" +image: "sonarlint.jpg" categories: - "Java" - "Java Core" diff --git a/content/posts/2024/02/28/builders-withers-and-records-javas-path-to-immutability/sonarlint.jpg b/content/posts/2024/02/28/builders-withers-and-records-javas-path-to-immutability/sonarlint.jpg new file mode 100644 index 000000000..e6e112430 Binary files /dev/null and b/content/posts/2024/02/28/builders-withers-and-records-javas-path-to-immutability/sonarlint.jpg differ diff --git a/content/posts/2024/02/28/builders-withers-and-records-javas-path-to-immutability/sonarlint.png b/content/posts/2024/02/28/builders-withers-and-records-javas-path-to-immutability/sonarlint.png deleted file mode 100644 index 3e8e0812c..000000000 Binary files a/content/posts/2024/02/28/builders-withers-and-records-javas-path-to-immutability/sonarlint.png and /dev/null differ diff --git a/content/posts/2024/02/29/javafx-links-of-february-2024/index.md b/content/posts/2024/02/29/javafx-links-of-february-2024/index.md index 9b21be834..2c9bd2792 100644 --- a/content/posts/2024/02/29/javafx-links-of-february-2024/index.md +++ b/content/posts/2024/02/29/javafx-links-of-february-2024/index.md @@ -6,7 +6,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of February 202 canonical: "https://webtechie.be/post/2024-02-28-javafx-links-of-february-2024/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2024/02/29/javafx-links-of-february-2024/jfxcentral.jpg b/content/posts/2024/02/29/javafx-links-of-february-2024/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2024/02/29/javafx-links-of-february-2024/jfxcentral.jpg differ diff --git a/content/posts/2024/02/29/javafx-links-of-february-2024/jfxcentral.png b/content/posts/2024/02/29/javafx-links-of-february-2024/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2024/02/29/javafx-links-of-february-2024/jfxcentral.png and /dev/null differ diff --git a/content/posts/2024/03/05/why-i-moved-my-blog-to-rife2-after-23-years/erik.thauvin.net_blog_admin_editor_typepostid9739-1-638x510.jpg b/content/posts/2024/03/05/why-i-moved-my-blog-to-rife2-after-23-years/erik.thauvin.net_blog_admin_editor_typepostid9739-1-638x510.jpg new file mode 100644 index 000000000..de9b5cd05 Binary files /dev/null and b/content/posts/2024/03/05/why-i-moved-my-blog-to-rife2-after-23-years/erik.thauvin.net_blog_admin_editor_typepostid9739-1-638x510.jpg differ diff --git a/content/posts/2024/03/05/why-i-moved-my-blog-to-rife2-after-23-years/erik.thauvin.net_blog_admin_editor_typepostid9739-1-638x510.png b/content/posts/2024/03/05/why-i-moved-my-blog-to-rife2-after-23-years/erik.thauvin.net_blog_admin_editor_typepostid9739-1-638x510.png deleted file mode 100644 index 5c6027e03..000000000 Binary files a/content/posts/2024/03/05/why-i-moved-my-blog-to-rife2-after-23-years/erik.thauvin.net_blog_admin_editor_typepostid9739-1-638x510.png and /dev/null differ diff --git a/content/posts/2024/03/05/why-i-moved-my-blog-to-rife2-after-23-years/index.md b/content/posts/2024/03/05/why-i-moved-my-blog-to-rife2-after-23-years/index.md index 8f616f490..1c0fa61ed 100644 --- a/content/posts/2024/03/05/why-i-moved-my-blog-to-rife2-after-23-years/index.md +++ b/content/posts/2024/03/05/why-i-moved-my-blog-to-rife2-after-23-years/index.md @@ -29,7 +29,7 @@ Needless to say, I was hooked, line, and sinker. The blog is more complicated than it looks; many behind-the-scenes features have been added over the years. -![](erik.thauvin.net_blog_admin_editor_typepostid9739-1-638x510.png) +![](erik.thauvin.net_blog_admin_editor_typepostid9739-1-638x510.jpg) It supports numerous APIs, like [MetaWeblog](https://en.wikipedia.org/wiki/MetaWeblog), [WebSub](https://en.wikipedia.org/wiki/WebSub), and [Pushover](https://pushover.net/)… It can automatically cross-post to social networks like [Mastodon](https://mastodon.social/@ethauvin), [BlueSky](https://bsky.app/profile/erik.thauvin.net), [X](https://twitter.com/ethauvin), [Facebook](https://www.facebook.com/ethauvin), and [LinkedIn](https://www.linkedin.com/in/ethauvin/)… diff --git a/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/IMG_2772-2000x690-80241264.jpeg b/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/IMG_2772-2000x690-80241264.jpeg new file mode 100644 index 000000000..2ceaabe3a Binary files /dev/null and b/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/IMG_2772-2000x690-80241264.jpeg differ diff --git a/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/bcc_vs_bpf-1-2000x1125-1.jpg b/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/bcc_vs_bpf-1-2000x1125-1.jpg new file mode 100644 index 000000000..bbd8f1398 Binary files /dev/null and b/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/bcc_vs_bpf-1-2000x1125-1.jpg differ diff --git a/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/bcc_vs_bpf-1-2000x1125-1.png b/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/bcc_vs_bpf-1-2000x1125-1.png deleted file mode 100644 index a00af9463..000000000 Binary files a/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/bcc_vs_bpf-1-2000x1125-1.png and /dev/null differ diff --git a/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/bcc_vs_bpf-1-2000x1125-4a510a39.jpg b/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/bcc_vs_bpf-1-2000x1125-4a510a39.jpg new file mode 100644 index 000000000..bbd8f1398 Binary files /dev/null and b/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/bcc_vs_bpf-1-2000x1125-4a510a39.jpg differ diff --git a/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/index.md b/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/index.md index a878cad55..3447b60f9 100644 --- a/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/index.md +++ b/content/posts/2024/03/07/hello-ebpf-first-steps-with-libbpf-5/index.md @@ -5,7 +5,7 @@ lastmod: "2024-03-07T13:51:36+00:00" description: "Learn why using libbcc is not the best idea and start working with the newer libbpf." authors: - "johannes-bechberger" -image: "bcc_vs_bpf-1-2000x1125-1.png" +image: "bcc_vs_bpf-1-2000x1125-1.jpg" categories: - "Tools" related_posts: @@ -49,7 +49,7 @@ Additionally, the libbcc binaries in the official Ubuntu package repositories ar ## BPF-based Library So what is the alternative? We compile the embedded C code in our application to eBPF bytecode at build time using a custom annotation processor and load the bytecode using libbpf at run-time: -![](https://mostlynerdless.de/wp-content/uploads/2024/02/bcc_vs_bpf-1-2000x1125.png) +![](bcc_vs_bpf-1-2000x1125-4a510a39.jpg) This allows us to create self-contained JARs that will eventually neatly package our eBPF application. @@ -152,4 +152,4 @@ Using libbpf instead of libbcc has many advantages: Smaller, self-contained JARs Thanks for joining me on this journey to create a proper Java API for eBPF. I'll see you in two weeks for the next installment in this series, and possibly before for a trip report on my current travels. *This article is part of my work in the [SapMachine](https://sapmachine.io/) team at [SAP](https://sap.com/), making profiling and debugging easier for everyone, first published on my personal blog [mostlynerdless.de](https://mostlynerdless.de/blog/2024/02/26/hello-ebpf-first-steps-with-libbpf-5/). This article was written in Canada, thanks to [ConFoo](https://confoo.ca/) and Theresa Mammarella, who made this trip possible. Inspiration came from [Ansil H's series on eBPF](https://ansilh.com/posts/08-ebpf-for-linux-admins-part8/).* -![](https://mostlynerdless.de/wp-content/uploads/2024/02/IMG_2772-2000x690.jpeg) +![](IMG_2772-2000x690-80241264.jpeg) diff --git a/content/posts/2024/03/07/payara-cloud-hackathon-is-open-for-sign-ups/image-1024x576.jpg b/content/posts/2024/03/07/payara-cloud-hackathon-is-open-for-sign-ups/image-1024x576.jpg new file mode 100644 index 000000000..aedacc53b Binary files /dev/null and b/content/posts/2024/03/07/payara-cloud-hackathon-is-open-for-sign-ups/image-1024x576.jpg differ diff --git a/content/posts/2024/03/07/payara-cloud-hackathon-is-open-for-sign-ups/image-1024x576.png b/content/posts/2024/03/07/payara-cloud-hackathon-is-open-for-sign-ups/image-1024x576.png deleted file mode 100644 index 051cb5f94..000000000 Binary files a/content/posts/2024/03/07/payara-cloud-hackathon-is-open-for-sign-ups/image-1024x576.png and /dev/null differ diff --git a/content/posts/2024/03/07/payara-cloud-hackathon-is-open-for-sign-ups/index.md b/content/posts/2024/03/07/payara-cloud-hackathon-is-open-for-sign-ups/index.md index f60733512..4911197ec 100644 --- a/content/posts/2024/03/07/payara-cloud-hackathon-is-open-for-sign-ups/index.md +++ b/content/posts/2024/03/07/payara-cloud-hackathon-is-open-for-sign-ups/index.md @@ -55,4 +55,4 @@ Winners will be spotlighted across our platforms, earn money prizes, and present 5. You have up to 31 March midnight GMT to deploy your app to Payara Cloud and submit your entry details – all final submission info will be emailed to you on Day 1 of the Hackathon. 6. Winners will be notified via email and publically announced by the end of April 2024. -[![](image-1024x576.png)](https://www.payara.fish/page/payara-hackathon-2024/) +[![](image-1024x576.jpg)](https://www.payara.fish/page/payara-hackathon-2024/) diff --git a/content/posts/2024/03/14/increase-readability-and-reduce-complexity-with-javas-pattern-matching/index.md b/content/posts/2024/03/14/increase-readability-and-reduce-complexity-with-javas-pattern-matching/index.md index d759d7da5..39cdd844f 100644 --- a/content/posts/2024/03/14/increase-readability-and-reduce-complexity-with-javas-pattern-matching/index.md +++ b/content/posts/2024/03/14/increase-readability-and-reduce-complexity-with-javas-pattern-matching/index.md @@ -5,7 +5,7 @@ lastmod: "2024-03-15T14:09:35+00:00" description: "Increase readability, reduce cognitive complexity, and avoid bugs that are hard to spot with Java's Pattern Matching." authors: - "jonathan-vila" -image: "instanceof.png" +image: "instanceof.jpg" categories: - "Java" - "Java Core" diff --git a/content/posts/2024/03/14/increase-readability-and-reduce-complexity-with-javas-pattern-matching/instanceof.jpg b/content/posts/2024/03/14/increase-readability-and-reduce-complexity-with-javas-pattern-matching/instanceof.jpg new file mode 100644 index 000000000..69468f977 Binary files /dev/null and b/content/posts/2024/03/14/increase-readability-and-reduce-complexity-with-javas-pattern-matching/instanceof.jpg differ diff --git a/content/posts/2024/03/14/increase-readability-and-reduce-complexity-with-javas-pattern-matching/instanceof.png b/content/posts/2024/03/14/increase-readability-and-reduce-complexity-with-javas-pattern-matching/instanceof.png deleted file mode 100644 index 42739aa05..000000000 Binary files a/content/posts/2024/03/14/increase-readability-and-reduce-complexity-with-javas-pattern-matching/instanceof.png and /dev/null differ diff --git a/content/posts/2024/03/19/hello-ebpf-ring-buffers-in-libbpf-6/index.md b/content/posts/2024/03/19/hello-ebpf-ring-buffers-in-libbpf-6/index.md index 2fcb04ba0..37c6f23e3 100644 --- a/content/posts/2024/03/19/hello-ebpf-ring-buffers-in-libbpf-6/index.md +++ b/content/posts/2024/03/19/hello-ebpf-ring-buffers-in-libbpf-6/index.md @@ -30,7 +30,7 @@ In [Hello eBPF: Recording data in event buffers (3)](https://foojay.io/today/hel > [BPF ring buffer](https://nakryiko.com/posts/bpf-ringbuf/) by Andrii Nakryiko Ring buffers are still circular buffers: -![](https://mostlynerdless.de/wp-content/uploads/2024/03/ring_buffer.png) +![](ring_buffer.png) Their usage is similar to the perf event buffers we've seen before. The significant difference is that we implemented the perf event buffers using the libbcc-based eBPF code, which made creating a buffer easy: diff --git a/content/posts/2024/03/20/localize-apps-with-ai/index.md b/content/posts/2024/03/20/localize-apps-with-ai/index.md index 4cfc99a98..56f843392 100644 --- a/content/posts/2024/03/20/localize-apps-with-ai/index.md +++ b/content/posts/2024/03/20/localize-apps-with-ai/index.md @@ -6,7 +6,7 @@ description: "Ever wondered if AI can localize an entire project? Let’s walk t canonical: "https://flounder.dev/posts/localize-apps-with-ai/" authors: - "igor-kulakov" -image: "localized-nl.png" +image: "localized-nl.jpg" categories: - "Java Beginner" - "Spring" @@ -31,7 +31,7 @@ In this article, we will walk through one such experiment. We will choose an ope If you've never dealt with localization and would like to learn, it might be a good idea to start here. Except for a few technical details, the approach is largely universal, and you can apply it in other types of projects. If you're already familiar with the basics, and just want to see AI in action, you might want to skip to [Translate texts](#translate-texts) or clone [my fork](https://github.com/flounder4130/spring-petclinic) to skim over the commits and evaluate the results. -![Localize Apps with AI - post banner](https://flounder.dev/img/localize-apps-with-ai-banner.png) +![Localize Apps with AI - post banner](localize-apps-with-ai-banner-5c10f034.jpg) ## Get the project @@ -408,7 +408,7 @@ Let's relaunch the application and test it using different `lang` parameter valu * Personally, I find it very satisfying to see each page correctly localized. We've put in some effort, and now it's paying off: -![Spring Petclinic Find Owners page in Dutch](https://flounder.dev/img/localized-nl.png) +![Spring Petclinic Find Owners page in Dutch](localized-nl.jpg) ## Address the issues diff --git a/content/posts/2024/03/20/localize-apps-with-ai/localize-apps-with-ai-banner-5c10f034.jpg b/content/posts/2024/03/20/localize-apps-with-ai/localize-apps-with-ai-banner-5c10f034.jpg new file mode 100644 index 000000000..de837d4d0 Binary files /dev/null and b/content/posts/2024/03/20/localize-apps-with-ai/localize-apps-with-ai-banner-5c10f034.jpg differ diff --git a/content/posts/2024/03/20/localize-apps-with-ai/localized-nl.jpg b/content/posts/2024/03/20/localize-apps-with-ai/localized-nl.jpg new file mode 100644 index 000000000..5d1a4a0b6 Binary files /dev/null and b/content/posts/2024/03/20/localize-apps-with-ai/localized-nl.jpg differ diff --git a/content/posts/2024/03/20/localize-apps-with-ai/localized-nl.png b/content/posts/2024/03/20/localize-apps-with-ai/localized-nl.png deleted file mode 100644 index 2a6e7b4d2..000000000 Binary files a/content/posts/2024/03/20/localize-apps-with-ai/localized-nl.png and /dev/null differ diff --git a/content/posts/2024/03/25/spring-internals-of-restclient/image-6-1-510x510.jpg b/content/posts/2024/03/25/spring-internals-of-restclient/image-6-1-510x510.jpg new file mode 100644 index 000000000..6db5006f3 Binary files /dev/null and b/content/posts/2024/03/25/spring-internals-of-restclient/image-6-1-510x510.jpg differ diff --git a/content/posts/2024/03/25/spring-internals-of-restclient/image-6-1-510x510.png b/content/posts/2024/03/25/spring-internals-of-restclient/image-6-1-510x510.png deleted file mode 100644 index 910e8f261..000000000 Binary files a/content/posts/2024/03/25/spring-internals-of-restclient/image-6-1-510x510.png and /dev/null differ diff --git a/content/posts/2024/03/26/tips-for-reading-code/FileStructure-1024x576.jpg b/content/posts/2024/03/26/tips-for-reading-code/FileStructure-1024x576.jpg new file mode 100644 index 000000000..51aa3fcf2 Binary files /dev/null and b/content/posts/2024/03/26/tips-for-reading-code/FileStructure-1024x576.jpg differ diff --git a/content/posts/2024/03/26/tips-for-reading-code/FileStructure-1024x576.png b/content/posts/2024/03/26/tips-for-reading-code/FileStructure-1024x576.png deleted file mode 100644 index 6f076bd35..000000000 Binary files a/content/posts/2024/03/26/tips-for-reading-code/FileStructure-1024x576.png and /dev/null differ diff --git a/content/posts/2024/03/26/tips-for-reading-code/StructureToolWindow-1024x576.jpg b/content/posts/2024/03/26/tips-for-reading-code/StructureToolWindow-1024x576.jpg new file mode 100644 index 000000000..3e404fe50 Binary files /dev/null and b/content/posts/2024/03/26/tips-for-reading-code/StructureToolWindow-1024x576.jpg differ diff --git a/content/posts/2024/03/26/tips-for-reading-code/StructureToolWindow-1024x576.png b/content/posts/2024/03/26/tips-for-reading-code/StructureToolWindow-1024x576.png deleted file mode 100644 index 1ad74487e..000000000 Binary files a/content/posts/2024/03/26/tips-for-reading-code/StructureToolWindow-1024x576.png and /dev/null differ diff --git a/content/posts/2024/03/26/tips-for-reading-code/index.md b/content/posts/2024/03/26/tips-for-reading-code/index.md index 898bffe6a..d989a43b1 100644 --- a/content/posts/2024/03/26/tips-for-reading-code/index.md +++ b/content/posts/2024/03/26/tips-for-reading-code/index.md @@ -44,10 +44,10 @@ Note that we can still search the code when it is collapsed, and if needed the r *Search Collapsed Code* Alternatively, we can look at the **File Structure** for a file using **⌘ F12** on macOS or **Ctrl+F12** on Windows/Linux. We can navigate to the section of the code we're interested in from here. -![](FileStructure-1024x576.png) *File Structure* +![](FileStructure-1024x576.jpg) *File Structure* We can get the same information by opening the **Structure** tool window, using **⌘ 7** on macOS or **Alt+7** on Windows/Linux. -![](StructureToolWindow-1024x576.png) *Structure tool window* +![](StructureToolWindow-1024x576.jpg) *Structure tool window* ## **Searching** diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/53581958507_5e78d36869_o-2000x1334-6fa0b725.jpg b/content/posts/2024/03/26/to-brussels-canada-and-back/53581958507_5e78d36869_o-2000x1334-6fa0b725.jpg new file mode 100644 index 000000000..4e0dc56d2 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/53581958507_5e78d36869_o-2000x1334-6fa0b725.jpg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2674-Large-03c554e9.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2674-Large-03c554e9.jpeg new file mode 100644 index 000000000..b10b4b9ba Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2674-Large-03c554e9.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2675-2000x1500-8b613210.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2675-2000x1500-8b613210.jpeg new file mode 100644 index 000000000..4084be570 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2675-2000x1500-8b613210.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2679-1500x2000-899498ab.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2679-1500x2000-899498ab.jpeg new file mode 100644 index 000000000..ffe57ab79 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2679-1500x2000-899498ab.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2724-2000x1500-e086f5a6.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2724-2000x1500-e086f5a6.jpeg new file mode 100644 index 000000000..f0df719fb Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2724-2000x1500-e086f5a6.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2738-1500x2000-11b86b92.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2738-1500x2000-11b86b92.jpeg new file mode 100644 index 000000000..0ef8374e2 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2738-1500x2000-11b86b92.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2743-1500x2000-a8584a0c.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2743-1500x2000-a8584a0c.jpeg new file mode 100644 index 000000000..4cb484def Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2743-1500x2000-a8584a0c.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2745-2000x1500-748a8a48.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2745-2000x1500-748a8a48.jpeg new file mode 100644 index 000000000..f707653db Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2745-2000x1500-748a8a48.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2748-2000x1500-8c29ac42.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2748-2000x1500-8c29ac42.jpeg new file mode 100644 index 000000000..5c4f76f14 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2748-2000x1500-8c29ac42.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2791-2000x1500-d55f5727.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2791-2000x1500-d55f5727.jpeg new file mode 100644 index 000000000..43b8d006d Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2791-2000x1500-d55f5727.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2792-1-1500x2000-f0c86429.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2792-1-1500x2000-f0c86429.jpeg new file mode 100644 index 000000000..262877357 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2792-1-1500x2000-f0c86429.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2814-2000x1500-ab51720e.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2814-2000x1500-ab51720e.jpeg new file mode 100644 index 000000000..f4bbea66a Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2814-2000x1500-ab51720e.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2821-2000x1500-c8146039.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2821-2000x1500-c8146039.jpeg new file mode 100644 index 000000000..ba2b2d0fa Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2821-2000x1500-c8146039.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2832-2000x1500-e78e6232.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2832-2000x1500-e78e6232.jpeg new file mode 100644 index 000000000..7e9055829 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2832-2000x1500-e78e6232.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2839-2000x1500-ab196bf7.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2839-2000x1500-ab196bf7.jpeg new file mode 100644 index 000000000..4881aad67 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2839-2000x1500-ab196bf7.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2968-2000x1500-349039d1.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2968-2000x1500-349039d1.jpeg new file mode 100644 index 000000000..89efec600 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2968-2000x1500-349039d1.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2974-2000x1500-515fb126.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2974-2000x1500-515fb126.jpeg new file mode 100644 index 000000000..08376fc6d Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_2974-2000x1500-515fb126.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3013-2000x1500-160b0190.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3013-2000x1500-160b0190.jpeg new file mode 100644 index 000000000..71bb32dca Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3013-2000x1500-160b0190.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3069-2000x1500-3a78592a.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3069-2000x1500-3a78592a.jpeg new file mode 100644 index 000000000..1752df1d4 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3069-2000x1500-3a78592a.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3074-2000x1500-d1e8171c.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3074-2000x1500-d1e8171c.jpeg new file mode 100644 index 000000000..96c44756b Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3074-2000x1500-d1e8171c.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3076-2000x1500-a9cf3493.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3076-2000x1500-a9cf3493.jpeg new file mode 100644 index 000000000..2d64a93ef Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3076-2000x1500-a9cf3493.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3089-2000x1500-ef9bd729.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3089-2000x1500-ef9bd729.jpeg new file mode 100644 index 000000000..71e1e5c36 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3089-2000x1500-ef9bd729.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3127-2000x1500-71fd4945.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3127-2000x1500-71fd4945.jpeg new file mode 100644 index 000000000..08bdf933b Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3127-2000x1500-71fd4945.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3161-2000x1500-3d350053.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3161-2000x1500-3d350053.jpeg new file mode 100644 index 000000000..a7e4f39d5 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3161-2000x1500-3d350053.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3200-2000x1500-f4656453.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3200-2000x1500-f4656453.jpeg new file mode 100644 index 000000000..287edfe25 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3200-2000x1500-f4656453.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3267-2-2000x1500-dc34e957.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3267-2-2000x1500-dc34e957.jpeg new file mode 100644 index 000000000..229567f90 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3267-2-2000x1500-dc34e957.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3270-2000x790-8475e6c4.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3270-2000x790-8475e6c4.jpeg new file mode 100644 index 000000000..7a2645e95 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3270-2000x790-8475e6c4.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3272-2000x1500-dffbf1d6.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3272-2000x1500-dffbf1d6.jpeg new file mode 100644 index 000000000..100c6e27e Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3272-2000x1500-dffbf1d6.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3274-2-2000x1500-4691bfcc.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3274-2-2000x1500-4691bfcc.jpeg new file mode 100644 index 000000000..c465dd734 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3274-2-2000x1500-4691bfcc.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3279-1500x2000-e8822c85.jpeg b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3279-1500x2000-e8822c85.jpeg new file mode 100644 index 000000000..74e60fefd Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/IMG_3279-1500x2000-e8822c85.jpeg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/image-1-2000x745-10a57ed5.jpg b/content/posts/2024/03/26/to-brussels-canada-and-back/image-1-2000x745-10a57ed5.jpg new file mode 100644 index 000000000..e62f54891 Binary files /dev/null and b/content/posts/2024/03/26/to-brussels-canada-and-back/image-1-2000x745-10a57ed5.jpg differ diff --git a/content/posts/2024/03/26/to-brussels-canada-and-back/index.md b/content/posts/2024/03/26/to-brussels-canada-and-back/index.md index 085c9a9cb..fa5e7bf70 100644 --- a/content/posts/2024/03/26/to-brussels-canada-and-back/index.md +++ b/content/posts/2024/03/26/to-brussels-canada-and-back/index.md @@ -22,20 +22,20 @@ It was at times quite arduous but at the same time energizing, as you can read i And I got accepted at a few of them, which was really great because I started missing traveling after almost three months of being home. In this article, I'll cover my first three conferences this year: [FOSDEM](https://fosdem.org/2024) in Brussels, [ConFoo](https://confoo.ca/en/2024) in Montreal, and [Voxxed Days Zurich](https://voxxeddays.com/zurich/); they all happened between early February and early March. It was the most travel, distance (and continent) wise, that I ever did before, by quite some margin: -![](https://mostlynerdless.de/wp-content/uploads/2024/03/image-1-2000x745.png) [Read more: To Brussels, Canada and Back](https://foojay.io/today/to-brussels-canada-and-back/) +![](image-1-2000x745-10a57ed5.jpg) [Read more: To Brussels, Canada and Back](https://foojay.io/today/to-brussels-canada-and-back/) ## FOSDEM Every good journey starts with taking a train far too early: -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2674-Large.jpeg) +![](IMG_2674-Large-03c554e9.jpeg) I took the train at 3:30 am on the 2nd of February from Karlsruhe to Schwetzingen so one of my [SapMachine](https://sapmachine.io) colleagues, Christoph Langer, could pick me up for the first conference of the year: [FOSDEM in Brussel](https://fosdem.org/2024). But before FOSDEM, which happened over the weekend, there was the [JDK Committers Workshop](https://openjdk.org/workshop) nearby, where I chaired a session on modernizing JFR with Andrei Pangin: -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2675-2000x1500.jpeg) +![](IMG_2675-2000x1500-8b613210.jpeg) Ron Pressler was also present, making the discussions quite worthwhile. This eventually led to my current work on implementing a CPU profiler in JFR with Andrei. After the workshop day, the conference came. Last year, I was in Brussels, too, but I never really took the time to explore the city. Instead, I sat at the conference all day. My talk in the Java room was Saturday evening, so I took the opportunity to visit the main cathedral and some parks together with [Alexander Wert](https://www.linkedin.com/in/alexanderwert) and his wife: -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2679-1500x2000.jpeg) +![](IMG_2679-1500x2000-899498ab.jpeg) My first talk at FOSDEM was titled [Inner Workings of Safepoints](https://fosdem.org/2024/schedule/event/fosdem-2024-1675-inner-workings-of-safepoints/), in which I explained what safepoints are, why they are important, and how they are implemented, all based on my article, [The Inner Workings of Safepoints](https://mostlynerdless.de/blog/2023/07/31/the-inner-workings-of-safepoints/): @@ -52,79 +52,79 @@ After these conferences, I had two weeks without any conference, which was great ## ConFoo I've never been to another continent, let alone visited Canada, so I was pretty happy when I got accepted to ConFoo in Montreal. Being 8 hours on a plane on the 19th of February and having Jetlag, both for the first time, was quite tiring, but hey, at least the conference paid for it: -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2724-2000x1500.jpeg) +![](IMG_2724-2000x1500-e086f5a6.jpeg) After arriving in Montreal, I explored the city, [Mount Royal](https://montrealvisitorsguide.com/mount-royal-mont-royal/), and the [underground](https://www.mtl.org/en/experience/guide-underground-city-shopping) for an evening and a whole day, meeting [Theresa Mammarella](https://www.linkedin.com/in/tmammarella/) and her husband for dinner in [China Town](https://www.mtl.org/en/experience/discover-neighbourhood-montreal-chinatown): -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2738-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2743-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2745-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2748-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2791-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2792-1-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2738-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2743-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2745-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2748-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2791-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2792-1-1500x2000.jpeg) +![](IMG_2738-1500x2000-11b86b92.jpeg) +![](IMG_2743-1500x2000-a8584a0c.jpeg) +![](IMG_2745-2000x1500-748a8a48.jpeg) +![](IMG_2748-2000x1500-8c29ac42.jpeg) +![](IMG_2791-2000x1500-d55f5727.jpeg) +![](IMG_2792-1-1500x2000-f0c86429.jpeg) +![](IMG_2738-1500x2000-11b86b92.jpeg) +![](IMG_2743-1500x2000-a8584a0c.jpeg) +![](IMG_2745-2000x1500-748a8a48.jpeg) +![](IMG_2748-2000x1500-8c29ac42.jpeg) +![](IMG_2791-2000x1500-d55f5727.jpeg) +![](IMG_2792-1-1500x2000-f0c86429.jpeg) The days at the conference flew by, especially because of the great food there. I was also glad to meet [Sam](https://snugug.com/me/), [Jessie](https://www.linkedin.com/in/newmanjessie/), and [Jonatan](https://www.linkedin.com/in/jonatan-ivanov/overlay/about-this-profile/), joining them to eat bagels from both [St. Viateur](https://www.stviateurbagel.com/) (pictured) and [Fairmount Bagel](https://fairmountbagel.com/), as well as eating [poutine](https://en.wikipedia.org/wiki/Poutine) at [Chez Claudette](https://montreal.eater.com/maps/meilleure-best-poutine-montreal): -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2839-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2814-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2821-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2832-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2839-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2814-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2821-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2832-2000x1500.jpeg) +![](IMG_2839-2000x1500-ab196bf7.jpeg) +![](IMG_2814-2000x1500-ab51720e.jpeg) +![](IMG_2821-2000x1500-c8146039.jpeg) +![](IMG_2832-2000x1500-e78e6232.jpeg) +![](IMG_2839-2000x1500-ab196bf7.jpeg) +![](IMG_2814-2000x1500-ab51720e.jpeg) +![](IMG_2821-2000x1500-c8146039.jpeg) +![](IMG_2832-2000x1500-e78e6232.jpeg) While the traveling aspect of this journey was great, I also gave two talks: One on writing a profiler in pure Java and another on debugging, but they are sadly not available publicly (yet). I stayed in Montreal till Saturday, the 23rd. Then, I traveled by train to Toronto for almost a week with Theresa and her husband Charles before I returned to Montreal to take the plane back to Europe. I first met Theresa at JavaZone in Oslo (see [trip report](https://mostlynerdless.de/blog/2023/09/29/report-of-my-trip-to-javazone-and-northern-germany/)) in September last year... -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2968-2000x1500.jpeg) +![](IMG_2968-2000x1500-349039d1.jpeg) Where Montreal was icy cold, Toronto felt welcoming, almost warm. I explored the city, went up the [CN Tower](https://www.cntower.ca/), down into the [underground](https://www.toronto.ca/explore-enjoy/visitor-toronto/path-torontos-downtown-pedestrian-walkway/), to Niagra Falls, and enjoyed Charles' blueberry pancakes with dark maple syrup: -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2974-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3013-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3069-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3074-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3076-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3089-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3127-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3161-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3200-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_2974-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3013-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3069-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3074-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3076-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3089-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3127-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3161-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3200-2000x1500.jpeg) +![](IMG_2974-2000x1500-515fb126.jpeg) +![](IMG_3013-2000x1500-160b0190.jpeg) +![](IMG_3069-2000x1500-3a78592a.jpeg) +![](IMG_3074-2000x1500-d1e8171c.jpeg) +![](IMG_3076-2000x1500-a9cf3493.jpeg) +![](IMG_3089-2000x1500-ef9bd729.jpeg) +![](IMG_3127-2000x1500-71fd4945.jpeg) +![](IMG_3161-2000x1500-3d350053.jpeg) +![](IMG_3200-2000x1500-f4656453.jpeg) +![](IMG_2974-2000x1500-515fb126.jpeg) +![](IMG_3013-2000x1500-160b0190.jpeg) +![](IMG_3069-2000x1500-3a78592a.jpeg) +![](IMG_3074-2000x1500-d1e8171c.jpeg) +![](IMG_3076-2000x1500-a9cf3493.jpeg) +![](IMG_3089-2000x1500-ef9bd729.jpeg) +![](IMG_3127-2000x1500-71fd4945.jpeg) +![](IMG_3161-2000x1500-3d350053.jpeg) +![](IMG_3200-2000x1500-f4656453.jpeg) Being in Canada was great, and I'm looking forward to returning to North America for [KCDC](https://www.kcdc.info/) in June. I came back to Europe Saturday morning with quite some jetlag and four bagels from St. Viateur, spending my weekend with a friend close to the airport before going to Zurich in the following week: ## VoxxedDays Zurich I actually flew to and from Canada via Zurich, so I was at home in Karlsruhe for just three days before going back for the [VoxxedDays](https://www.flickr.com/photos/bejug/albums/72177720315384585/with/53581963697), meeting new and old acquaintances and giving a talk called [Instrument to Remove: Using Java agents for fun and profit](https://voxxeddays.com/zurich/schedule/talk/?id=1754) (related [blog post](https://mostlynerdless.de/blog/2023/04/06/instrumenting-java-code-to-find-and-handle-unused-classes/)): -![](https://mostlynerdless.de/wp-content/uploads/2024/03/53581958507_5e78d36869_o-2000x1334.jpg) Photo by the great [Dimitris Doutsiopoulos](https://ddphotography.gr/) +![](53581958507_5e78d36869_o-2000x1334-6fa0b725.jpg) Photo by the great [Dimitris Doutsiopoulos](https://ddphotography.gr/) {{< youtube JnJgvcZo7b8 >}} I had the opportunity to reconnect with [Mario Fusco](https://www.linkedin.com/in/mario-fusco-3467213/) (pictured), [Matthias Häussler](https://www.linkedin.com/in/matthiashaeussler/), [Anja Kunkel](https://www.linkedin.com/in/anja-kunkel-236534135), and many more and to meet new people like [Myriam Jessier](https://myriamjessier.com). -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3267-2-2000x1500.jpeg) +![](IMG_3267-2-2000x1500-dc34e957.jpeg) After the one-day conference, I met someone the next day, someone I had first met at ConFoo. By pure coincidence, [Marcus Boerger](https://www.linkedin.com/in/marcusboerger/overlay/about-this-profile/) lives close to Zurich with his family, so I joined him for lunch at his home, using the rest of the day to explore the city: -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3270-2000x790.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3272-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3274-2-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3279-1500x2000.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3270-2000x790.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3272-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3274-2-2000x1500.jpeg) -![](https://mostlynerdless.de/wp-content/uploads/2024/03/IMG_3279-1500x2000.jpeg) +![](IMG_3270-2000x790-8475e6c4.jpeg) +![](IMG_3272-2000x1500-dffbf1d6.jpeg) +![](IMG_3274-2-2000x1500-4691bfcc.jpeg) +![](IMG_3279-1500x2000-e8822c85.jpeg) +![](IMG_3270-2000x790-8475e6c4.jpeg) +![](IMG_3272-2000x1500-dffbf1d6.jpeg) +![](IMG_3274-2-2000x1500-4691bfcc.jpeg) +![](IMG_3279-1500x2000-e8822c85.jpeg) ## Conclusion diff --git a/content/posts/2024/03/28/aspect-oriented-programming-aop/aspectj.jpg b/content/posts/2024/03/28/aspect-oriented-programming-aop/aspectj.jpg new file mode 100644 index 000000000..a86517b44 Binary files /dev/null and b/content/posts/2024/03/28/aspect-oriented-programming-aop/aspectj.jpg differ diff --git a/content/posts/2024/03/28/aspect-oriented-programming-aop/aspectj.png b/content/posts/2024/03/28/aspect-oriented-programming-aop/aspectj.png deleted file mode 100644 index 4f49017c5..000000000 Binary files a/content/posts/2024/03/28/aspect-oriented-programming-aop/aspectj.png and /dev/null differ diff --git a/content/posts/2024/03/28/aspect-oriented-programming-aop/index.md b/content/posts/2024/03/28/aspect-oriented-programming-aop/index.md index 26d1add14..2a365d5ba 100644 --- a/content/posts/2024/03/28/aspect-oriented-programming-aop/index.md +++ b/content/posts/2024/03/28/aspect-oriented-programming-aop/index.md @@ -5,7 +5,7 @@ lastmod: "2024-03-28T06:58:57+00:00" description: "The AspectJ framework streamlines AOP adoption in Java. AOP improves modularity which leads to code that is easier to understand and maintain." authors: - "abo-saad-muaath" -image: "aspectj.png" +image: "aspectj.jpg" categories: - "Java" related_posts: diff --git a/content/posts/2024/03/31/javafx-links-of-march-2024/index.md b/content/posts/2024/03/31/javafx-links-of-march-2024/index.md index 453935641..f9fed924c 100644 --- a/content/posts/2024/03/31/javafx-links-of-march-2024/index.md +++ b/content/posts/2024/03/31/javafx-links-of-march-2024/index.md @@ -6,7 +6,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of March 2024, canonical: "https://webtechie.be/post/2024-03-29-javafx-links-of-march-2024/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2024/03/31/javafx-links-of-march-2024/jfxcentral.jpg b/content/posts/2024/03/31/javafx-links-of-march-2024/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2024/03/31/javafx-links-of-march-2024/jfxcentral.jpg differ diff --git a/content/posts/2024/03/31/javafx-links-of-march-2024/jfxcentral.png b/content/posts/2024/03/31/javafx-links-of-march-2024/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2024/03/31/javafx-links-of-march-2024/jfxcentral.png and /dev/null differ diff --git a/content/posts/2024/04/03/improving-upon-my-opentelemetry-tracing-demo/index.md b/content/posts/2024/04/03/improving-upon-my-opentelemetry-tracing-demo/index.md index 171d81b14..04d062332 100644 --- a/content/posts/2024/04/03/improving-upon-my-opentelemetry-tracing-demo/index.md +++ b/content/posts/2024/04/03/improving-upon-my-opentelemetry-tracing-demo/index.md @@ -152,7 +152,7 @@ val otel = GlobalOpenTelemetry.get() At runtime, the agent will work its magic to return the instance. Here's a simplified class diagram focused on tracing: -![](otel-tracer-api-1024x527.png) +![](otel-tracer-api-1024x527.jpg) In turn, the flow goes something like this: diff --git a/content/posts/2024/04/03/improving-upon-my-opentelemetry-tracing-demo/otel-tracer-api-1024x527.jpg b/content/posts/2024/04/03/improving-upon-my-opentelemetry-tracing-demo/otel-tracer-api-1024x527.jpg new file mode 100644 index 000000000..dc9bb9132 Binary files /dev/null and b/content/posts/2024/04/03/improving-upon-my-opentelemetry-tracing-demo/otel-tracer-api-1024x527.jpg differ diff --git a/content/posts/2024/04/03/improving-upon-my-opentelemetry-tracing-demo/otel-tracer-api-1024x527.png b/content/posts/2024/04/03/improving-upon-my-opentelemetry-tracing-demo/otel-tracer-api-1024x527.png deleted file mode 100644 index 6c921a8c8..000000000 Binary files a/content/posts/2024/04/03/improving-upon-my-opentelemetry-tracing-demo/otel-tracer-api-1024x527.png and /dev/null differ diff --git a/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/cocktailmaker_circuit-1024x732.jpg b/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/cocktailmaker_circuit-1024x732.jpg new file mode 100644 index 000000000..45b671c00 Binary files /dev/null and b/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/cocktailmaker_circuit-1024x732.jpg differ diff --git a/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/cocktailmaker_circuit-1024x732.png b/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/cocktailmaker_circuit-1024x732.png deleted file mode 100644 index af007f56c..000000000 Binary files a/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/cocktailmaker_circuit-1024x732.png and /dev/null differ diff --git a/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/index.md b/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/index.md index 5d970e3b6..c21268760 100644 --- a/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/index.md +++ b/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/index.md @@ -6,7 +6,7 @@ description: "Alexander Liggesmeyer contributed a new plugin to Pi4J: GpioDPlugi canonical: "https://pi4j.com/blog/2024/20240318_interview_alexander_liggesmeyer/" authors: - "frankdelporte" -image: "pi4jplugin.png" +image: "pi4jplugin.jpg" categories: - "Embedded" - "Pi4J" @@ -78,7 +78,7 @@ Pi4J allows me to control the Raspberry Pi's GPIO interfaces directly from Java. {{< gallery >}} alexander.jpg -cocktailmaker_circuit-1024x732.png +cocktailmaker_circuit-1024x732.jpg screen-cocktail-1024x475.jpg {{< /gallery >}} diff --git a/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/pi4jplugin.jpg b/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/pi4jplugin.jpg new file mode 100644 index 000000000..e7c7bfeb5 Binary files /dev/null and b/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/pi4jplugin.jpg differ diff --git a/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/pi4jplugin.png b/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/pi4jplugin.png deleted file mode 100644 index c78574352..000000000 Binary files a/content/posts/2024/04/06/java-on-raspberry-pi-5-with-pi4j/pi4jplugin.png and /dev/null differ diff --git a/content/posts/2024/04/09/12-text-tools-for-developers/index.md b/content/posts/2024/04/09/12-text-tools-for-developers/index.md index c38e8eb7c..c48b8277c 100644 --- a/content/posts/2024/04/09/12-text-tools-for-developers/index.md +++ b/content/posts/2024/04/09/12-text-tools-for-developers/index.md @@ -46,7 +46,7 @@ In this example removing the '*\\b*' would find more matches. ## 4️⃣ Find Regular Expression Regular expressions are also useful to extract text. Japplis Toolbox has tools to keep lines containing the regular expression or just to extract the regular expression from the lines. -[![](toolbox-extract-regexp-netbeans-1024x576.png)](toolbox-extract-regexp-netbeans.png) *Japplis Toolbox Keep regexp tool running inside Apache NetBeans using the [NetBeans Applet Runner plugin](https://plugins.netbeans.apache.org/catalogue/?id=57)* +[![](toolbox-extract-regexp-netbeans-1024x576.jpg)](toolbox-extract-regexp-netbeans.png) *Japplis Toolbox Keep regexp tool running inside Apache NetBeans using the [NetBeans Applet Runner plugin](https://plugins.netbeans.apache.org/catalogue/?id=57)* Note that it can also run embedded in Eclipse using the [Eclipse Applet Runner plugin](https://marketplace.eclipse.org/content/applet-runner-eclipse/) and that all tools mentioned in this article are available in the bookmarks of Applet Runner. diff --git a/content/posts/2024/04/09/12-text-tools-for-developers/toolbox-extract-regexp-netbeans-1024x576.jpg b/content/posts/2024/04/09/12-text-tools-for-developers/toolbox-extract-regexp-netbeans-1024x576.jpg new file mode 100644 index 000000000..79e6e75fc Binary files /dev/null and b/content/posts/2024/04/09/12-text-tools-for-developers/toolbox-extract-regexp-netbeans-1024x576.jpg differ diff --git a/content/posts/2024/04/09/12-text-tools-for-developers/toolbox-extract-regexp-netbeans-1024x576.png b/content/posts/2024/04/09/12-text-tools-for-developers/toolbox-extract-regexp-netbeans-1024x576.png deleted file mode 100644 index 4e1da0a74..000000000 Binary files a/content/posts/2024/04/09/12-text-tools-for-developers/toolbox-extract-regexp-netbeans-1024x576.png and /dev/null differ diff --git a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/index.md b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/index.md index 708ea2906..48120c3f5 100644 --- a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/index.md +++ b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/index.md @@ -6,7 +6,7 @@ description: "Let's use an existing documentation set as the data for a ChatGPT- canonical: "https://webtechie.be/post/2024-03-18-search-documentation-javafx-chat-langchain4j/" authors: - "frankdelporte" -image: "langchain4j-question-story.png" +image: "langchain4j-question-story.jpg" categories: - "Java" - "Machine Learning" @@ -113,9 +113,9 @@ public class CustomStreamingResponseHandler { ``` {{< gallery >}} -langchain4j-code-1024x566.png -langchain4j-question-javafx-1024x372.png -langchain4j-question-story-1024x371.png +langchain4j-code-1024x566.jpg +langchain4j-question-javafx-1024x372.jpg +langchain4j-question-story-1024x371.jpg {{< /gallery >}} ## Chat With the Azul Documentation @@ -286,8 +286,8 @@ void ask(SearchAction action) { {{< gallery >}} langchain4j-docs-azul-home-1024x722.jpg -langchain4j-docs-azul-json-1024x486.png -langchain4j-docs-what-is-prime-1024x609.png +langchain4j-docs-azul-json-1024x486.jpg +langchain4j-docs-what-is-prime-1024x609.jpg {{< /gallery >}} ## Conclusion diff --git a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-code-1024x566.jpg b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-code-1024x566.jpg new file mode 100644 index 000000000..cd7b797ce Binary files /dev/null and b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-code-1024x566.jpg differ diff --git a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-code-1024x566.png b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-code-1024x566.png deleted file mode 100644 index 7ff9037ff..000000000 Binary files a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-code-1024x566.png and /dev/null differ diff --git a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-docs-azul-json-1024x486.jpg b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-docs-azul-json-1024x486.jpg new file mode 100644 index 000000000..6d4cd8c24 Binary files /dev/null and b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-docs-azul-json-1024x486.jpg differ diff --git a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-docs-azul-json-1024x486.png b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-docs-azul-json-1024x486.png deleted file mode 100644 index b022e3344..000000000 Binary files a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-docs-azul-json-1024x486.png and /dev/null differ diff --git a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-docs-what-is-prime-1024x609.jpg b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-docs-what-is-prime-1024x609.jpg new file mode 100644 index 000000000..ba9b2974f Binary files /dev/null and b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-docs-what-is-prime-1024x609.jpg differ diff --git a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-docs-what-is-prime-1024x609.png b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-docs-what-is-prime-1024x609.png deleted file mode 100644 index d6ae9a9ed..000000000 Binary files a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-docs-what-is-prime-1024x609.png and /dev/null differ diff --git a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-javafx-1024x372.jpg b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-javafx-1024x372.jpg new file mode 100644 index 000000000..a28cce255 Binary files /dev/null and b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-javafx-1024x372.jpg differ diff --git a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-javafx-1024x372.png b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-javafx-1024x372.png deleted file mode 100644 index c4d8806e2..000000000 Binary files a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-javafx-1024x372.png and /dev/null differ diff --git a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-javafx.jpg b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-javafx.jpg new file mode 100644 index 000000000..06f79e1ca Binary files /dev/null and b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-javafx.jpg differ diff --git a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-javafx.png b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-javafx.png deleted file mode 100644 index a5fb94293..000000000 Binary files a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-javafx.png and /dev/null differ diff --git a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-story-1024x371.jpg b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-story-1024x371.jpg new file mode 100644 index 000000000..48d6b680e Binary files /dev/null and b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-story-1024x371.jpg differ diff --git a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-story-1024x371.png b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-story-1024x371.png deleted file mode 100644 index 4ff31365b..000000000 Binary files a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-story-1024x371.png and /dev/null differ diff --git a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-story.jpg b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-story.jpg new file mode 100644 index 000000000..5a25765f0 Binary files /dev/null and b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-story.jpg differ diff --git a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-story.png b/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-story.png deleted file mode 100644 index 53f886487..000000000 Binary files a/content/posts/2024/04/10/search-in-documentation-with-a-javafx-chat-langchain4j-application/langchain4j-question-story.png and /dev/null differ diff --git a/content/posts/2024/04/12/effective-cloud-native-java-app-development-with-open-liberty-in-intellij-idea/Screenshot-2024-04-03-at-13.21.37-700x437.jpg b/content/posts/2024/04/12/effective-cloud-native-java-app-development-with-open-liberty-in-intellij-idea/Screenshot-2024-04-03-at-13.21.37-700x437.jpg new file mode 100644 index 000000000..af4c45831 Binary files /dev/null and b/content/posts/2024/04/12/effective-cloud-native-java-app-development-with-open-liberty-in-intellij-idea/Screenshot-2024-04-03-at-13.21.37-700x437.jpg differ diff --git a/content/posts/2024/04/12/effective-cloud-native-java-app-development-with-open-liberty-in-intellij-idea/Screenshot-2024-04-03-at-13.21.37-700x437.png b/content/posts/2024/04/12/effective-cloud-native-java-app-development-with-open-liberty-in-intellij-idea/Screenshot-2024-04-03-at-13.21.37-700x437.png deleted file mode 100644 index d59e2e193..000000000 Binary files a/content/posts/2024/04/12/effective-cloud-native-java-app-development-with-open-liberty-in-intellij-idea/Screenshot-2024-04-03-at-13.21.37-700x437.png and /dev/null differ diff --git a/content/posts/2024/04/12/effective-cloud-native-java-app-development-with-open-liberty-in-intellij-idea/index.md b/content/posts/2024/04/12/effective-cloud-native-java-app-development-with-open-liberty-in-intellij-idea/index.md index c698a2b10..0272e1336 100644 --- a/content/posts/2024/04/12/effective-cloud-native-java-app-development-with-open-liberty-in-intellij-idea/index.md +++ b/content/posts/2024/04/12/effective-cloud-native-java-app-development-with-open-liberty-in-intellij-idea/index.md @@ -38,7 +38,7 @@ The open source [Liberty Tools for IntelliJ IDEA](https://ibm.biz/LibertyToolsIn The Liberty Tools for IntelliJ IDEA plugin can help with all stages of the extended development lifecycle now expected from cloud-native development teams, including helping you in developing, building, testing, deploying, and managing your applications – all within your favorite IDE, IntelliJ! -![](Screenshot-2024-04-03-at-13.21.37-700x437.png) +![](Screenshot-2024-04-03-at-13.21.37-700x437.jpg) ## Key Capabilities of Liberty Tools diff --git a/content/posts/2024/04/14/free-foojay-io-tickets-for-jcon-europe-cologne/index.md b/content/posts/2024/04/14/free-foojay-io-tickets-for-jcon-europe-cologne/index.md index e5f4b34b6..35c94376f 100644 --- a/content/posts/2024/04/14/free-foojay-io-tickets-for-jcon-europe-cologne/index.md +++ b/content/posts/2024/04/14/free-foojay-io-tickets-for-jcon-europe-cologne/index.md @@ -5,7 +5,7 @@ lastmod: "2024-04-14T21:48:16+00:00" description: "Get your free tickets for Foojay.io collaborators of all shapes and sizes, whoever you are reading this, you are welcome to join in for free via the link in this article!" authors: - "r-fichtner" -image: "jcon.png" +image: "jcon.jpg" categories: - "Conference" - "Events" diff --git a/content/posts/2024/04/14/free-foojay-io-tickets-for-jcon-europe-cologne/jcon.jpg b/content/posts/2024/04/14/free-foojay-io-tickets-for-jcon-europe-cologne/jcon.jpg new file mode 100644 index 000000000..184e35268 Binary files /dev/null and b/content/posts/2024/04/14/free-foojay-io-tickets-for-jcon-europe-cologne/jcon.jpg differ diff --git a/content/posts/2024/04/14/free-foojay-io-tickets-for-jcon-europe-cologne/jcon.png b/content/posts/2024/04/14/free-foojay-io-tickets-for-jcon-europe-cologne/jcon.png deleted file mode 100644 index fc1fbfab7..000000000 Binary files a/content/posts/2024/04/14/free-foojay-io-tickets-for-jcon-europe-cologne/jcon.png and /dev/null differ diff --git a/content/posts/2024/04/14/hello-ebpf-auto-layouting-structs-7/image-2-2000x1623-6ba84f89.png b/content/posts/2024/04/14/hello-ebpf-auto-layouting-structs-7/image-2-2000x1623-6ba84f89.png new file mode 100644 index 000000000..520322764 Binary files /dev/null and b/content/posts/2024/04/14/hello-ebpf-auto-layouting-structs-7/image-2-2000x1623-6ba84f89.png differ diff --git a/content/posts/2024/04/14/hello-ebpf-auto-layouting-structs-7/index.md b/content/posts/2024/04/14/hello-ebpf-auto-layouting-structs-7/index.md index efdf3ff49..415f3f332 100644 --- a/content/posts/2024/04/14/hello-ebpf-auto-layouting-structs-7/index.md +++ b/content/posts/2024/04/14/hello-ebpf-auto-layouting-structs-7/index.md @@ -49,7 +49,7 @@ struct event { ``` This means that the know also knows how to transform member accesses to this struct and can adequately place the event in the allocated memory: -![](https://mostlynerdless.de/wp-content/uploads/2024/03/struct_layout-2000x760.png) +![](struct_layout-2000x760-12a53b33.jpg) You've actually seen the layouting information before, as the [hello-ebpf](https://github.com/parttimenerd/hello-ebpf/) project requires you to hand layout all structs manually: @@ -79,7 +79,7 @@ private static final BPFStructType eventType = ## Alignment Rules But where do these alignment rules come from? They come from how your CPU works. Your CPU usually only allows/is optimized for certain types of accesses. So, for example, x86 CPUs are optimized for accessing 32-bit integers that lay at addresses in memory that are a multiple of four. The rules are defined in the Application Binary Interface (ABI). The alignment rules for x86 (64-bit) on Linux are specified in the [System V ABI Specification](https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf): -![](https://mostlynerdless.de/wp-content/uploads/2024/03/image-2-2000x1623.png) +![](image-2-2000x1623-6ba84f89.png) And more, but in general, scalar types are aligned by their size. Structs, unions, and arrays are, on the other hand, aligned based on their members: > Structures and unions assume the alignment of their most strictly aligned component. Each member is assigned to the lowest available offset with the appropriate alignment. The size of any object is always a multiple of the object's alignment. @@ -153,7 +153,7 @@ struct padded_event { ``` Pahole tells us that it had to introduce 11 bytes of padding. We can visualize this as follows: -![](https://mostlynerdless.de/wp-content/uploads/2024/03/struct_layout2-2000x772.png) +![](struct_layout2-2000x772-500d58c6.png) This means that we're essentially wasting memory. I recommend reading [The Lost Art of Structure Packing](http://www.catb.org/esr/structure-packing/) by Eric S. Raymond to learn more about this. If we really want to save memory, we could reorder the int with the long member, thereby only needing the padding after the char, leading to an object with 24 bytes and only 3 bytes of padding. This is really important when storing many of these structs in arrays, where the wasted memory accumulates. diff --git a/content/posts/2024/04/14/hello-ebpf-auto-layouting-structs-7/struct_layout-2000x760-12a53b33.jpg b/content/posts/2024/04/14/hello-ebpf-auto-layouting-structs-7/struct_layout-2000x760-12a53b33.jpg new file mode 100644 index 000000000..3b23b1039 Binary files /dev/null and b/content/posts/2024/04/14/hello-ebpf-auto-layouting-structs-7/struct_layout-2000x760-12a53b33.jpg differ diff --git a/content/posts/2024/04/14/hello-ebpf-auto-layouting-structs-7/struct_layout2-2000x772-500d58c6.png b/content/posts/2024/04/14/hello-ebpf-auto-layouting-structs-7/struct_layout2-2000x772-500d58c6.png new file mode 100644 index 000000000..3bf719af9 Binary files /dev/null and b/content/posts/2024/04/14/hello-ebpf-auto-layouting-structs-7/struct_layout2-2000x772-500d58c6.png differ diff --git a/content/posts/2024/04/18/debugging-using-jmx-revisited/5ca4duiw3l3hqipsolap-01f29e6c.png b/content/posts/2024/04/18/debugging-using-jmx-revisited/5ca4duiw3l3hqipsolap-01f29e6c.png new file mode 100644 index 000000000..ea3f9fe5e Binary files /dev/null and b/content/posts/2024/04/18/debugging-using-jmx-revisited/5ca4duiw3l3hqipsolap-01f29e6c.png differ diff --git a/content/posts/2024/04/18/debugging-using-jmx-revisited/index.md b/content/posts/2024/04/18/debugging-using-jmx-revisited/index.md index dbcb056ee..b4fbdf8ef 100644 --- a/content/posts/2024/04/18/debugging-using-jmx-revisited/index.md +++ b/content/posts/2024/04/18/debugging-using-jmx-revisited/index.md @@ -45,7 +45,7 @@ Development and DevOps teams utilize an array of tools, often perceived as compl Such capabilities, although not always necessary for smaller scales, offer significant advantages in application management. Advanced management tools facilitate the navigation and control over multiple machines, making them indispensable for developers seeking to optimize application performance and reliability. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ca4duiw3l3hqipsolap.png) +![Image description](5ca4duiw3l3hqipsolap-01f29e6c.png) ### Introduction to JMX (Java Management Extensions) diff --git a/content/posts/2024/04/22/debug-without-breakpoints/debug-locks-with-pause-dark-1024x441.jpg b/content/posts/2024/04/22/debug-without-breakpoints/debug-locks-with-pause-dark-1024x441.jpg new file mode 100644 index 000000000..601383c1d Binary files /dev/null and b/content/posts/2024/04/22/debug-without-breakpoints/debug-locks-with-pause-dark-1024x441.jpg differ diff --git a/content/posts/2024/04/22/debug-without-breakpoints/debug-locks-with-pause-dark-1024x441.png b/content/posts/2024/04/22/debug-without-breakpoints/debug-locks-with-pause-dark-1024x441.png deleted file mode 100644 index 1e40936ba..000000000 Binary files a/content/posts/2024/04/22/debug-without-breakpoints/debug-locks-with-pause-dark-1024x441.png and /dev/null differ diff --git a/content/posts/2024/04/22/debug-without-breakpoints/debug-without-breakpoints-banner-1024x538-1.jpg b/content/posts/2024/04/22/debug-without-breakpoints/debug-without-breakpoints-banner-1024x538-1.jpg new file mode 100644 index 000000000..f83b48174 Binary files /dev/null and b/content/posts/2024/04/22/debug-without-breakpoints/debug-without-breakpoints-banner-1024x538-1.jpg differ diff --git a/content/posts/2024/04/22/debug-without-breakpoints/debug-without-breakpoints-banner-1024x538-1.png b/content/posts/2024/04/22/debug-without-breakpoints/debug-without-breakpoints-banner-1024x538-1.png deleted file mode 100644 index 84c14649f..000000000 Binary files a/content/posts/2024/04/22/debug-without-breakpoints/debug-without-breakpoints-banner-1024x538-1.png and /dev/null differ diff --git a/content/posts/2024/04/22/debug-without-breakpoints/debug-without-breakpoints-banner-1024x538.jpg b/content/posts/2024/04/22/debug-without-breakpoints/debug-without-breakpoints-banner-1024x538.jpg new file mode 100644 index 000000000..f83b48174 Binary files /dev/null and b/content/posts/2024/04/22/debug-without-breakpoints/debug-without-breakpoints-banner-1024x538.jpg differ diff --git a/content/posts/2024/04/22/debug-without-breakpoints/debug-without-breakpoints-banner-1024x538.png b/content/posts/2024/04/22/debug-without-breakpoints/debug-without-breakpoints-banner-1024x538.png deleted file mode 100644 index 84c14649f..000000000 Binary files a/content/posts/2024/04/22/debug-without-breakpoints/debug-without-breakpoints-banner-1024x538.png and /dev/null differ diff --git a/content/posts/2024/04/22/debug-without-breakpoints/index.md b/content/posts/2024/04/22/debug-without-breakpoints/index.md index 0ce829e4b..0af105d79 100644 --- a/content/posts/2024/04/22/debug-without-breakpoints/index.md +++ b/content/posts/2024/04/22/debug-without-breakpoints/index.md @@ -6,7 +6,7 @@ description: "Learn how to use IntelliJ IDEA's Pause – a lesser known feature canonical: "https://flounder.dev/posts/debug-without-breakpoints/" authors: - "igor-kulakov" -image: "debug-without-breakpoints-banner-1024x538-1.png" +image: "debug-without-breakpoints-banner-1024x538-1.jpg" categories: - "Debugging" - "IntelliJ IDEA" @@ -26,7 +26,7 @@ Read in other languages: [中文](https://flounder.dev/zh/posts/debug-without-br In a typical debugging scenario, you would set breakpoints to tell the debugger when to suspend your program. A breakpoint usually corresponds to the moment that marks the starting point of the further investigation. However, in some situations you aren't certain about where to set a breakpoint. Other times, you might prefer to suspend the program at a particular *time* rather than aiming at a specific *line*. -![post banner](debug-without-breakpoints-banner-1024x538.png) +![post banner](debug-without-breakpoints-banner-1024x538.jpg) In this article, we'll look at IntelliJ IDEA's **Pause** – a lesser known debugging technique, @@ -78,7 +78,7 @@ For a hands-on example of this scenario, see [Debugger.godMode()](https://flound If you suspect a synchronization problem, such as a deadlock or a livelock, **Pause** might help you find exact threads and monitors that are causing the issue. -{{< img src="debug-locks-with-pause-dark-1024x441.png" class="size-large is-resized" alt="The list of threads shows which threads have ended up in a deadlock" width="1024" height="441" style="width:692px" >}} +{{< img src="debug-locks-with-pause-dark-1024x441.jpg" class="size-large is-resized" alt="The list of threads shows which threads have ended up in a deadlock" width="1024" height="441" style="width:692px" >}} Pause the program and inspect the thread list. It will show which threads are blocked. diff --git a/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/Screenshot-2024-04-16-at-17.51.31-1024x588-1.jpg b/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/Screenshot-2024-04-16-at-17.51.31-1024x588-1.jpg new file mode 100644 index 000000000..014442d20 Binary files /dev/null and b/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/Screenshot-2024-04-16-at-17.51.31-1024x588-1.jpg differ diff --git a/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/Screenshot-2024-04-16-at-17.51.31-1024x588-1.png b/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/Screenshot-2024-04-16-at-17.51.31-1024x588-1.png deleted file mode 100644 index ca62c58dd..000000000 Binary files a/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/Screenshot-2024-04-16-at-17.51.31-1024x588-1.png and /dev/null differ diff --git a/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/Screenshot-2024-04-16-at-17.51.31-1024x588.jpg b/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/Screenshot-2024-04-16-at-17.51.31-1024x588.jpg new file mode 100644 index 000000000..014442d20 Binary files /dev/null and b/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/Screenshot-2024-04-16-at-17.51.31-1024x588.jpg differ diff --git a/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/Screenshot-2024-04-16-at-17.51.31-1024x588.png b/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/Screenshot-2024-04-16-at-17.51.31-1024x588.png deleted file mode 100644 index ca62c58dd..000000000 Binary files a/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/Screenshot-2024-04-16-at-17.51.31-1024x588.png and /dev/null differ diff --git a/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/index.md b/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/index.md index 3bd8fce5b..39fccd62e 100644 --- a/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/index.md +++ b/content/posts/2024/04/25/the-high-availability-features-of-microservices-using-chronicle-services/index.md @@ -5,7 +5,7 @@ lastmod: "2024-04-25T13:37:04+00:00" description: "Learn how Chronicle Services, a Java-based framework optimised for low-latency microservices, meets critical requirements by integrating HA, performance, and data persistence." authors: - "rob-austin" -image: "Screenshot-2024-04-16-at-17.51.31-1024x588-1.png" +image: "Screenshot-2024-04-16-at-17.51.31-1024x588-1.jpg" categories: - "Chronicle Software" - "Java" @@ -54,7 +54,7 @@ If there is an issue either with the service or a queue, then it can be restarte [Chronicle Queue](https://chronicle.software/queue-enterprise/ "Chronicle Queue") Replication operates in the context of a cluster of hosts. Within the cluster, one host is set to host the Primary queue instance, sometimes referred to as the source or leader queue, and the others host Secondary queues, sometimes referred to as sink or follower queues. A service will read and post messages only from/to the source queue. -![](Screenshot-2024-04-16-at-17.51.31-1024x588.png) +![](Screenshot-2024-04-16-at-17.51.31-1024x588.jpg) *Diagram 3: Queue Replication* An optional acknowledgement mechanism ensures events are received and stored by at least one secondary host before the replication is deemed successful, thus preventing data loss in the event of a host failure. diff --git a/content/posts/2024/04/29/javafx-links-of-april-2024/index.md b/content/posts/2024/04/29/javafx-links-of-april-2024/index.md index 42c88c65a..5be13d586 100644 --- a/content/posts/2024/04/29/javafx-links-of-april-2024/index.md +++ b/content/posts/2024/04/29/javafx-links-of-april-2024/index.md @@ -6,7 +6,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of April 2024, canonical: "https://webtechie.be/post/2024-04-26-javafx-links-of-april-2024/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2024/04/29/javafx-links-of-april-2024/jfxcentral.jpg b/content/posts/2024/04/29/javafx-links-of-april-2024/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2024/04/29/javafx-links-of-april-2024/jfxcentral.jpg differ diff --git a/content/posts/2024/04/29/javafx-links-of-april-2024/jfxcentral.png b/content/posts/2024/04/29/javafx-links-of-april-2024/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2024/04/29/javafx-links-of-april-2024/jfxcentral.png and /dev/null differ diff --git a/content/posts/2024/04/29/why-this-jcon-europe-talk-is-unmissable-part-1/image-2.jpg b/content/posts/2024/04/29/why-this-jcon-europe-talk-is-unmissable-part-1/image-2.jpg new file mode 100644 index 000000000..e7568900c Binary files /dev/null and b/content/posts/2024/04/29/why-this-jcon-europe-talk-is-unmissable-part-1/image-2.jpg differ diff --git a/content/posts/2024/04/29/why-this-jcon-europe-talk-is-unmissable-part-1/image-2.png b/content/posts/2024/04/29/why-this-jcon-europe-talk-is-unmissable-part-1/image-2.png deleted file mode 100644 index 44125c627..000000000 Binary files a/content/posts/2024/04/29/why-this-jcon-europe-talk-is-unmissable-part-1/image-2.png and /dev/null differ diff --git a/content/posts/2024/04/29/why-this-jcon-europe-talk-is-unmissable-part-1/index.md b/content/posts/2024/04/29/why-this-jcon-europe-talk-is-unmissable-part-1/index.md index 33054456b..c6103f460 100644 --- a/content/posts/2024/04/29/why-this-jcon-europe-talk-is-unmissable-part-1/index.md +++ b/content/posts/2024/04/29/why-this-jcon-europe-talk-is-unmissable-part-1/index.md @@ -17,7 +17,7 @@ frozen: false --- **[JCON Europe](https://2024.europe.jcon.one/) in Cologne is around the corner ([and here are your free Foojay JCON tickets](https://bit.ly/3xv9yfT)), May 13 to 16. Why should you go? Well, one reason is that the talks will be awesome. Here's the start of a series of reasons why some of them are absolutely unmissable!** -![](image-2.png) +![](image-2.jpg) ## **DevOps for Java Developers (Or Maybe Against Them?!) - Baruch Sadogursky** diff --git a/content/posts/2024/05/02/crowd-publishing-the-10x-java-dev-book/10xdev-700x465.jpg b/content/posts/2024/05/02/crowd-publishing-the-10x-java-dev-book/10xdev-700x465.jpg new file mode 100644 index 000000000..9cf127ac9 Binary files /dev/null and b/content/posts/2024/05/02/crowd-publishing-the-10x-java-dev-book/10xdev-700x465.jpg differ diff --git a/content/posts/2024/05/02/crowd-publishing-the-10x-java-dev-book/10xdev-700x465.png b/content/posts/2024/05/02/crowd-publishing-the-10x-java-dev-book/10xdev-700x465.png deleted file mode 100644 index 95e1afcb7..000000000 Binary files a/content/posts/2024/05/02/crowd-publishing-the-10x-java-dev-book/10xdev-700x465.png and /dev/null differ diff --git a/content/posts/2024/05/02/crowd-publishing-the-10x-java-dev-book/index.md b/content/posts/2024/05/02/crowd-publishing-the-10x-java-dev-book/index.md index 6130c2c00..1d1d2ede5 100644 --- a/content/posts/2024/05/02/crowd-publishing-the-10x-java-dev-book/index.md +++ b/content/posts/2024/05/02/crowd-publishing-the-10x-java-dev-book/index.md @@ -27,7 +27,7 @@ That's the question Steve Poole and Olimpiu Pop embarked on to respond. And, wha [ -{{< img src="10xdev-700x465.png" class="size-medium" width="700" height="465" >}} +{{< img src="10xdev-700x465.jpg" class="size-medium" width="700" height="465" >}} ](https://10xjava.dev/) diff --git a/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/index.md b/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/index.md index 982f99d84..602bce3b5 100644 --- a/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/index.md +++ b/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/index.md @@ -5,7 +5,7 @@ lastmod: "2024-05-03T08:37:28+00:00" description: "What makes Kestra unique amongst all the data orchestrators and how to leverage the power of the Java platform and its ecosystem to build a performant, scalable, and feature-rich data orchestrator." authors: - "loic-mathieu" -image: "kestra-software-architecture-700x394-1.png" +image: "kestra-software-architecture-700x394-1.jpg" categories: - "DataEngineering" - "Java" @@ -40,7 +40,7 @@ Let's discover what makes Kestra unique amongst all the data orchestrators and h Kestra's architecture is built on a distributed system, where various components interact asynchronously, primarily through messaging queues. Below is an overview of the key components that make up Kestra's architecture: -![](kestra-software-architecture-700x394.png) +![](kestra-software-architecture-700x394.jpg) ### Core Components of Kestra: diff --git a/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/kestra-software-architecture-700x394-1.jpg b/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/kestra-software-architecture-700x394-1.jpg new file mode 100644 index 000000000..357aa7872 Binary files /dev/null and b/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/kestra-software-architecture-700x394-1.jpg differ diff --git a/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/kestra-software-architecture-700x394-1.png b/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/kestra-software-architecture-700x394-1.png deleted file mode 100644 index 195a00f07..000000000 Binary files a/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/kestra-software-architecture-700x394-1.png and /dev/null differ diff --git a/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/kestra-software-architecture-700x394.jpg b/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/kestra-software-architecture-700x394.jpg new file mode 100644 index 000000000..357aa7872 Binary files /dev/null and b/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/kestra-software-architecture-700x394.jpg differ diff --git a/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/kestra-software-architecture-700x394.png b/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/kestra-software-architecture-700x394.png deleted file mode 100644 index 195a00f07..000000000 Binary files a/content/posts/2024/05/02/writing-a-data-orchestrator-in-java/kestra-software-architecture-700x394.png and /dev/null differ diff --git a/content/posts/2024/05/06/why-this-jcon-europe-talk-is-unmissable-part-2/image.jpg b/content/posts/2024/05/06/why-this-jcon-europe-talk-is-unmissable-part-2/image.jpg new file mode 100644 index 000000000..b85ebca28 Binary files /dev/null and b/content/posts/2024/05/06/why-this-jcon-europe-talk-is-unmissable-part-2/image.jpg differ diff --git a/content/posts/2024/05/06/why-this-jcon-europe-talk-is-unmissable-part-2/image.png b/content/posts/2024/05/06/why-this-jcon-europe-talk-is-unmissable-part-2/image.png deleted file mode 100644 index bce10d1b7..000000000 Binary files a/content/posts/2024/05/06/why-this-jcon-europe-talk-is-unmissable-part-2/image.png and /dev/null differ diff --git a/content/posts/2024/05/06/why-this-jcon-europe-talk-is-unmissable-part-2/index.md b/content/posts/2024/05/06/why-this-jcon-europe-talk-is-unmissable-part-2/index.md index 00fd84e64..dab1416a8 100644 --- a/content/posts/2024/05/06/why-this-jcon-europe-talk-is-unmissable-part-2/index.md +++ b/content/posts/2024/05/06/why-this-jcon-europe-talk-is-unmissable-part-2/index.md @@ -5,7 +5,7 @@ lastmod: "2024-05-06T08:25:45+00:00" description: "My talk titled \"Jakarta EE 11 - Performance and Developer Productivity\" will give you a full overview of what to expect from the upcoming Jakarta EE 11 release." authors: - "r-fichtner" -image: "image.png" +image: "image.jpg" categories: - "Events" - "Jakarta EE" @@ -18,7 +18,7 @@ frozen: false **[JCON Europe](https://2024.europe.jcon.one/) in Cologne is around the corner ([and here are your free Foojay JCON tickets](https://bit.ly/3xv9yfT)), May 13 to 16. Why should you go? Well, one reason is that the talks will be awesome. Here's the start of a series of reasons why some of them are absolutely unmissable!** -{{< img src="image.png" class="size-full is-resized" width="1024" height="682" style="width:582px;height:auto" >}} +{{< img src="image.jpg" class="size-full is-resized" width="1024" height="682" style="width:582px;height:auto" >}} ### Jakarta EE 11 - Performance and Developer Productivity - Ivar Grimstad diff --git a/content/posts/2024/05/08/duplicate-finder-for-documentation/duplicates-idea-dark-e94109d1.png b/content/posts/2024/05/08/duplicate-finder-for-documentation/duplicates-idea-dark-e94109d1.png new file mode 100644 index 000000000..06d88c231 Binary files /dev/null and b/content/posts/2024/05/08/duplicate-finder-for-documentation/duplicates-idea-dark-e94109d1.png differ diff --git a/content/posts/2024/05/08/duplicate-finder-for-documentation/index.md b/content/posts/2024/05/08/duplicate-finder-for-documentation/index.md index b2db3d84f..6b8731278 100644 --- a/content/posts/2024/05/08/duplicate-finder-for-documentation/index.md +++ b/content/posts/2024/05/08/duplicate-finder-for-documentation/index.md @@ -66,7 +66,7 @@ The idea that advocates against duplication is commonly known as [DRY Principle] Modern authoring tools typically have features for content reuse, making technical constraints less of a concern. The real problem, on the other hand, lies in spotting duplicates. Before you extract something to a reusable chunk, you need to know what to extract. If you are a programmer, your IDE might highlight duplicate code for you: -![IntelliJ IDEA hightlights duplicated code](https://flounder.dev/img/duplicates-idea-dark.png "IntelliJ IDEA hightlights duplicated code") +![IntelliJ IDEA hightlights duplicated code](duplicates-idea-dark-e94109d1.png "IntelliJ IDEA hightlights duplicated code") Unfortunately, the same feature is not suitable for documentation, as it relies on comparing abstract syntax trees ([AST](https://en.wikipedia.org/wiki/Abstract_syntax_tree)). This approach doesn't work well with text. diff --git a/content/posts/2024/05/12/building-simple-home-assistant-langchain4j-raspberry-pi/homeassistant-integration-2-d779a0f2.jpg b/content/posts/2024/05/12/building-simple-home-assistant-langchain4j-raspberry-pi/homeassistant-integration-2-d779a0f2.jpg new file mode 100644 index 000000000..e5f563909 Binary files /dev/null and b/content/posts/2024/05/12/building-simple-home-assistant-langchain4j-raspberry-pi/homeassistant-integration-2-d779a0f2.jpg differ diff --git a/content/posts/2024/05/12/building-simple-home-assistant-langchain4j-raspberry-pi/index.md b/content/posts/2024/05/12/building-simple-home-assistant-langchain4j-raspberry-pi/index.md index a6946554c..15c4a9c76 100644 --- a/content/posts/2024/05/12/building-simple-home-assistant-langchain4j-raspberry-pi/index.md +++ b/content/posts/2024/05/12/building-simple-home-assistant-langchain4j-raspberry-pi/index.md @@ -166,7 +166,7 @@ For external smart device integration, I used [Home Assistant](https://www.home- It can be installed on Raspberry Pi via the HomeAssistant OS, a Docker container, or a Python virtual environment, allowing users to manage everything from lighting and climate to security systems directly from their Raspberry Pi. In this project, we utilized a Docker container. -![Home Assistant Integration](https://smart-assistant-langchain4j-blog.s3.amazonaws.com/homeassistant+integration+2.jpg) +![Home Assistant Integration](homeassistant-integration-2-d779a0f2.jpg) After starting the HomeAssistant Docker container, we integrate the smart device using HomeAssistant's extensive device integration options. In this instance, I integrated a TP-Link Kasa Smart Strip via the Home Assistant UI. @@ -285,7 +285,7 @@ public class DocumentRetriever { ## Revisiting the Current Architecture -![Model Bottleneck](https://smart-assistant-langchain4j-blog.s3.amazonaws.com/smart+assistant+archi+bottleneck.PNG) +![Model Bottleneck](smart-assistant-archi-bottleneck-2f771ef4.png) Our model currently processes all queries, determining if a tool can be used while also querying our database. This isn't very efficient. To improve, we split the workload: one LLM handles conversational queries and another manages commands. This requires another LLM to classify the intent of each query as conversational or actionable. We define these intents with an enum and use the `@Description` annotation to inform the LLM. diff --git a/content/posts/2024/05/12/building-simple-home-assistant-langchain4j-raspberry-pi/smart-assistant-archi-bottleneck-2f771ef4.png b/content/posts/2024/05/12/building-simple-home-assistant-langchain4j-raspberry-pi/smart-assistant-archi-bottleneck-2f771ef4.png new file mode 100644 index 000000000..09569fb30 Binary files /dev/null and b/content/posts/2024/05/12/building-simple-home-assistant-langchain4j-raspberry-pi/smart-assistant-archi-bottleneck-2f771ef4.png differ diff --git a/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/index.md b/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/index.md index 41321ec75..ee15cfde3 100644 --- a/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/index.md +++ b/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/index.md @@ -5,7 +5,7 @@ lastmod: "2024-05-13T07:13:39+00:00" description: "Learn about new support for XDP to create a simple package blocker for eBPF." authors: - "johannes-bechberger" -image: "xdp_filter-1-2000x1005-1.png" +image: "xdp_filter-1-2000x1005-1.jpg" categories: - "Tools" related_posts: @@ -29,7 +29,7 @@ This blocks all incoming IPv4 packages from `twitter.com`. We see how it works i ## Network Packet All networking is packet-based, with multiple layers of protocol from shared medium (e.g., Ethernet) to application level (e.g., HTTP): -![](https://mostlynerdless.de/wp-content/uploads/2024/04/network_stack-2000x517.png) +![](network_stack-2000x517-e3edcfd7.png) [Ethernet](https://en.wikipedia.org/wiki/Ethernet) is the lowest-level protocol, with all packets coming to and from network interfaces being ethernet packets. The ethernet header contains the "physical" MAC address of both the source and destination of the package, combined with the protocol number of the next level protocol. We can represent it in C as follows: @@ -113,7 +113,7 @@ Armed with this knowledge, we can now create a package filter: ## Writing a Packet Filter The basic structure of our packet filter application consists of a Java part that handles the configuration and logging and an eBPF part that uses an XDP hook that is called for every received packet. As explained above, The XDP hook decides what to do with every packet. So the structures are as follows: -![](https://mostlynerdless.de/wp-content/uploads/2024/04/xdp_filter-1-2000x1005.png) +![](xdp_filter-1-2000x1005-0e7749c3.jpg) We start with the definition of eBPF for collecting statistics, blocked packets per IP address, and the configuration of the blocked IP addresses: diff --git a/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/network_stack-2000x517-e3edcfd7.png b/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/network_stack-2000x517-e3edcfd7.png new file mode 100644 index 000000000..8bef91f1d Binary files /dev/null and b/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/network_stack-2000x517-e3edcfd7.png differ diff --git a/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/xdp_filter-1-2000x1005-0e7749c3.jpg b/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/xdp_filter-1-2000x1005-0e7749c3.jpg new file mode 100644 index 000000000..4fb42c864 Binary files /dev/null and b/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/xdp_filter-1-2000x1005-0e7749c3.jpg differ diff --git a/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/xdp_filter-1-2000x1005-1.jpg b/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/xdp_filter-1-2000x1005-1.jpg new file mode 100644 index 000000000..4fb42c864 Binary files /dev/null and b/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/xdp_filter-1-2000x1005-1.jpg differ diff --git a/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/xdp_filter-1-2000x1005-1.png b/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/xdp_filter-1-2000x1005-1.png deleted file mode 100644 index 1b946a70a..000000000 Binary files a/content/posts/2024/05/13/hello-ebpf-xdp-based-packet-filter-9/xdp_filter-1-2000x1005-1.png and /dev/null differ diff --git a/content/posts/2024/05/13/oracle-alternatives-survey-report/dimensional.jpg b/content/posts/2024/05/13/oracle-alternatives-survey-report/dimensional.jpg new file mode 100644 index 000000000..07b0f8d67 Binary files /dev/null and b/content/posts/2024/05/13/oracle-alternatives-survey-report/dimensional.jpg differ diff --git a/content/posts/2024/05/13/oracle-alternatives-survey-report/dimensional.png b/content/posts/2024/05/13/oracle-alternatives-survey-report/dimensional.png deleted file mode 100644 index 82e13bb7c..000000000 Binary files a/content/posts/2024/05/13/oracle-alternatives-survey-report/dimensional.png and /dev/null differ diff --git a/content/posts/2024/05/13/oracle-alternatives-survey-report/image-1-1024x799.jpg b/content/posts/2024/05/13/oracle-alternatives-survey-report/image-1-1024x799.jpg new file mode 100644 index 000000000..f4932e60b Binary files /dev/null and b/content/posts/2024/05/13/oracle-alternatives-survey-report/image-1-1024x799.jpg differ diff --git a/content/posts/2024/05/13/oracle-alternatives-survey-report/image-1-1024x799.png b/content/posts/2024/05/13/oracle-alternatives-survey-report/image-1-1024x799.png deleted file mode 100644 index 07dc066fb..000000000 Binary files a/content/posts/2024/05/13/oracle-alternatives-survey-report/image-1-1024x799.png and /dev/null differ diff --git a/content/posts/2024/05/13/oracle-alternatives-survey-report/index.md b/content/posts/2024/05/13/oracle-alternatives-survey-report/index.md index d03107713..a553e1e05 100644 --- a/content/posts/2024/05/13/oracle-alternatives-survey-report/index.md +++ b/content/posts/2024/05/13/oracle-alternatives-survey-report/index.md @@ -5,7 +5,7 @@ lastmod: "2024-05-17T20:31:26+00:00" description: "Azul is planning to issue an Oracle \"alternatives\" Report in late July, and would like your help to complete the survey." authors: - "geertjan-wielenga" -image: "dimensional.png" +image: "dimensional.jpg" categories: - "Java Core" - "Performance" @@ -30,7 +30,7 @@ Below is the link to the survey. There are only 25 questions in total, including the screener questions, so this should only take about 10 - 15 minutes to complete. -[![](image-1-1024x799.png)](https://survey.alchemer.com/s3/7845442/Azul) +[![](image-1-1024x799.jpg)](https://survey.alchemer.com/s3/7845442/Azul) The survey will close in two weeks time, so if you could complete this report within that timeframe that would be great! diff --git a/content/posts/2024/05/15/software-testing-as-a-debugging-tool/e68vok14tqn9irjxbkl8-00815ecd.jpg b/content/posts/2024/05/15/software-testing-as-a-debugging-tool/e68vok14tqn9irjxbkl8-00815ecd.jpg new file mode 100644 index 000000000..576d5f75e Binary files /dev/null and b/content/posts/2024/05/15/software-testing-as-a-debugging-tool/e68vok14tqn9irjxbkl8-00815ecd.jpg differ diff --git a/content/posts/2024/05/15/software-testing-as-a-debugging-tool/index.md b/content/posts/2024/05/15/software-testing-as-a-debugging-tool/index.md index 091dba097..6cdec653e 100644 --- a/content/posts/2024/05/15/software-testing-as-a-debugging-tool/index.md +++ b/content/posts/2024/05/15/software-testing-as-a-debugging-tool/index.md @@ -62,7 +62,7 @@ It is my opinion that unit tests should be excluded from coverage metrics due to The debug-fix cycle is a structured approach that integrates testing into the debugging process. The stages include identifying the bug, creating a test that reproduces the bug, fixing the bug, verifying the fix with the test, and finally, running the application to ensure the fix works in the live environment. This cycle emphasizes the importance of testing in not only identifying but also in preventing the recurrence of bugs. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zyjfmzm6mq9jd0xu3mue.png) +![Image description](zyjfmzm6mq9jd0xu3mue-a466d7d3.png) Notice that this is a simplified version of the cycle with a focus on the testing aspect only. The full cycle includes discussion of the issue tracking and versioning as part of the whole process. I discuss this more in-depth in other posts in the series and my book. @@ -74,7 +74,7 @@ Increasing test coverage is about more than hitting a percentage; it's about ens In this case you will notice that the next line in the body is a rejectValue call which will throw an exception. I don't want an exception thrown as I still want to test all the permutations of the method. I can drag the execution pointer (arrow on the left) and place it back at the start of the method. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e68vok14tqn9irjxbkl8.png) +![Image description](e68vok14tqn9irjxbkl8-00815ecd.jpg) ## Test-Driven Development diff --git a/content/posts/2024/05/15/software-testing-as-a-debugging-tool/zyjfmzm6mq9jd0xu3mue-a466d7d3.png b/content/posts/2024/05/15/software-testing-as-a-debugging-tool/zyjfmzm6mq9jd0xu3mue-a466d7d3.png new file mode 100644 index 000000000..2b401e49e Binary files /dev/null and b/content/posts/2024/05/15/software-testing-as-a-debugging-tool/zyjfmzm6mq9jd0xu3mue-a466d7d3.png differ diff --git a/content/posts/2024/05/21/jmanc-unconference-2024/index.md b/content/posts/2024/05/21/jmanc-unconference-2024/index.md index 7851d0daf..985cc55c3 100644 --- a/content/posts/2024/05/21/jmanc-unconference-2024/index.md +++ b/content/posts/2024/05/21/jmanc-unconference-2024/index.md @@ -5,7 +5,7 @@ lastmod: "2024-05-22T10:58:36+00:00" description: "The Manchester Java Community are delighted to announce the return of JManc Unconference on Friday 28th June 2024!" authors: - "nick-ebbitt" -image: "https://jmanc.org/assets/images/jmanc-logo.png" +image: "jmanc-logo-9875160f.png" categories: - "Conference" - "Events" @@ -18,7 +18,7 @@ related_posts: frozen: true --- -[![JManc Unconferece](https://jmanc.org/assets/images/jmanc-logo.png "JManc Unconferece")](https://www.jmanc.org "JManc Unconferece") +[![JManc Unconferece](jmanc-logo-9875160f.png "JManc Unconferece")](https://www.jmanc.org "JManc Unconferece") **The Manchester Java Community are delighted to announce the return of JManc Unconference on Friday 28th June 2024!** diff --git a/content/posts/2024/05/21/jmanc-unconference-2024/jmanc-logo-9875160f.png b/content/posts/2024/05/21/jmanc-unconference-2024/jmanc-logo-9875160f.png new file mode 100644 index 000000000..3c53cf80f Binary files /dev/null and b/content/posts/2024/05/21/jmanc-unconference-2024/jmanc-logo-9875160f.png differ diff --git a/content/posts/2024/05/23/debug-unresponsive-apps/debug-unresponsive-apps-banner-3e5418c2.jpg b/content/posts/2024/05/23/debug-unresponsive-apps/debug-unresponsive-apps-banner-3e5418c2.jpg new file mode 100644 index 000000000..309f601df Binary files /dev/null and b/content/posts/2024/05/23/debug-unresponsive-apps/debug-unresponsive-apps-banner-3e5418c2.jpg differ diff --git a/content/posts/2024/05/23/debug-unresponsive-apps/debug-unresponsive-apps-banner.jpg b/content/posts/2024/05/23/debug-unresponsive-apps/debug-unresponsive-apps-banner.jpg new file mode 100644 index 000000000..6404c346d Binary files /dev/null and b/content/posts/2024/05/23/debug-unresponsive-apps/debug-unresponsive-apps-banner.jpg differ diff --git a/content/posts/2024/05/23/debug-unresponsive-apps/debug-unresponsive-apps-banner.png b/content/posts/2024/05/23/debug-unresponsive-apps/debug-unresponsive-apps-banner.png deleted file mode 100644 index 5b0f73bab..000000000 Binary files a/content/posts/2024/05/23/debug-unresponsive-apps/debug-unresponsive-apps-banner.png and /dev/null differ diff --git a/content/posts/2024/05/23/debug-unresponsive-apps/index.md b/content/posts/2024/05/23/debug-unresponsive-apps/index.md index 6331a004f..1e5b84ab7 100644 --- a/content/posts/2024/05/23/debug-unresponsive-apps/index.md +++ b/content/posts/2024/05/23/debug-unresponsive-apps/index.md @@ -6,7 +6,7 @@ description: "Learn how to debug unresponsive Java/JVM applications, then reload canonical: "https://flounder.dev/posts/debug-unresponsive-apps/" authors: - "igor-kulakov" -image: "debug-unresponsive-apps-banner.png" +image: "debug-unresponsive-apps-banner.jpg" categories: - "IntelliJ IDEA" - "Java" @@ -23,7 +23,7 @@ frozen: false Read in other languages: [中文](https://flounder.dev/zh/posts/debug-unresponsive-apps/) [Español](https://flounder.dev/es/posts/debug-unresponsive-apps/) [Português](https://flounder.dev/pt/posts/debug-unresponsive-apps/) **There are a lot of debugger tutorials out there that teach you how to set line breakpoints, log values, or evaluate expressions. While this knowledge alone gives you a lot of tools for debugging your application, real-world scenarios may be somewhat trickier and require a more advanced approach.** -![Debug Unresponsive Apps – post banner](https://flounder.dev/img/debug-unresponsive-apps-banner.png) +![Debug Unresponsive Apps – post banner](debug-unresponsive-apps-banner-3e5418c2.jpg) In this article, we will learn how to locate code that causes a UI freeze without much prior knowledge of the project and fix faulty code on the fly. diff --git a/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/api-system-information-1024x813.jpg b/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/api-system-information-1024x813.jpg new file mode 100644 index 000000000..99a466172 Binary files /dev/null and b/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/api-system-information-1024x813.jpg differ diff --git a/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/api-system-information-1024x813.png b/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/api-system-information-1024x813.png deleted file mode 100644 index cf848cf38..000000000 Binary files a/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/api-system-information-1024x813.png and /dev/null differ diff --git a/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/api-system-information.jpg b/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/api-system-information.jpg new file mode 100644 index 000000000..c01349a95 Binary files /dev/null and b/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/api-system-information.jpg differ diff --git a/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/api-system-information.png b/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/api-system-information.png deleted file mode 100644 index 86f62294d..000000000 Binary files a/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/api-system-information.png and /dev/null differ diff --git a/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/index.md b/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/index.md index 0dcdd6ecb..e03c03d3b 100644 --- a/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/index.md +++ b/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/index.md @@ -5,7 +5,7 @@ lastmod: "2024-09-12T15:24:56+00:00" description: "Multiple improvements have been implemented in the new release, V2.6.0 (2024-04-29) of Pi4J, a friendly object-oriented I/O API and implementation…" authors: - "frankdelporte" -image: "pi4j.png" +image: "pi4j.jpg" categories: - "Embedded" - "Interviews" @@ -49,7 +49,7 @@ This new class is already used as the basis for the website [api.pi4j.com](https {{< gallery >}} api-boards-915x1024.jpg -api-system-information-1024x813.png +api-system-information-1024x813.jpg {{< /gallery >}} ## Interview with Robert von Burg @@ -99,7 +99,7 @@ These devices, as they become more powerful with each generation, make it easier {{< gallery >}} tom-808x1024.jpg desk-1024x768.jpg -pi4j-example-devices-1024x812.png +pi4j-example-devices-1024x812.jpg {{< /gallery >}} ***Can you introduce yourself? What is your history in software (Java) development?*** diff --git a/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/pi4j-example-devices-1024x812.jpg b/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/pi4j-example-devices-1024x812.jpg new file mode 100644 index 000000000..6bde2c0e6 Binary files /dev/null and b/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/pi4j-example-devices-1024x812.jpg differ diff --git a/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/pi4j-example-devices-1024x812.png b/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/pi4j-example-devices-1024x812.png deleted file mode 100644 index 01fc1198e..000000000 Binary files a/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/pi4j-example-devices-1024x812.png and /dev/null differ diff --git a/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/pi4j.jpg b/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/pi4j.jpg new file mode 100644 index 000000000..0757f884e Binary files /dev/null and b/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/pi4j.jpg differ diff --git a/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/pi4j.png b/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/pi4j.png deleted file mode 100644 index 4fc005fec..000000000 Binary files a/content/posts/2024/05/24/evolutions-in-the-pi4j-library-by-tom-aarts-and-robert-von-burg/pi4j.png and /dev/null differ diff --git a/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/image-2-1024x578.jpg b/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/image-2-1024x578.jpg new file mode 100644 index 000000000..3e5189069 Binary files /dev/null and b/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/image-2-1024x578.jpg differ diff --git a/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/image-2-1024x578.png b/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/image-2-1024x578.png deleted file mode 100644 index 7e5990c6b..000000000 Binary files a/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/image-2-1024x578.png and /dev/null differ diff --git a/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/image-4-1024x242.jpg b/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/image-4-1024x242.jpg new file mode 100644 index 000000000..d5fd67703 Binary files /dev/null and b/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/image-4-1024x242.jpg differ diff --git a/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/image-4-1024x242.png b/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/image-4-1024x242.png deleted file mode 100644 index cd2cc6872..000000000 Binary files a/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/image-4-1024x242.png and /dev/null differ diff --git a/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/index.md b/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/index.md index 43c47d7d7..dc6a38217 100644 --- a/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/index.md +++ b/content/posts/2024/05/24/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/index.md @@ -35,7 +35,7 @@ Two primary challenges to DevOps productivity are alert fatigue due to out-of-co ### Benefits of Azul Intelligence Cloud -![](image-2-1024x578.png) +![](image-2-1024x578.jpg) Intelligence Cloud is designed to help engineering managers effectively deal with the challenges of technical debt and security maintenance with the Code Inventory and Vulnerability Detection features. @@ -90,4 +90,4 @@ Intelligence Cloud works with any JVM from any vendor or distribution including It frees up developers for more important business initiatives and improves DevOps productivity. Try Intelligence Cloud, including Vulnerability Detection and Code Inventory, and see if it's right for your business. -[![](image-4-1024x242.png)](https://www.azul.com/products/intelligence-cloud/) +[![](image-4-1024x242.jpg)](https://www.azul.com/products/intelligence-cloud/) diff --git a/content/posts/2024/05/28/the-tornadovm-programming-model-explained/R3gwI0qijGk-819f33b6.jpg b/content/posts/2024/05/28/the-tornadovm-programming-model-explained/R3gwI0qijGk-819f33b6.jpg new file mode 100644 index 000000000..ce759da23 Binary files /dev/null and b/content/posts/2024/05/28/the-tornadovm-programming-model-explained/R3gwI0qijGk-819f33b6.jpg differ diff --git a/content/posts/2024/05/28/the-tornadovm-programming-model-explained/back-c8acc920.jpg b/content/posts/2024/05/28/the-tornadovm-programming-model-explained/back-c8acc920.jpg new file mode 100644 index 000000000..c84bce8c7 Binary files /dev/null and b/content/posts/2024/05/28/the-tornadovm-programming-model-explained/back-c8acc920.jpg differ diff --git a/content/posts/2024/05/28/the-tornadovm-programming-model-explained/index.md b/content/posts/2024/05/28/the-tornadovm-programming-model-explained/index.md index 26c1ede1d..7321c4598 100644 --- a/content/posts/2024/05/28/the-tornadovm-programming-model-explained/index.md +++ b/content/posts/2024/05/28/the-tornadovm-programming-model-explained/index.md @@ -19,7 +19,7 @@ frozen: false ## Key Takeaways -![](https://raw.githubusercontent.com/jjfumero/jjfumero.github.io/master/files/blog/24-02-prog-model/back.jpg) +![](back-c8acc920.jpg) * [TornadoVM](https://github.com/beehive-lab/TornadoVM/) offers an API for parallel programming on modern hardware that tackles data parallel, task parallel and pipeline parallel applications. * TornadoVM offers different abstractions to developers to be able to express parallel applications in Java, identify the methods to offload, and dispatch the application on the corresponding accelerators. @@ -39,7 +39,7 @@ This API contains the building blocks to be used by developers to express parall This API is the main content of this blog post. -![Alt text](https://raw.githubusercontent.com/jjfumero/jjfumero.github.io/master/files/blog/24-02-prog-model/progModel.jpg) +![Alt text](progModel.jpg) Under the hoods, the TornadoVM runtime system and the Just-In-Time compiler, optimise, compile and dispatch the input application on heterogeneous hardware. @@ -273,7 +273,7 @@ Cool, isn't it? If you want to know more about dynamic reconfiguration, [this pa There are more methods in the `TornadoExecutionPlan` class. We covered just two of them. If you are interested, I invite you to read the documentation and the examples. Additionally, I recorded a video showing, step by step, some of these functions in action. -[![](https://markdown-videos-api.jorgenkh.no/youtube/R3gwI0qijGk)](https://youtu.be/R3gwI0qijGk) +[![](R3gwI0qijGk-819f33b6.jpg)](https://youtu.be/R3gwI0qijGk) ## Summary diff --git a/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/5souUR9e_gbEEdcUwWvq8_cjleyFGglaQaCSV-XF-1f7bcce0.png b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/5souUR9e_gbEEdcUwWvq8_cjleyFGglaQaCSV-XF-1f7bcce0.png new file mode 100644 index 000000000..75f02ace9 Binary files /dev/null and b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/5souUR9e_gbEEdcUwWvq8_cjleyFGglaQaCSV-XF-1f7bcce0.png differ diff --git a/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/BwVEUQqMIDekxlKXgiuOiQcycoM_fP3ncRjVNgRD-6c8d6e72.jpg b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/BwVEUQqMIDekxlKXgiuOiQcycoM_fP3ncRjVNgRD-6c8d6e72.jpg new file mode 100644 index 000000000..e6b175918 Binary files /dev/null and b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/BwVEUQqMIDekxlKXgiuOiQcycoM_fP3ncRjVNgRD-6c8d6e72.jpg differ diff --git a/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/PS0HlbtZNajjlTe9AFg1yoW7fvGyKeSpHGwfk3_k-70062f3c.png b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/PS0HlbtZNajjlTe9AFg1yoW7fvGyKeSpHGwfk3_k-70062f3c.png new file mode 100644 index 000000000..f4509d237 Binary files /dev/null and b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/PS0HlbtZNajjlTe9AFg1yoW7fvGyKeSpHGwfk3_k-70062f3c.png differ diff --git a/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/XheHrYXEE6j_GaROcmgI_0-OFJx9GJes1uVcEGDc-46bed74c.png b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/XheHrYXEE6j_GaROcmgI_0-OFJx9GJes1uVcEGDc-46bed74c.png new file mode 100644 index 000000000..62c189fc9 Binary files /dev/null and b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/XheHrYXEE6j_GaROcmgI_0-OFJx9GJes1uVcEGDc-46bed74c.png differ diff --git a/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/_Z7fqvsbvQ2kXJY286iM-ysvQJCHwlaWgmBACBFZ-5815d2c2.jpg b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/_Z7fqvsbvQ2kXJY286iM-ysvQJCHwlaWgmBACBFZ-5815d2c2.jpg new file mode 100644 index 000000000..22cea0822 Binary files /dev/null and b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/_Z7fqvsbvQ2kXJY286iM-ysvQJCHwlaWgmBACBFZ-5815d2c2.jpg differ diff --git a/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/a-y2F-t0K9ph-4-0ERwSLy7-xhLDMQZD1qz7FU8t-4e925d19.png b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/a-y2F-t0K9ph-4-0ERwSLy7-xhLDMQZD1qz7FU8t-4e925d19.png new file mode 100644 index 000000000..cde5667ae Binary files /dev/null and b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/a-y2F-t0K9ph-4-0ERwSLy7-xhLDMQZD1qz7FU8t-4e925d19.png differ diff --git a/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/aN200b1SULDTwrg5inwDuNFKLCVyYstVuYOSXLqA-63969997.png b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/aN200b1SULDTwrg5inwDuNFKLCVyYstVuYOSXLqA-63969997.png new file mode 100644 index 000000000..6265e6b98 Binary files /dev/null and b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/aN200b1SULDTwrg5inwDuNFKLCVyYstVuYOSXLqA-63969997.png differ diff --git a/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/bY_lTq_EAXUwfuP_MEsLYcuwwdx13wKCCYAAL83K-d53ea973.jpg b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/bY_lTq_EAXUwfuP_MEsLYcuwwdx13wKCCYAAL83K-d53ea973.jpg new file mode 100644 index 000000000..6c5c206cb Binary files /dev/null and b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/bY_lTq_EAXUwfuP_MEsLYcuwwdx13wKCCYAAL83K-d53ea973.jpg differ diff --git a/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/hFMjxcQstglWY0IjbgKqiHB9dk7KlKATQnBIBLZh-b1ecff54.png b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/hFMjxcQstglWY0IjbgKqiHB9dk7KlKATQnBIBLZh-b1ecff54.png new file mode 100644 index 000000000..1827a9648 Binary files /dev/null and b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/hFMjxcQstglWY0IjbgKqiHB9dk7KlKATQnBIBLZh-b1ecff54.png differ diff --git a/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/index.md b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/index.md index ec9b7a44d..9f55e65ad 100644 --- a/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/index.md +++ b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/index.md @@ -23,7 +23,7 @@ In November, [Cohere released a dataset containing all of Wikipedia](https://hug Computing this many embeddings yourself would cost in the neighborhood of $5000, so the public release of this dataset makes creating [a semantic, vector-based index](https://www.datastax.com/guides/what-is-vector-search) of Wikipedia practical for an individual for the first time. Here's what we're building: -![](https://lh7-us.googleusercontent.com/ydeHYk97v6Bza1GF0wbbHUEzxgCAJLfwbRcVnWvUP6QDPKKY5YQH00Dvi2n6VgkioW_PGqwckcCnQu9cJ2nOz2XSuL_27HNPAAbZdv2vXPOy_vUJ_Vcg-ii83E4jaqMycskzmzt8wBP1XsOYh5b7Cv4) +![](ydeHYk97v6Bza1GF0wbbHUEzxgCAJLfwbRcVnWvU-584b8743.png) You can try searching the completed index [on a public demo instance here](https://jvectordemo.com:8443/). @@ -32,7 +32,7 @@ Sure, the dataset is big (180GB for the English corpus), but that's not the obst The obstacle is that until now, off-the-shelf vector databases could not index a dataset larger than memory, because both the full-resolution vectors and the index (edge list) needed to be kept in memory during index construction. Larger datasets could be split into [segments](https://stackoverflow.com/questions/2703432/what-are-segments-in-lucene), but this means that at query time they need to search each segment separately, then combine the results, turning an O(log N) search per segment into O(N) overall. (In their latest release, [Lucene attempts to mitigate this by processing segments in parallel with multiple threads](https://www.elastic.co/search-labs/blog/elasticsearch-lucene-vector-database-gains), but obviously (1) this only gives you a constant factor of improvement before you run out of CPU cores and (2) this does not improve throughput.) Specifically, if you're indexing 1536-dimension vectors (the size of ada002 or openai-v3-small), then you can fit about 5M vectors and their associated edge lists in a 32GB index construction RAM budget. -![](https://lh7-us.googleusercontent.com/-BwVEUQqMIDekxlKXgiuOiQcycoM_fP3ncRjVNgRD7W7SzcsTigI4tjsmE-S4x35PIgEpwNxVioZxD50ah2PzQXuVCo22TXiI80EFpjpnCf4X-JjTPBb6FqVC4CJFdrYkoG6aLYxFNotM_MX_NoIpDk) +![](BwVEUQqMIDekxlKXgiuOiQcycoM_fP3ncRjVNgRD-6c8d6e72.jpg) [JVector](https://github.com/jbellis/jvector/), the library that powers [DataStax Astra](https://www.datastax.com/products/datastax-astra) vector search, now supports indexing larger-than-memory datasets by performing construction-related searches with compressed vectors. This means that the edge lists need to fit in memory, but the uncompressed vectors do not, which gives us enough headroom to index Wikipedia-en on a laptop. @@ -60,28 +60,28 @@ The full source of the index construction class is [here](https://github.com/jbe JVector is based on the [DiskANN](https://www.microsoft.com/en-us/research/publication/diskann-fast-accurate-billion-point-nearest-neighbor-search-on-a-single-node/) vector index design, which performs an initial search using vectors compressed lossily with [product quantization (PQ)](https://towardsdatascience.com/similarity-search-product-quantization-b2a1a6397701) in memory, then reranks the results using high-resolution vectors from disk. However, while DiskANN stores full, uncompressed vectors to perform reranking, JVector is able to improve on that using [Locally-Adaptive Quantization (LVQ)](https://arxiv.org/abs/2402.02044) compression. To set this up, we'll first load some vectors into a RandomAccessVectorValues (RAVV) instance. RAVV is a JVector interface for a vector container; it could be List or Map based, in-memory or on-disk. In this case we'll use a simple List-backed RAVV. We'll compute the parameters for both compressions (kmeans clustering for PQ, global mean for LVQ) from a single shard of the dataset. At about 110k rows, this is enough data to have a statistically valid sample. -![](https://lh7-us.googleusercontent.com/aN200b1SULDTwrg5inwDuNFKLCVyYstVuYOSXLqAos2D_psAoMp8V5CXjXDKCEKcCZc5JyM7U27qg7LPp14mfQh9nktRzXaXE4pteHFINO-HPS_xxW4ESxf1glxanb5gG2xoAmx1r2qaiReZXcFI--4) +![](aN200b1SULDTwrg5inwDuNFKLCVyYstVuYOSXLqA-63969997.png) Next, we compute the PQ compression codebook; we're compressing the vectors by a factor of 64, because the Cohere v3 embeddings can be PQ-compressed that much without losing accuracy, after reranking. [Binary Quantization only gives us 32x compression and is less accurate](https://thenewstack.io/why-vector-size-matters/). -![](https://lh7-us.googleusercontent.com/PS0HlbtZNajjlTe9AFg1yoW7fvGyKeSpHGwfk3_k5dHs08QOkTphXeO03AO2Chx-mxw5lV2wD81xo3lNGB9raJojFYrg6z2-OTIA05fUfVHzpGIM12R-veeTPLirOhjGTvcM-Uch31c5SZmgGDbiIrM) +![](PS0HlbtZNajjlTe9AFg1yoW7fvGyKeSpHGwfk3_k-70062f3c.png) Finally, we need to set up LVQ. LVQ gives us 4x compression while losing no measurable accuracy over the full uncompressed vectors, resulting in both a smaller footprint on disk and faster searches. (I thank the vector search team at Intel Research for pointing this out to us.) -![](https://lh7-us.googleusercontent.com/XheHrYXEE6j_GaROcmgI_0-OFJx9GJes1uVcEGDcYFUvi0Gu3ZqXgpqV38iMbxL25JvCmIcFRsxG8EoqZ2aT332JWYAwSeRHnKPzY-un5LO2eun1Eio0ZTya312IXv_AV1xJ88HUT6Fxb96uNtFokGU) +![](XheHrYXEE6j_GaROcmgI_0-OFJx9GJes1uVcEGDc-46bed74c.png) ## GraphIndexBuilder Next, we need to instantiate and configure our GraphIndexBuilder. -![](https://lh7-us.googleusercontent.com/veV6oVgpkDyr-WLPIMzzTtHD0q8MIT3sQxOauqdXwzXExFBQ2FD9btPpVXf-DTuk0OEJAVWpHf6IduBDIiyGSyDwdsEICTyoTjUocG7PgkxIRiMIpIRPpGjiSFoKm9Z-B0vOU4uYRtPsew1Oi3f_bis) +![](veV6oVgpkDyr-WLPIMzzTtHD0q8MIT3sQxOauqdX-0a42b4e5.png) This instantiates a JVector GraphIndexBuilder and connects it to an OnDiskGraphIndexWriter, and tells it to use the PQ-compressed vectors list (which starts empty and will grow as we add vectors to the index) during construction (in the BuildScoreProvider). ## Chronicle Map and RowData We'll store article contents in RowData records. This content is what has been encoded as the corresponding vector in the dataset, and is what we want to return to the user in our search results. -![](https://lh7-us.googleusercontent.com/veVvO8QUrY_k_YGDwavo_dBaIoM5ZGGfaN5dowCroJAgJv-37JZIWq0jX78rY0R8g6wvRO1QxvTv-dMuEVMJRvmrvdbmLAHlBJqUd9yoyIXD0DADDlZQXyZcyLPcp-F4zAcRb1obXtvJO6d4oXTGD7M) +![](veVvO8QUrY_k_YGDwavo_dBaIoM5ZGGfaN5dowCr-f2ccd56d.jpg) To turn the vector index's search results (a list of integer vector ids) into RowData, we store the RowData in a Map keyed by the vector id. This will be a lot of data, so we use [ChronicleMap](https://github.com/OpenHFT/Chronicle-Map) to store this on disk with a minimal in-memory footprint. -![](https://lh7-us.googleusercontent.com/hFMjxcQstglWY0IjbgKqiHB9dk7KlKATQnBIBLZh_hGvdsuo6_UDQi8ydn3RA0ELYpJlng0HERqxUG1nmpj5HRNFPRhIHhhOtnC6vc7XHsIZnwI-fcyRK8gNnPeKpLUUQNVjGnK9EP1RHU6UPs0SLsw) +![](hFMjxcQstglWY0IjbgKqiHB9dk7KlKATQnBIBLZh-b1ecff54.png) We need to tell ChronicleMap how large it's going to be, both in entry count and entry size. Undersizing these will cause it to crash ([my primary complaint](https://github.com/OpenHFT/Chronicle-Map/issues/533) about ChronicleMap), so we deliberately use a high estimate. @@ -96,7 +96,7 @@ We use Java's parallel Streams to process the shards in parallel. For each row i 3. Call *builder.addGraphNode*– order is important because both (1) and (2) are used when we call addGraphNode 4. Call *contentMap.put* with the article chunk data. -![](https://lh7-us.googleusercontent.com/5souUR9e_gbEEdcUwWvq8_cjleyFGglaQaCSV-XFkv-3Ij7cGYgd13UcyGdwIYE6Xw5zD4WiFSxGO1phrEK8w6UWx6BanZVWXQ4oBnkHdh6aEFB4DIllhK15HjZJ9iJyQKV5ts9QTLQqF3uufChXdPE) ![](https://lh7-us.googleusercontent.com/_Z7fqvsbvQ2kXJY286iM-ysvQJCHwlaWgmBACBFZfSOscrSbGtYMkGOlKbA5cWuaB4-M_aN1Y6idM1pWEEvUvQJh-22d71eAxAR5hxZNwBy1dedc1DIApiKTfSpLQMsIIzN3yozbSPProh5TJT_TkvU) +![](5souUR9e_gbEEdcUwWvq8_cjleyFGglaQaCSV-XF-1f7bcce0.png) ![](_Z7fqvsbvQ2kXJY286iM-ysvQJCHwlaWgmBACBFZ-5815d2c2.jpg) You can look at [the full source](https://github.com/jbellis/coherepedia-jvector/blob/master/src/main/java/io/github/jbellis/BuildIndex.java) if you're curious about *forEachRow*, it's just standard "pull data out of Arrow" stuff. @@ -125,17 +125,17 @@ These are respectively ## Loading the index (after construction) The code for serving queries is found in the [WebSearch](https://github.com/jbellis/coherepedia-jvector/blob/master/src/main/java/io/github/jbellis/WebSearch.java) class. We're using Spark ([the web framework](https://sparkjava.com/), not the big data engine) to serve a simple search form: -![](https://lh7-us.googleusercontent.com/a-y2F-t0K9ph-4-0ERwSLy7-xhLDMQZD1qz7FU8tDPvj6w1MUhkhznWEksElvPh_1twzn68B8nD6q6wheKlAqxUyyghNhPmxDEs69fYiKTKEtILwwuFhSPNmsDVhS395kDu3hlggzUQIKtG0S_PJxRw) +![](a-y2F-t0K9ph-4-0ERwSLy7-xhLDMQZD1qz7FU8t-4e925d19.png) Construction needed a relatively large heap to keep the edge lists in memory. With that complete, we only need enough to keep the PQ-compressed vectors in memory; *exec@serve*is configured to use a 4GB heap. WebSearch ([the class behind *exec@serve*](https://github.com/jbellis/coherepedia-jvector/blob/master/src/main/java/io/github/jbellis/WebSearch.java)) first has a static initializer to load the PQ vectors and open the ChronicleMap. We also create a reusable GraphSearcher instance: -![](https://lh7-us.googleusercontent.com/ofHaU8px5jnF0FCupz_mJt4CMc1Bg8Lul36DcScuviM3IPj8UnL7FKD-TMnUh3Lyn41n0Krn_FoooHNaJjf_112xF44SZk9BPe5O-74tuF8VwrmCVEeB571RGYJ-DILbeq4qGFN1MHZQaqxI6v-U8Bw) +![](ofHaU8px5jnF0FCupz_mJt4CMc1Bg8Lul36DcScu-38417974.png) ## Performing a search Executing a search and turning it into RowData for the user looks like this: -![](https://lh7-us.googleusercontent.com/-bY_lTq_EAXUwfuP_MEsLYcuwwdx13wKCCYAAL83KaxSQ1x8VBbAjlbqGWCxL998vVAlBfEmOxTXZIRkJp8-uTLb0FLXrvCdGICWggC13UKXPCjBq42D5guoHk5IvShjzgpf1IvD2JYcQiIJnyDKedo) +![](bY_lTq_EAXUwfuP_MEsLYcuwwdx13wKCCYAAL83K-d53ea973.jpg) There are four "paragraphs" of code here, containing diff --git a/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/ofHaU8px5jnF0FCupz_mJt4CMc1Bg8Lul36DcScu-38417974.png b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/ofHaU8px5jnF0FCupz_mJt4CMc1Bg8Lul36DcScu-38417974.png new file mode 100644 index 000000000..069218752 Binary files /dev/null and b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/ofHaU8px5jnF0FCupz_mJt4CMc1Bg8Lul36DcScu-38417974.png differ diff --git a/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/veV6oVgpkDyr-WLPIMzzTtHD0q8MIT3sQxOauqdX-0a42b4e5.png b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/veV6oVgpkDyr-WLPIMzzTtHD0q8MIT3sQxOauqdX-0a42b4e5.png new file mode 100644 index 000000000..4a9d56d56 Binary files /dev/null and b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/veV6oVgpkDyr-WLPIMzzTtHD0q8MIT3sQxOauqdX-0a42b4e5.png differ diff --git a/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/veVvO8QUrY_k_YGDwavo_dBaIoM5ZGGfaN5dowCr-f2ccd56d.jpg b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/veVvO8QUrY_k_YGDwavo_dBaIoM5ZGGfaN5dowCr-f2ccd56d.jpg new file mode 100644 index 000000000..f72b19f04 Binary files /dev/null and b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/veVvO8QUrY_k_YGDwavo_dBaIoM5ZGGfaN5dowCr-f2ccd56d.jpg differ diff --git a/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/ydeHYk97v6Bza1GF0wbbHUEzxgCAJLfwbRcVnWvU-584b8743.png b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/ydeHYk97v6Bza1GF0wbbHUEzxgCAJLfwbRcVnWvU-584b8743.png new file mode 100644 index 000000000..f16a1195b Binary files /dev/null and b/content/posts/2024/05/29/indexing-all-of-wikipedia-on-a-laptop/ydeHYk97v6Bza1GF0wbbHUEzxgCAJLfwbRcVnWvU-584b8743.png differ diff --git a/content/posts/2024/05/30/who-instruments-the-instrumenters/image-1-2000x1144-da5995a2.jpg b/content/posts/2024/05/30/who-instruments-the-instrumenters/image-1-2000x1144-da5995a2.jpg new file mode 100644 index 000000000..bbfa3d083 Binary files /dev/null and b/content/posts/2024/05/30/who-instruments-the-instrumenters/image-1-2000x1144-da5995a2.jpg differ diff --git a/content/posts/2024/05/30/who-instruments-the-instrumenters/image-2-2000x1176-e80c66e2.jpg b/content/posts/2024/05/30/who-instruments-the-instrumenters/image-2-2000x1176-e80c66e2.jpg new file mode 100644 index 000000000..61439530c Binary files /dev/null and b/content/posts/2024/05/30/who-instruments-the-instrumenters/image-2-2000x1176-e80c66e2.jpg differ diff --git a/content/posts/2024/05/30/who-instruments-the-instrumenters/image-2000x1144-076547fd.jpg b/content/posts/2024/05/30/who-instruments-the-instrumenters/image-2000x1144-076547fd.jpg new file mode 100644 index 000000000..2c9c07345 Binary files /dev/null and b/content/posts/2024/05/30/who-instruments-the-instrumenters/image-2000x1144-076547fd.jpg differ diff --git a/content/posts/2024/05/30/who-instruments-the-instrumenters/index.md b/content/posts/2024/05/30/who-instruments-the-instrumenters/index.md index 08c2e463a..7a6d51304 100644 --- a/content/posts/2024/05/30/who-instruments-the-instrumenters/index.md +++ b/content/posts/2024/05/30/who-instruments-the-instrumenters/index.md @@ -39,10 +39,10 @@ java -javaagent:target/meta-agent.jar -jar your-program.jar ``` This will then create a web server at that allows you to inspect the bytecode modifications of each instrumenter dynamically. For the example from the README shows you, for example, how Mockito modifies the Iterable class upon mocking: -![](https://mostlynerdless.de/wp-content/uploads/2024/05/image-2000x1144.png) +![](image-2000x1144-076547fd.jpg) This uses [Vineflower](https://github.com/Vineflower/vineflower) to decompile the bytecode, but you can, of course, also view raw bytecode diff, as Vineflower might not always produce correct code. Just add [\&mode=javap](http://localhost:7071/full-diff/class?pattern=java.lang.Iterable&mode=javap) to the previous URL: -![](https://mostlynerdless.de/wp-content/uploads/2024/05/image-1-2000x1144.png) +![](image-1-2000x1144-da5995a2.jpg) Another nice feature is that the agent allows you to inspect almost all classes, even if they haven't been modified. This enables you to gain insights into code you don't have the source code. @@ -161,7 +161,7 @@ There are two surprising things here. First, this check for `isOpenCallback == n This doesn't seem to be used much by the Spring Framework, so there might be room for optimization by making CGLIB proxies immutable. Second, the `returnValue == null ? false` means that if a user-provided callback returns null, CGLIB returns false, instead of throwing a NullPointerException like coercing null to a primitive would typically do. This [mostly undocumented](https://github.com/spring-projects/spring-framework/blob/main/spring-core/src/main/java/org/springframework/cglib/core/CodeEmitter.java#L801) behavior happens for all primitives, and when I learned about it, I dug through the Spring Framework and was able to [identify and fix one bug](https://github.com/spring-projects/spring-framework/pull/32412). Remember what the JDK `Proxy` did with `UndeclaredThrowableException`? CGLIB proxies in Spring also used to do this, but that changed somewhere along the way. Again, when I learned about it, I opened up the Spring Framework and spotted a regression that affected transaction handling caused by this change. I opened [a PR with the fix](https://github.com/spring-projects/spring-framework/pull/32469) and it will be available in 6.2: -![](https://mostlynerdless.de/wp-content/uploads/2024/05/image-2-2000x1176.png) +![](image-2-2000x1176-e80c66e2.jpg) I found reading the code generated by the JDK `Proxy` and the CGLIB `Enhancer` classes to be fascinating because it's something I rely on every day as a Spring developer but never had the chance to see [(3)](#ref3). Moreover, it allowed me to spot and contribute fixes for one bug and one regression in Spring. diff --git a/content/posts/2024/06/01/javafx-links-of-may-2024/index.md b/content/posts/2024/06/01/javafx-links-of-may-2024/index.md index e6d253341..f76a64ded 100644 --- a/content/posts/2024/06/01/javafx-links-of-may-2024/index.md +++ b/content/posts/2024/06/01/javafx-links-of-may-2024/index.md @@ -5,7 +5,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of May 2024, pu canonical: "https://webtechie.be/post/2024-05-31-javafx-links-of-may-2024/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2024/06/01/javafx-links-of-may-2024/jfxcentral.jpg b/content/posts/2024/06/01/javafx-links-of-may-2024/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2024/06/01/javafx-links-of-may-2024/jfxcentral.jpg differ diff --git a/content/posts/2024/06/01/javafx-links-of-may-2024/jfxcentral.png b/content/posts/2024/06/01/javafx-links-of-may-2024/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2024/06/01/javafx-links-of-may-2024/jfxcentral.png and /dev/null differ diff --git a/content/posts/2024/06/05/debugging-kubernetes-part-1-an-introduction/6r4k4akhaq4d0n0ir73b-d0ae889a.png b/content/posts/2024/06/05/debugging-kubernetes-part-1-an-introduction/6r4k4akhaq4d0n0ir73b-d0ae889a.png new file mode 100644 index 000000000..fa3e3c2b2 Binary files /dev/null and b/content/posts/2024/06/05/debugging-kubernetes-part-1-an-introduction/6r4k4akhaq4d0n0ir73b-d0ae889a.png differ diff --git a/content/posts/2024/06/05/debugging-kubernetes-part-1-an-introduction/aiu16ve9133ga7tw5pvw-eeb4a196.png b/content/posts/2024/06/05/debugging-kubernetes-part-1-an-introduction/aiu16ve9133ga7tw5pvw-eeb4a196.png new file mode 100644 index 000000000..dc4d91696 Binary files /dev/null and b/content/posts/2024/06/05/debugging-kubernetes-part-1-an-introduction/aiu16ve9133ga7tw5pvw-eeb4a196.png differ diff --git a/content/posts/2024/06/05/debugging-kubernetes-part-1-an-introduction/index.md b/content/posts/2024/06/05/debugging-kubernetes-part-1-an-introduction/index.md index 41ca3cc7f..6e7d6c991 100644 --- a/content/posts/2024/06/05/debugging-kubernetes-part-1-an-introduction/index.md +++ b/content/posts/2024/06/05/debugging-kubernetes-part-1-an-introduction/index.md @@ -45,7 +45,7 @@ Kubernetes, while often discussed in the context of cloud computing and large-sc Before Kubernetes, the deployment landscape was markedly different. Understanding this evolution helps appreciate the challenges Kubernetes aims to solve. The image below represents the road to Kubernetes and the technologies we passed along the way. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aiu16ve9133ga7tw5pvw.png) +![Image description](aiu16ve9133ga7tw5pvw-eeb4a196.png) In the image we can see that initially, applications were deployed directly onto physical servers. This process was manual, error-prone, and difficult to replicate across multiple environments. For instance, if a company needed to scale its application, it involved procuring new hardware, installing operating systems, and configuring the application from scratch. This could take weeks or even months, leading to significant downtime and operational inefficiencies. @@ -106,7 +106,7 @@ There used to be a site called "doyouneedkubernetes.com" when you visited that s Understanding Kubernetes architecture is crucial for debugging and troubleshooting. The following image shows the high level view of a Kubernetes deployment. There are far more details in most tutorials geared towards DevOps engineers, but for a developer the point that matters is just "Your Code": that tiny corner at the edge. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6r4k4akhaq4d0n0ir73b.png) +![Image description](6r4k4akhaq4d0n0ir73b-d0ae889a.png) In the image above we can see: diff --git a/content/posts/2024/06/12/vaadin-24-4-adds-react-support-in-app-coding-assistant/index.md b/content/posts/2024/06/12/vaadin-24-4-adds-react-support-in-app-coding-assistant/index.md index 1c1414089..3f6519887 100644 --- a/content/posts/2024/06/12/vaadin-24-4-adds-react-support-in-app-coding-assistant/index.md +++ b/content/posts/2024/06/12/vaadin-24-4-adds-react-support-in-app-coding-assistant/index.md @@ -5,7 +5,7 @@ lastmod: "2024-06-12T14:38:33+00:00" description: "Vaadin 24.4: Vaadin Copilot, Hilla integration, and React support in Flow." authors: - "marcus-hellberg" -image: "vaadinwebapp.png" +image: "vaadinwebapp.jpg" categories: - "Release Notes" - "Tools" diff --git a/content/posts/2024/06/12/vaadin-24-4-adds-react-support-in-app-coding-assistant/vaadinwebapp.jpg b/content/posts/2024/06/12/vaadin-24-4-adds-react-support-in-app-coding-assistant/vaadinwebapp.jpg new file mode 100644 index 000000000..c6b080f67 Binary files /dev/null and b/content/posts/2024/06/12/vaadin-24-4-adds-react-support-in-app-coding-assistant/vaadinwebapp.jpg differ diff --git a/content/posts/2024/06/12/vaadin-24-4-adds-react-support-in-app-coding-assistant/vaadinwebapp.png b/content/posts/2024/06/12/vaadin-24-4-adds-react-support-in-app-coding-assistant/vaadinwebapp.png deleted file mode 100644 index c28469bc2..000000000 Binary files a/content/posts/2024/06/12/vaadin-24-4-adds-react-support-in-app-coding-assistant/vaadinwebapp.png and /dev/null differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/attach-dark-f2b25f5b.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/attach-dark-f2b25f5b.png new file mode 100644 index 000000000..69af73441 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/attach-dark-f2b25f5b.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/banner.jpg b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/banner.jpg new file mode 100644 index 000000000..34321ae69 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/banner.jpg differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/banner.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/banner.png deleted file mode 100644 index 8a974c31f..000000000 Binary files a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/banner.png and /dev/null differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/cannot-evaluate-after-pause-dark-1f346189.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/cannot-evaluate-after-pause-dark-1f346189.png new file mode 100644 index 000000000..10077f1c6 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/cannot-evaluate-after-pause-dark-1f346189.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/evaluate-label-dark-2423df16.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/evaluate-label-dark-2423df16.png new file mode 100644 index 000000000..df44a6a40 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/evaluate-label-dark-2423df16.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/evaluate-property-dark-142c8c13.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/evaluate-property-dark-142c8c13.png new file mode 100644 index 000000000..b76a54993 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/evaluate-property-dark-142c8c13.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/fields-in-memory-view-dark-d96f3807.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/fields-in-memory-view-dark-d96f3807.png new file mode 100644 index 000000000..4a308b8f6 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/fields-in-memory-view-dark-d96f3807.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/iddqd-96742d64.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/iddqd-96742d64.png new file mode 100644 index 000000000..8694feea3 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/iddqd-96742d64.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/index.md b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/index.md index 9fce527c1..06312991b 100644 --- a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/index.md +++ b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/index.md @@ -6,7 +6,7 @@ description: "Use the debugger to find out how a Java application works under th canonical: "https://flounder.dev/posts/debugger-god-mode/" authors: - "igor-kulakov" -image: "banner.png" +image: "banner.jpg" categories: - "Debugging" - "IntelliJ IDEA" @@ -28,7 +28,7 @@ Read in other languages: [中文](https://flounder.dev/zh/posts/debugger-god-mod Cheat codes were sequences of keys that would give you something extraordinary, such as infinite ammo or the ability to walk through walls. The most common and powerful of them was 'god mode' – it made you invincible. -![Screenshot of the marine from Doom with 'god mode' enabled](https://flounder.dev/img/debugger-god-mode/iddqd.png) +![Screenshot of the marine from Doom with 'god mode' enabled](iddqd-96742d64.png) This is what your character would look like when you entered 'IDDQD' – the key combination for 'god mode' in [Doom](https://en.wikipedia.org/wiki/Doom_(1993_video_game)). In fact, this particular key sequence was so popular that it became a [meme](https://www.urbandictionary.com/define.php?term=iddqd) and gained popularity beyond the game itself. @@ -40,7 +40,7 @@ To illustrate my point, I'd like to bring in a fun scenario right here. Even if My friend and colleague, [Eugene](https://www.linkedin.com/in/eugene-nizienko-016a153a/), has written an [IntelliJ IDEA plugin](https://plugins.jetbrains.com/plugin/19383-space-invaders), which lets you play this game right in the editor – a great way to spend some time while waiting for indexing to complete. -![Space Invaders in IntelliJ IDEA's editor](https://flounder.dev/img/debugger-god-mode/space-invaders-dark.png) +![Space Invaders in IntelliJ IDEA's editor](space-invaders-dark-f0730c62.png) There's no god mode in this game, but if we are very determined, can we add it ourselves? Let's bring back the classic tradition of hacking programs with a debugger and find out! @@ -58,7 +58,7 @@ To manage several IDE instances, I will be using [JetBrains Toolbox](https://www Let's install two instances of IntelliJ IDEA: -![JetBrains Toolbox shows several JetBrains IDEs including two instances of IntelliJ IDEA called Space Invaders and Debug](https://flounder.dev/img/debugger-god-mode/jb-toolbox-dark.png) +![JetBrains Toolbox shows several JetBrains IDEs including two instances of IntelliJ IDEA called Space Invaders and Debug](jb-toolbox-dark-d2beb03b.png) If you are using the same IDE version for both instances, make sure to specify a different system, config, and logs directories in **Tool actions** \| **Settings** \| **Configuration**. On this page, you can also assign names to the IDE instances for convenience. @@ -66,7 +66,7 @@ To be able to debug the 'Space Invaders' instance, click **More** near it, then -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -![The file with VM options that are going to be passed to the IDE instance](https://flounder.dev/img/debugger-god-mode/toolbox-add-vm-options-dark.png) +![The file with VM options that are going to be passed to the IDE instance](toolbox-add-vm-options-dark-390d4abf.png) This will make the target JVM run with the debug agent and listen to incoming debugger connections on port `5005`. @@ -74,7 +74,7 @@ This will make the target JVM run with the debug agent and listen to incoming de Run the `Space Invaders` instance, [install the game](https://www.jetbrains.com/help/idea/managing-plugins.html), and launch it by running the **Space Invaders** action. To find the action, hit Shift twice, and start typing `Space Invaders`: -![Running the Space Invaders action through the dialog that opens on hitting double Shift](https://flounder.dev/img/debugger-god-mode/space-invaders-action-dark.png) +![Running the Space Invaders action through the dialog that opens on hitting double Shift](space-invaders-action-dark-c2c28802.png) Let's play for a while and observe the behavior that we want to fix: when enemy missiles hit the spaceship, the health bar in the top-left corner of the screen goes down. @@ -86,7 +86,7 @@ Additionally, IntelliJ IDEA includes the Java/Kotlin standard library in the new After creating the project, go to the main menu and select **Run** \| **Attach to Process**. This will show the list of local JVMs listening for debugger attach requests. Select the other running IDE from the list. -![A popup with the list of locally running JVMs](https://flounder.dev/img/debugger-god-mode/attach-dark.png) +![A popup with the list of locally running JVMs](attach-dark-f2b25f5b.png) We should see the following message in the console confirming that the debugger has successfully attached to the target VM. @@ -98,7 +98,7 @@ Typically, one would set a breakpoint in the application code, but in this case, Luckily for us, IntelliJ IDEA has a feature known as [Pause](https://flounder.dev/posts/debug-without-breakpoints/). It allows you to suspend the program at any arbitrary point in time, without needing to specify the corresponding line of code. You can find it in the debugger toolbar or in the main menu: **Run** \| **Debugging Actions** \| **Pause**. -![The Debug tool window for the suspended Space Invaders instance](https://flounder.dev/img/debugger-god-mode/invaders-paused-dark.png) +![The Debug tool window for the suspended Space Invaders instance](invaders-paused-dark-15c5469e.png) The application gets suspended. This gives us a starting point for debugging. @@ -113,33 +113,33 @@ If we look at our goal in programming terms, it boils down to preventing the spa Since we don't know anything about the plugin code, we can directly inspect the heap using the IntelliJ IDEA debugger's **Memory** view: -![A menu appears on clicking Layout Settings in the top-right corner of the Debug tool window](https://flounder.dev/img/debugger-god-mode/open-memory-view-dark.png) +![A menu appears on clicking Layout Settings in the top-right corner of the Debug tool window](open-memory-view-dark-157e14e1.png) This feature gives you information about all objects that are currently alive. Let's type `invaders` and see if we can find anything: -![Typing 'invaders' in the Memory view's search field shows objects of classes that belong to the 'spaceinvaders' package](https://flounder.dev/img/debugger-god-mode/search-in-heap-dark.png) +![Typing 'invaders' in the Memory view's search field shows objects of classes that belong to the 'spaceinvaders' package](search-in-heap-dark-7a3619a6.png) Apparently, the plugin classes come under the package `com.github.nizienko.spaceinvaders`. Within this package, there is `GameState` class with several live instances. It looks like what we need. Double-clicking `GameState` shows all the instances of this class: -![A dialog opens showing live GameState instances](https://flounder.dev/img/debugger-god-mode/instances-of-enum-dark.png) +![A dialog opens showing live GameState instances](instances-of-enum-dark-5c0bc55b.png) As it turns out, it's an enum – which isn't exactly what we were looking for. Continuing our search, we stumble upon a single instance of `Game`. Expanding the node lets us inspect the instance's fields: -![Memory view with an expanded object node showing the object's fields](https://flounder.dev/img/debugger-god-mode/fields-in-memory-view-dark.png) +![Memory view with an expanded object node showing the object's fields](fields-in-memory-view-dark-d96f3807.png) The `health` property appears to be the one of interest here. Among its fields, we can find `_value`. In my case, it was `100`, which correlates with the health bar being full when I suspended the game. So, it's likely the correct field to consider, and its value seems to range from `0` to `100`. Let's put this hypothesis to the test. Right-click `_value`, then select **Set Value** . Choose a value that is different from your current one. For instance, I chose `50`. -![Memory view with a text field against the 'health' field containing the user-entered value of 50](https://flounder.dev/img/debugger-god-mode/memory-view-set-value-dark.png) +![Memory view with a text field against the 'health' field containing the user-entered value of 50](memory-view-set-value-dark-d2327847.png) At this step, we bump into an error that reads **Cannot evaluate methods after Pause action**: -![An error message saying 'Cannot evaluate methods after Pause'](https://flounder.dev/img/debugger-god-mode/cannot-evaluate-after-pause-dark.png) +![An error message saying 'Cannot evaluate methods after Pause'](cannot-evaluate-after-pause-dark-1f346189.png) The problem arises because we used **Pause** instead of breakpoints, and this feature comes with [some limitations](https://flounder.dev/posts/debug-without-breakpoints/#limitations). However, we can turn to a little trick to work around this. @@ -153,17 +153,17 @@ So we've located the object that holds the relevant state. At the very least, we Now that we have identified the object to focus on, it would be handy to [mark](https://www.jetbrains.com/help/idea/examining-suspended-program.html#use-labels) it. For those unfamiliar with debug labels, this is what a marked object looks like: -![Variables tab showing an array of User objects, with one of them marked with a debug label saying User_Charlie](https://flounder.dev/img/debugger-god-mode/labeled-object-dark.png) +![Variables tab showing an array of User objects, with one of them marked with a debug label saying User_Charlie](labeled-object-dark-bde7f1b5.png) Labels can be beneficial in many ways. Within the context of this article, marking the relevant object ensures that we can directly use it in features like **Evaluate Expression** without being dependent on the current execution context. Unfortunately, it's not possible to direcly mark `_value`, but we can mark the object that encloses it. To do this, right-click `health`, select **Mark Object**, then give it a name. -![Select Object Label dialog prompting the user to enter a name for the object](https://flounder.dev/img/debugger-god-mode/mark-health-object-dark.png) +![Select Object Label dialog prompting the user to enter a name for the object](mark-health-object-dark-c5ecaa52.png) We can now test how the label works elsewhere. Open the [Evaluate Expression](https://www.jetbrains.com/help/idea/examining-suspended-program.html#evaluate-arbitrary-expression) dialog, a [great tool for prototyping fixes and altering the program flow](https://flounder.dev/posts/efficient-debugging-exceptions/#prototype-the-fix), and enter `health_object_DebugLabel` as the expression. As you can see, the object is accessible from any place in the program through the **Evaluate** dialog: -![Evaluate dialog with debug label entered as the expression](https://flounder.dev/img/debugger-god-mode/evaluate-label-dark.png) +![Evaluate dialog with debug label entered as the expression](evaluate-label-dark-2423df16.png) What about changing the spaceship's health from **Evaluate** ? `health_object_DebugLabel._value = 100` does not work. @@ -172,7 +172,7 @@ At the same time, `_value` appears to be a backing field of a Kotlin property. I The **Evaluate** dialog doesn't think this is valid code, but we'll try anyway: -![Referencing a property through a debug label in the Evaluate dialog](https://flounder.dev/img/debugger-god-mode/evaluate-property-dark.png) +![Referencing a property through a debug label in the Evaluate dialog](evaluate-property-dark-142c8c13.png) The expression returns the current spaceship's health, so this approach works! @@ -192,13 +192,13 @@ To maintain simplicity, we didn't specify a particular JDK version and initializ There are numerous locations suitable for setting a breakpoint. I decided to set a method breakpoint in `java.awt.event.KeyListener::keyPressed`. This will trigger the side effect every time we press a key: -![Breakpoints dialog showing a logging breakpoint for java.awt.event.KeyListener::keyPressed](https://flounder.dev/img/debugger-god-mode/key-pressed-breakpoint-dark.png) +![Breakpoints dialog showing a logging breakpoint for java.awt.event.KeyListener::keyPressed](key-pressed-breakpoint-dark-9675ac9f.png) Setting a method breakpoint in hot code [might significantly slow down](https://flounder.dev/posts/troubleshoot-slow-debugging/#conditional-breakpoints-in-hot-code) the target application. Let's return to Space Invaders and see if our home-cooked IDDQD works. It does! -![Playing Space Invaders in IntelliJ IDEA – every time that the spaceship gets hit, its health bar automatically refills](https://flounder.dev/img/debugger-god-mode/success.gif) +![Playing Space Invaders in IntelliJ IDEA – every time that the spaceship gets hit, its health bar automatically refills](success-b78fbef1.gif) ## Conclusion diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/instances-of-enum-dark-5c0bc55b.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/instances-of-enum-dark-5c0bc55b.png new file mode 100644 index 000000000..b8cd101c9 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/instances-of-enum-dark-5c0bc55b.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/invaders-paused-dark-15c5469e.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/invaders-paused-dark-15c5469e.png new file mode 100644 index 000000000..07c4a9fe5 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/invaders-paused-dark-15c5469e.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/jb-toolbox-dark-d2beb03b.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/jb-toolbox-dark-d2beb03b.png new file mode 100644 index 000000000..fd5bf6b1a Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/jb-toolbox-dark-d2beb03b.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/key-pressed-breakpoint-dark-9675ac9f.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/key-pressed-breakpoint-dark-9675ac9f.png new file mode 100644 index 000000000..20f834711 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/key-pressed-breakpoint-dark-9675ac9f.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/labeled-object-dark-bde7f1b5.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/labeled-object-dark-bde7f1b5.png new file mode 100644 index 000000000..24f9ce173 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/labeled-object-dark-bde7f1b5.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/mark-health-object-dark-c5ecaa52.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/mark-health-object-dark-c5ecaa52.png new file mode 100644 index 000000000..5ff8a9f25 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/mark-health-object-dark-c5ecaa52.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/memory-view-set-value-dark-d2327847.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/memory-view-set-value-dark-d2327847.png new file mode 100644 index 000000000..359acc566 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/memory-view-set-value-dark-d2327847.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/open-memory-view-dark-157e14e1.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/open-memory-view-dark-157e14e1.png new file mode 100644 index 000000000..fbc75c30e Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/open-memory-view-dark-157e14e1.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/search-in-heap-dark-7a3619a6.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/search-in-heap-dark-7a3619a6.png new file mode 100644 index 000000000..279009c3a Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/search-in-heap-dark-7a3619a6.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/space-invaders-action-dark-c2c28802.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/space-invaders-action-dark-c2c28802.png new file mode 100644 index 000000000..8e623abc8 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/space-invaders-action-dark-c2c28802.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/space-invaders-dark-f0730c62.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/space-invaders-dark-f0730c62.png new file mode 100644 index 000000000..785845534 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/space-invaders-dark-f0730c62.png differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/success-b78fbef1.gif b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/success-b78fbef1.gif new file mode 100644 index 000000000..d7f68ce8b Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/success-b78fbef1.gif differ diff --git a/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/toolbox-add-vm-options-dark-390d4abf.png b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/toolbox-add-vm-options-dark-390d4abf.png new file mode 100644 index 000000000..793a12640 Binary files /dev/null and b/content/posts/2024/06/13/debugger-godmode-hacking-a-jvm-application-with-the-debugger/toolbox-add-vm-options-dark-390d4abf.png differ diff --git a/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/convert-properties-d9de9a50.webp b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/convert-properties-d9de9a50.webp new file mode 100644 index 000000000..622d15869 Binary files /dev/null and b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/convert-properties-d9de9a50.webp differ diff --git a/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/dashboard-profiles-fc3a7445.webp b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/dashboard-profiles-fc3a7445.webp new file mode 100644 index 000000000..ba9c7b517 Binary files /dev/null and b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/dashboard-profiles-fc3a7445.webp differ diff --git a/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/index.md b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/index.md index a33e23950..d5cd55c60 100644 --- a/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/index.md +++ b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/index.md @@ -31,7 +31,7 @@ With the [release of various AI products](https://blogs.microsoft.com/blog/2024/ Here's how the feature works, on your Java class, a new CodeLens text will appear above the name of the class: "Rewrite with new Java syntax". Once the user clicks on this, it will trigger an inspection on the current Java class. Once the inspection is complete, Visual Studio Code will show several improvement suggestions and point users to the location. -![](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2024/05/trigger.gif) +![](trigger-8ce33757.gif) For each suggestion, additional CodeLens will appear and shows what the solution is (and what needs to be improved). @@ -41,13 +41,13 @@ The user can then see the code diff, and will be offered the choice of "Accept o If the user accepts the suggestion, then the workflow is over. Let's see the first example where the for-loop can be refactored using IntStream. -![For loop to instream](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2024/05/intstream.gif) +![For loop to instream](intstream-276fb073.gif) For loop to instream, image Let's look at another example, where our feature suggests that a multiple if and else-if logic can be directly re-written as a switch expression. By clicking on the CodeLens text, the code can be directly re-written as the improved code. -![Switch to if](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2024/06/switchtoif.gif) +![Switch to if](switchtoif-179bf6a9.gif) Switch to if, image @@ -55,7 +55,7 @@ Switch to if, image Sometimes, we may not want inspect the whole class because the code is too complex. The feature above also supports inspecting the part of the code. We just need select the code we want to inspect, and then click on the lightbulb on the left, select "Rewrite with Java syntax". Here's an example: -![Partial inspection](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2024/06/partial.gif) +![Partial inspection](partial-9b8d1f9d.gif) Partial inspection, image @@ -71,25 +71,25 @@ To use this feature, developer needs to install both Insider (Pre-release) versi The Spring Boot Tools extension now features syntax highlighting for JPQL query strings. The syntax highlighting works for @Query annotations inside of Java source files as well as for named query property files. This makes reading those query strings much easier. (screenshot JPQL query syntax highlighting) -#### [![JPQL Syntax highlighting](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2024/05/jpql-syntax-highlighting.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2024/05/jpql-syntax-highlighting.png) +#### [![JPQL Syntax highlighting](jpql-syntax-highlighting-299550e3.jpg)](jpql-syntax-highlighting-299550e3.jpg) #### Add Starters directly from within `pom.xml` files We added a clickable hint to pom.xml files of Spring Boot projects, directly in their dependency section. This clickable hint directly invokes the support to add additional Spring Boot starter modules. This improves discoverability and usability of this feature and makes it super easy to find and use. (screenshot add pom starters) -[![Image thumbnail hint add starters](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2024/05/thumbnail_hint-add-starters.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2024/05/thumbnail_hint-add-starters.png) +[![Image thumbnail hint add starters](thumbnail_hint-add-starters-df4bf29e.png)](thumbnail_hint-add-starters-df4bf29e.png) #### Dashboard shows active profiles The Spring Boot Dashboard now shows the active profiles of a running Spring Boot application directly side by side with the port the app runs on. This is available in the pre-release version. (screenshot active profiles in dashboard) -#### [![Dashboard profiles](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2024/05/dashboard-profiles.gif)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2024/05/dashboard-profiles.gif) +#### [![Dashboard profiles](dashboard-profiles-fc3a7445.webp)](dashboard-profiles-fc3a7445.webp) #### Automatically convert application properties to YAML and back The Spring Boot tools now offer actions to automatically convert `application.properties` files to YAML format and the other way around. This makes the switch to your (newly) preferred format super easy. (screenshot property conversion -### [![Convert properties](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2024/05/convert-properties.gif)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2024/05/convert-properties.gif) +### [![Convert properties](convert-properties-d9de9a50.webp)](convert-properties-d9de9a50.webp) #### Performance and footprint improvements @@ -113,11 +113,11 @@ If you want to reset the coverage data before every coverage execution, you can To use all features mentioned above, please download and install [Extension Pack for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) on Visual Studio Code. -[![Extension pack for Java](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/09/javapack.png) +[![Extension pack for Java](javapack-892c0338.png)](javapack-892c0338.png) If you are a Spring developer working on a Spring Boot application, you can also download the [Spring Boot Extension Pack](https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-boot-dev-pack) for specialized Spring experience. -[![Spring boot extension pack](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png)](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2022/10/spring.png) +[![Spring boot extension pack](spring-ac42cb4c.png)](spring-ac42cb4c.png) ### Feedback and suggestions diff --git a/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/intstream-276fb073.gif b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/intstream-276fb073.gif new file mode 100644 index 000000000..c3fa035fa Binary files /dev/null and b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/intstream-276fb073.gif differ diff --git a/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/javapack-892c0338.png b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/javapack-892c0338.png new file mode 100644 index 000000000..c05f90e30 Binary files /dev/null and b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/javapack-892c0338.png differ diff --git a/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/jpql-syntax-highlighting-299550e3.jpg b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/jpql-syntax-highlighting-299550e3.jpg new file mode 100644 index 000000000..4886fba25 Binary files /dev/null and b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/jpql-syntax-highlighting-299550e3.jpg differ diff --git a/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/partial-9b8d1f9d.gif b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/partial-9b8d1f9d.gif new file mode 100644 index 000000000..2fd5cd6e8 Binary files /dev/null and b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/partial-9b8d1f9d.gif differ diff --git a/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/spring-ac42cb4c.png b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/spring-ac42cb4c.png new file mode 100644 index 000000000..c3d38f0a6 Binary files /dev/null and b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/spring-ac42cb4c.png differ diff --git a/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/switchtoif-179bf6a9.gif b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/switchtoif-179bf6a9.gif new file mode 100644 index 000000000..ac75f1b58 Binary files /dev/null and b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/switchtoif-179bf6a9.gif differ diff --git a/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/thumbnail_hint-add-starters-df4bf29e.png b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/thumbnail_hint-add-starters-df4bf29e.png new file mode 100644 index 000000000..ca29cef11 Binary files /dev/null and b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/thumbnail_hint-add-starters-df4bf29e.png differ diff --git a/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/trigger-8ce33757.gif b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/trigger-8ce33757.gif new file mode 100644 index 000000000..db84bbf2b Binary files /dev/null and b/content/posts/2024/06/18/java-on-visual-studio-code-may-2024-update-new-ai-feature-spring-updates/trigger-8ce33757.gif differ diff --git a/content/posts/2024/06/20/even-more-opentelemetry/index.md b/content/posts/2024/06/20/even-more-opentelemetry/index.md index c267a7ebb..fd1524f41 100644 --- a/content/posts/2024/06/20/even-more-opentelemetry/index.md +++ b/content/posts/2024/06/20/even-more-opentelemetry/index.md @@ -6,7 +6,7 @@ description: "I continue to work on my Opentelemetry demo. Its main idea is to s canonical: "https://blog.frankel.ch/even-more-opentelemetry/" authors: - "nicolas-frankel" -image: "otel-component-model.png" +image: "otel-component-model.jpg" categories: - "DevOps" related_posts: @@ -21,7 +21,7 @@ frozen: false Here's an updated diagram. New components appear in violet, and updated components appear in green. -[![](otel-component-model.png)](otel-component-model.png)I want to be able to add more components. Thus, I decided that instead of directly querying the database, the `inventory` component would query warehouses, which are supposed to be located in different regions. Each warehouse can be implemented in a different stack, and you can have as many as you want—PRs are welcome. I miss Elixir and .Net at the moment. The contract, which I need to write down, is easy: +[![](otel-component-model.jpg)](otel-component-model.jpg)I want to be able to add more components. Thus, I decided that instead of directly querying the database, the `inventory` component would query warehouses, which are supposed to be located in different regions. Each warehouse can be implemented in a different stack, and you can have as many as you want—PRs are welcome. I miss Elixir and .Net at the moment. The contract, which I need to write down, is easy: * An endpoint `/stocks/${productId}` * The ability to query PostgreSQL diff --git a/content/posts/2024/06/20/even-more-opentelemetry/otel-component-model.jpg b/content/posts/2024/06/20/even-more-opentelemetry/otel-component-model.jpg new file mode 100644 index 000000000..8b4bf0255 Binary files /dev/null and b/content/posts/2024/06/20/even-more-opentelemetry/otel-component-model.jpg differ diff --git a/content/posts/2024/06/20/even-more-opentelemetry/otel-component-model.png b/content/posts/2024/06/20/even-more-opentelemetry/otel-component-model.png deleted file mode 100644 index 9c247f5f3..000000000 Binary files a/content/posts/2024/06/20/even-more-opentelemetry/otel-component-model.png and /dev/null differ diff --git a/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/index-after-1024x567.jpg b/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/index-after-1024x567.jpg new file mode 100644 index 000000000..f5c92d39a Binary files /dev/null and b/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/index-after-1024x567.jpg differ diff --git a/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/index-after-1024x567.png b/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/index-after-1024x567.png deleted file mode 100644 index 8445f738a..000000000 Binary files a/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/index-after-1024x567.png and /dev/null differ diff --git a/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/index.md b/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/index.md index 83c8c7536..d0ada0f30 100644 --- a/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/index.md +++ b/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/index.md @@ -218,7 +218,7 @@ Another demo requests a list item (`
  • `) with a timestamp from the API on `/re {{< gallery >}} index-before-1024x539.png -index-after-1024x567.png +index-after-1024x567.jpg {{< /gallery >}} ### htmx with websocket @@ -243,7 +243,7 @@ In `MyEventSocket` a `scheduleAtFixedRate` is implemented to send a timestamp fr {{< gallery >}} websocket-before-1024x302.png -websocket-after-1024x366.png +websocket-after-1024x366.jpg {{< /gallery >}} ## Running the Application diff --git a/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/websocket-after-1024x366.jpg b/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/websocket-after-1024x366.jpg new file mode 100644 index 000000000..882ddc0d5 Binary files /dev/null and b/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/websocket-after-1024x366.jpg differ diff --git a/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/websocket-after-1024x366.png b/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/websocket-after-1024x366.png deleted file mode 100644 index f7db46058..000000000 Binary files a/content/posts/2024/06/21/example-java-application-with-embedded-jetty-and-a-htmx-website/websocket-after-1024x366.png and /dev/null differ diff --git a/content/posts/2024/06/25/how-to-run-neo4j-on-kubernetes/index.md b/content/posts/2024/06/25/how-to-run-neo4j-on-kubernetes/index.md index 41ca75ae1..345fce38e 100644 --- a/content/posts/2024/06/25/how-to-run-neo4j-on-kubernetes/index.md +++ b/content/posts/2024/06/25/how-to-run-neo4j-on-kubernetes/index.md @@ -41,7 +41,7 @@ Neo4j is a graph database and it is an excellent choice for applications that re The Neo4j documentation for running on Kubernetes is quite detailed and helpful, but I want to walk through a couple steps and then go beyond the docs by running an application alongside the database. First, here is a helpful diagram from the Neo4j documentation showing the components involved in running a database (Neo4j) on Kubernetes. -![Components of Neo4j on Kubernetes](neo4j-k8s-components.png) +![Components of Neo4j on Kubernetes](neo4j-k8s-components.jpg) There are config maps, stateful set, persistent volume, and services containers. Now, we could run each of these containers, but handling scaling and management of all these indivdual pieces every time you want a database can get complicated and redundant. This is where Helm comes in. diff --git a/content/posts/2024/06/25/how-to-run-neo4j-on-kubernetes/neo4j-k8s-components.jpg b/content/posts/2024/06/25/how-to-run-neo4j-on-kubernetes/neo4j-k8s-components.jpg new file mode 100644 index 000000000..03b6dd821 Binary files /dev/null and b/content/posts/2024/06/25/how-to-run-neo4j-on-kubernetes/neo4j-k8s-components.jpg differ diff --git a/content/posts/2024/06/25/how-to-run-neo4j-on-kubernetes/neo4j-k8s-components.png b/content/posts/2024/06/25/how-to-run-neo4j-on-kubernetes/neo4j-k8s-components.png deleted file mode 100644 index 5fba61515..000000000 Binary files a/content/posts/2024/06/25/how-to-run-neo4j-on-kubernetes/neo4j-k8s-components.png and /dev/null differ diff --git a/content/posts/2024/06/27/renovate-for-everything/Screenshot-2024-06-22-at-19.10.07.jpg b/content/posts/2024/06/27/renovate-for-everything/Screenshot-2024-06-22-at-19.10.07.jpg new file mode 100644 index 000000000..d7306239f Binary files /dev/null and b/content/posts/2024/06/27/renovate-for-everything/Screenshot-2024-06-22-at-19.10.07.jpg differ diff --git a/content/posts/2024/06/27/renovate-for-everything/Screenshot-2024-06-22-at-19.10.07.png b/content/posts/2024/06/27/renovate-for-everything/Screenshot-2024-06-22-at-19.10.07.png deleted file mode 100644 index a4f38e7c4..000000000 Binary files a/content/posts/2024/06/27/renovate-for-everything/Screenshot-2024-06-22-at-19.10.07.png and /dev/null differ diff --git a/content/posts/2024/06/27/renovate-for-everything/index.md b/content/posts/2024/06/27/renovate-for-everything/index.md index ffd3fcbb8..9831af177 100644 --- a/content/posts/2024/06/27/renovate-for-everything/index.md +++ b/content/posts/2024/06/27/renovate-for-everything/index.md @@ -29,7 +29,7 @@ First things first, Renovate does indeed [manages Kotlin Scripting](https://docs Even better, Renovate can manage *any* type of file. Thanks to Max Andersen for the tip: -[![](Screenshot-2024-06-22-at-19.10.07.png)](https://x.com/maxandersen/status/1764379149177630827) +[![](Screenshot-2024-06-22-at-19.10.07.jpg)](https://x.com/maxandersen/status/1764379149177630827) You can create your configuration for package managers, which must still be added to Renovate's scope! > With `customManagers` using `regex` you can configure Renovate so it finds dependencies that are not detected by its other built-in package managers. diff --git a/content/posts/2024/06/30/javafx-links-of-june-2024/index.md b/content/posts/2024/06/30/javafx-links-of-june-2024/index.md index db2d164f1..f28abf94d 100644 --- a/content/posts/2024/06/30/javafx-links-of-june-2024/index.md +++ b/content/posts/2024/06/30/javafx-links-of-june-2024/index.md @@ -6,7 +6,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of June 2024, p canonical: "https://webtechie.be/post/2024-06-28-javafx-links-of-june-2024/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2024/06/30/javafx-links-of-june-2024/jfxcentral.jpg b/content/posts/2024/06/30/javafx-links-of-june-2024/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2024/06/30/javafx-links-of-june-2024/jfxcentral.jpg differ diff --git a/content/posts/2024/06/30/javafx-links-of-june-2024/jfxcentral.png b/content/posts/2024/06/30/javafx-links-of-june-2024/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2024/06/30/javafx-links-of-june-2024/jfxcentral.png and /dev/null differ diff --git a/content/posts/2024/06/30/master-your-journey-in-the-school-of-openjdk-migration/dummies.jpg b/content/posts/2024/06/30/master-your-journey-in-the-school-of-openjdk-migration/dummies.jpg new file mode 100644 index 000000000..e52a83911 Binary files /dev/null and b/content/posts/2024/06/30/master-your-journey-in-the-school-of-openjdk-migration/dummies.jpg differ diff --git a/content/posts/2024/06/30/master-your-journey-in-the-school-of-openjdk-migration/dummies.png b/content/posts/2024/06/30/master-your-journey-in-the-school-of-openjdk-migration/dummies.png deleted file mode 100644 index 1b52f7a41..000000000 Binary files a/content/posts/2024/06/30/master-your-journey-in-the-school-of-openjdk-migration/dummies.png and /dev/null differ diff --git a/content/posts/2024/06/30/master-your-journey-in-the-school-of-openjdk-migration/index.md b/content/posts/2024/06/30/master-your-journey-in-the-school-of-openjdk-migration/index.md index 8e35e6fad..830d05d80 100644 --- a/content/posts/2024/06/30/master-your-journey-in-the-school-of-openjdk-migration/index.md +++ b/content/posts/2024/06/30/master-your-journey-in-the-school-of-openjdk-migration/index.md @@ -26,7 +26,7 @@ Azul has led so many OpenJDK migrations, we could write a book. Like, seriously, For many smaller organizations with less complex infrastructures, an OpenJDK migration can be very straightforward. **"In fact, migrating to certified builds of OpenJDK can be very straightforward and simple for the vast majority of enterprises,"** I wrote in [OpenJDK Migration for Dummies](https://www.azul.com/openjdk-migration-for-dummies/). **"If you're migrating server applications, you're not likely to encounter any challenges."** -![](dummies.png) +![](dummies.jpg) But as anyone with experience in big software projects knows, things rarely go as simply as teams hope they will. It's good to know what to expect before starting a migration. diff --git a/content/posts/2024/07/02/beetroot-yet-another-web-framework/autumo-beetroot-console-86d51795.webp b/content/posts/2024/07/02/beetroot-yet-another-web-framework/autumo-beetroot-console-86d51795.webp new file mode 100644 index 000000000..880abf3f6 Binary files /dev/null and b/content/posts/2024/07/02/beetroot-yet-another-web-framework/autumo-beetroot-console-86d51795.webp differ diff --git a/content/posts/2024/07/02/beetroot-yet-another-web-framework/autumo-beetroot-login-833f1cc3.webp b/content/posts/2024/07/02/beetroot-yet-another-web-framework/autumo-beetroot-login-833f1cc3.webp new file mode 100644 index 000000000..992af46ef Binary files /dev/null and b/content/posts/2024/07/02/beetroot-yet-another-web-framework/autumo-beetroot-login-833f1cc3.webp differ diff --git a/content/posts/2024/07/02/beetroot-yet-another-web-framework/autumo-beetroot-screen-87f06621.webp b/content/posts/2024/07/02/beetroot-yet-another-web-framework/autumo-beetroot-screen-87f06621.webp new file mode 100644 index 000000000..2857ef816 Binary files /dev/null and b/content/posts/2024/07/02/beetroot-yet-another-web-framework/autumo-beetroot-screen-87f06621.webp differ diff --git a/content/posts/2024/07/02/beetroot-yet-another-web-framework/hqdefault-3c6ae754.jpg b/content/posts/2024/07/02/beetroot-yet-another-web-framework/hqdefault-3c6ae754.jpg new file mode 100644 index 000000000..10cba8f8b Binary files /dev/null and b/content/posts/2024/07/02/beetroot-yet-another-web-framework/hqdefault-3c6ae754.jpg differ diff --git a/content/posts/2024/07/02/beetroot-yet-another-web-framework/index.md b/content/posts/2024/07/02/beetroot-yet-another-web-framework/index.md index a7b2164c9..6a658a35f 100644 --- a/content/posts/2024/07/02/beetroot-yet-another-web-framework/index.md +++ b/content/posts/2024/07/02/beetroot-yet-another-web-framework/index.md @@ -5,7 +5,7 @@ lastmod: "2025-12-08T22:31:32+00:00" description: "beetRoot is a slim and rapid Java web development as well as a full & secure client-server framework ready to run." authors: - "michael-gasche" -image: "https://raw.githubusercontent.com/autumoswitzerland/autumo-beetroot/master/web/img/autumo-beetroot-login.webp" +image: "autumo-beetroot-login-833f1cc3.webp" categories: - "Developer Tools" - "Release Notes" @@ -25,7 +25,7 @@ Over the years, I have struggled with various Java web development frameworks an A few years ago, I evaluated around 10 of these frameworks for a project for a Swedish company. Nothing really impressed me at the time. It was only later that [SpringBoot](https://spring.io/projects/spring-boot) came along, which seemed to fulfill all the requirements and there was actually very little to criticize about it. Then came microservices such as [Quarkus](https://quarkus.io/) or [Micronaut](https://micronaut.io/), which are often compiled into native code for small web service applications, but which can then rarely be embedded in a more mature architecture. -![beetRoot starting on console](https://raw.githubusercontent.com/autumoswitzerland/autumo-beetroot/master/web/img/autumo-beetroot-login.webp) +![beetRoot starting on console](autumo-beetroot-login-833f1cc3.webp) ## The "Buts" @@ -44,7 +44,7 @@ However, none of this prevents you from customizing the dependencies in the Mave The quick start setup is also effortless and very fast! If you know CakePHP for web development, you'll like beetRoot. It is based on the same principles and comes with a full CRUD generator generating all views, the model specification and controllers (handlers in beetRoot's terminology) based on the database model! The client-server framework supports encrypted communication (SSL) as well as HTTP/HTTPS-tunneling, provides a file download and upload interface and it can be extended with own (distributed) modules. -![beetRoot website after login](https://raw.githubusercontent.com/autumoswitzerland/autumo-beetroot/master/web/img/autumo-beetroot-screen.webp) +![beetRoot website after login](autumo-beetroot-screen-87f06621.webp) autumo beetRoot is open source ([Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0)) and is now available in version 3.1.5. It also largely forms the basis for the product [autumo ifaceX](https://products.autumo.ch/ifacex/overview). @@ -83,7 +83,7 @@ del %PACKAGE%.zip ``` autumo beetRoot starting up: -![beetRoot starting on console](https://raw.githubusercontent.com/autumoswitzerland/autumo-beetroot/master/web/img/autumo-beetroot-console.webp) +![beetRoot starting on console](autumo-beetroot-console-86d51795.webp) Now go to and log in: @@ -93,7 +93,7 @@ Now go to and log in: ## QuickStart Video Take a look at the QuickStart Video if you want to play around with the framework. -[![Quickstart Video](https://i3.ytimg.com/vi/X2_FVYiMnIE/hqdefault.jpg)](https://youtu.be/X2_FVYiMnIE) +[![Quickstart Video](hqdefault-3c6ae754.jpg)](https://youtu.be/X2_FVYiMnIE) ## Full Feature List diff --git a/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-after-dark-a4b6b83d.png b/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-after-dark-a4b6b83d.png new file mode 100644 index 000000000..41829f420 Binary files /dev/null and b/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-after-dark-a4b6b83d.png differ diff --git a/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-dark-dba11829.png b/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-dark-dba11829.png new file mode 100644 index 000000000..6573931ab Binary files /dev/null and b/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-dark-dba11829.png differ diff --git a/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-diff-dark-b9034ce6.png b/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-diff-dark-b9034ce6.png new file mode 100644 index 000000000..da506e223 Binary files /dev/null and b/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-diff-dark-b9034ce6.png differ diff --git a/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-expand-dark-a1df6a1d.png b/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-expand-dark-a1df6a1d.png new file mode 100644 index 000000000..a164e54ad Binary files /dev/null and b/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-expand-dark-a1df6a1d.png differ diff --git a/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-native-dark-fe04d4c4.png b/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-native-dark-fe04d4c4.png new file mode 100644 index 000000000..bde9c3490 Binary files /dev/null and b/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-native-dark-fe04d4c4.png differ diff --git a/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-removeif-dark-fec1d90d.png b/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-removeif-dark-fec1d90d.png new file mode 100644 index 000000000..317c13f7d Binary files /dev/null and b/content/posts/2024/07/04/beginners-guide-to-java-profiler/flame-graph-removeif-dark-fec1d90d.png differ diff --git a/content/posts/2024/07/04/beginners-guide-to-java-profiler/hints-dark-3561aec8.png b/content/posts/2024/07/04/beginners-guide-to-java-profiler/hints-dark-3561aec8.png new file mode 100644 index 000000000..bb08c6a08 Binary files /dev/null and b/content/posts/2024/07/04/beginners-guide-to-java-profiler/hints-dark-3561aec8.png differ diff --git a/content/posts/2024/07/04/beginners-guide-to-java-profiler/index.md b/content/posts/2024/07/04/beginners-guide-to-java-profiler/index.md index 449a8101d..581666552 100644 --- a/content/posts/2024/07/04/beginners-guide-to-java-profiler/index.md +++ b/content/posts/2024/07/04/beginners-guide-to-java-profiler/index.md @@ -92,7 +92,7 @@ First, we need to collect profiling data, which is also referred to as a snapsho To attach the profiler from IntelliJ IDEA, choose a run configuration that you would normally use to run the application, and select **Profile** from the menu. -{{< img src="https://flounder.dev/img/get-started-with-profiling/launch-run-configuration-dark.png" class="is-resized" alt="A menu in the run widget shows the Profile option" style="width:407px" >}} +{{< img src="launch-run-configuration-dark-454eda10.png" class="is-resized" alt="A menu in the run widget shows the Profile option" style="width:407px" >}} When the app has finished running, a popup will appear, prompting us to open the snapshot. If we dismiss the popup by mistake, the snapshot will still be available in the **Profiler** tool window. @@ -102,19 +102,19 @@ Let's open the report and see what's in it. The first thing we see after opening the report is the flame graph. This is essentially a summary of all sampled stacks. The more samples with the same stack the profiler has collected, the wider this stack grows on the flame graph. So, the width of the frame is roughly equivalent to the share of time spent in this state. -{{< img src="https://flounder.dev/img/get-started-with-profiling/flame-graph-dark.png" class="is-resized" alt="Flame graph displays after opening snapshot" style="width:674px" >}} +{{< img src="flame-graph-dark-dba11829.png" class="is-resized" alt="Flame graph displays after opening snapshot" style="width:674px" >}} To our surprise, the `createDirectories()` method did not account for the most execution time. Our homemade benchmark took about the same amount of time to execute! Furthermore, if we look at the frame above, we see that this is primarily because of the `removeIf()` method, which accounts for almost all the time of its caller, `update()`. -{{< img src="https://flounder.dev/img/get-started-with-profiling/flame-graph-removeif-dark.png" class="is-resized" alt="Pointing at the removeIf() frame on the flame graph" style="width:674px" >}} +{{< img src="flame-graph-removeif-dark-fec1d90d.png" class="is-resized" alt="Pointing at the removeIf() frame on the flame graph" style="width:674px" >}} This clearly needs some looking into. **Tip**: Alongside traditional tools like the flame graph, IntelliJ Profiler provides performance hints right in the editor, which works great for quick reference and simple scenarios: -{{< img src="https://flounder.dev/img/get-started-with-profiling/hints-dark.png" class="is-resized" alt="Profiler hints in the editor's gutter" style="width:774px" >}} +{{< img src="hints-dark-3561aec8.png" class="is-resized" alt="Profiler hints in the editor's gutter" style="width:774px" >}} ## Optimize the benchmark @@ -131,7 +131,7 @@ while (events.peekFirst() < nanos - interval) { Let's change the code, then profile our app once again and look at the result: -{{< img src="https://flounder.dev/img/get-started-with-profiling/flame-graph-after-dark.png" class="is-resized" alt="Pointing at createDirectories() in the new snapshot shows '96.49% of all'" style="width:674px" >}} +{{< img src="flame-graph-after-dark-a4b6b83d.png" class="is-resized" alt="Pointing at createDirectories() in the new snapshot shows '96.49% of all'" style="width:674px" >}} The overhead from the benchmark logic is now minimal as it should be, and the `createDirectories()` frame now occupies approximately 95% of the entire execution time. @@ -147,7 +147,7 @@ Spent time: 639 ms Having solved the problem in the benchmark, we could stop here and pat ourselves on the back. But what's going on with our `createDirectories()` method? Is it too slow? There seems little room for optimization here, since this is a library method, and we don't have control over its implementation. Still, the profiler can give us a hint. By expanding the folded library frames, we can inspect what's happening inside. -![Expanding a node in the flame graph shows additional library nodes that were folded](https://flounder.dev/img/get-started-with-profiling/flame-graph-expand-dark.png) +![Expanding a node in the flame graph shows additional library nodes that were folded](flame-graph-expand-dark-a1df6a1d.png) This part of the flame graph shows that the main contributor to the execution time of `createDirectories()` is `sun.nio.fs.UnixNativeDispatcher.mkdir0`. A large portion of this frame has nothing on top of it. This is referred to as method's self-time and indicates that there is no Java code beyond that point. There might be native code, though. @@ -156,7 +156,7 @@ Since we are trying to create a directory, which requires calling the operating Let's enable native profiling (**Settings** \| **Build, Execution, Deployment** \| **Java Profiler** \| **Collect native calls**): Rerunning the application with native profiling enabled shows us the full picture: -![Now there are blue native frames on top of Java ones](https://flounder.dev/img/get-started-with-profiling/flame-graph-native-dark.png) +![Now there are blue native frames on top of Java ones](flame-graph-native-dark-fe04d4c4.png) Here's the catch. The documentation for the `createDirectories()` method says: >
    @@ -189,7 +189,7 @@ If you are using IntelliJ Profiler, there is a handy tool that lets you visually Here's a brief rundown of the results the diff shows: -{{< img src="https://flounder.dev/img/get-started-with-profiling/flame-graph-diff-dark.png" class="is-resized" alt="The differences in the snapshots are reflected with different colors" style="width:674px" >}} +{{< img src="flame-graph-diff-dark-b9034ce6.png" class="is-resized" alt="The differences in the snapshots are reflected with different colors" style="width:674px" >}} Frames missing from the newer snapshot are highlighted in green, while the new ones are colored red. If a frame has several colors, this means the frame is present in both snapshots, but its overall runtime has changed. diff --git a/content/posts/2024/07/04/beginners-guide-to-java-profiler/launch-run-configuration-dark-454eda10.png b/content/posts/2024/07/04/beginners-guide-to-java-profiler/launch-run-configuration-dark-454eda10.png new file mode 100644 index 000000000..69d9a0522 Binary files /dev/null and b/content/posts/2024/07/04/beginners-guide-to-java-profiler/launch-run-configuration-dark-454eda10.png differ diff --git a/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/ia7jokyzd3q7jgf3sdj9-2473e84e.png b/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/ia7jokyzd3q7jgf3sdj9-2473e84e.png new file mode 100644 index 000000000..b4375b03d Binary files /dev/null and b/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/ia7jokyzd3q7jgf3sdj9-2473e84e.png differ diff --git a/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/index.md b/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/index.md index f1bf8b863..15a76a3e0 100644 --- a/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/index.md +++ b/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/index.md @@ -64,7 +64,7 @@ In the cases where your traffic requires low level protocol information or is ou To begin with Wireshark, visit their [official website](https://www.wireshark.org/) for the download. The installation process is straightforward, but attention should be paid to the installation of command-line tools, which may require separate steps. Upon launching Wireshark, users are greeted with a selection of network interfaces as seen below. Choosing the correct interface, such as the loopback for local server debugging, is crucial for capturing relevant data. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jxcemosuv8pf8qwm0hxd.png) +![Image description](jxcemosuv8pf8qwm0hxd-10ac3ed5.jpg) When debugging a Local Server (localhost) use the loopback interface. Remote servers will probably fit with the en0 network adapter. You can use the activity graph next to the network adapter to identify active interfaces for capture. @@ -72,11 +72,11 @@ When debugging a Local Server (localhost) use the loopback interface. Remote ser One of the challenges of using Wireshark is the overwhelming amount of data captured, including irrelevant "background noise" as seen in the following image. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ndr05sp01wmg4t7r0yop.png) +![Image description](ndr05sp01wmg4t7r0yop-841037b0.jpg) Wireshark addresses this with powerful display filters, allowing users to hone in on specific ports, protocols, or data types. For instance, filtering TCP traffic on port 8080 can significantly reduce unrelated data, making it easier to debug specific issues. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mqg6mr5nja5tyld405cw.png) +![Image description](mqg6mr5nja5tyld405cw-016e54c3.jpg) Notice that the there is a completion widget on top of the Wireshark UI that lets you find out the values more easily. @@ -84,13 +84,13 @@ In this case we filter by port `tcp.port == 8080` which is the port used typical But this isn't enough as HTTP is more concise. We can filter by protocol by adding `http` to the filter which narrows the view to HTTP requests and responses as shown in the following image. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ia7jokyzd3q7jgf3sdj9.png) +![Image description](ia7jokyzd3q7jgf3sdj9-2473e84e.png) ## Deep Dive into Data Analysis Wireshark excels in its ability to dissect and present network data in an accessible manner. For example, HTTP responses carrying JSON data are automatically parsed and displayed in a readable tree structure as seen below. This feature is invaluable for developers and analysts, providing insights into the data exchanged between clients and servers without manual decoding. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t6qzof6cealb3invscne.png) +![Image description](t6qzof6cealb3invscne-f742f2aa.jpg) Wireshark parses and displays JSON data within the packet analysis pane. It offers both hexadecimal and ASCII views for raw packet data. diff --git a/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/jxcemosuv8pf8qwm0hxd-10ac3ed5.jpg b/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/jxcemosuv8pf8qwm0hxd-10ac3ed5.jpg new file mode 100644 index 000000000..b2ea38f07 Binary files /dev/null and b/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/jxcemosuv8pf8qwm0hxd-10ac3ed5.jpg differ diff --git a/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/mqg6mr5nja5tyld405cw-016e54c3.jpg b/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/mqg6mr5nja5tyld405cw-016e54c3.jpg new file mode 100644 index 000000000..245cfb464 Binary files /dev/null and b/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/mqg6mr5nja5tyld405cw-016e54c3.jpg differ diff --git a/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/ndr05sp01wmg4t7r0yop-841037b0.jpg b/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/ndr05sp01wmg4t7r0yop-841037b0.jpg new file mode 100644 index 000000000..991d79d5d Binary files /dev/null and b/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/ndr05sp01wmg4t7r0yop-841037b0.jpg differ diff --git a/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/t6qzof6cealb3invscne-f742f2aa.jpg b/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/t6qzof6cealb3invscne-f742f2aa.jpg new file mode 100644 index 000000000..ce2e596b8 Binary files /dev/null and b/content/posts/2024/07/08/wireshark-tcpdump-a-debugging-power-couple/t6qzof6cealb3invscne-f742f2aa.jpg differ diff --git a/content/posts/2024/07/24/creating-a-command-line-tool-with-jbang-and-picocli-to-generate-release-notes/Screenshot-2024-07-18-at-9.46.00-PM-700x290.jpg b/content/posts/2024/07/24/creating-a-command-line-tool-with-jbang-and-picocli-to-generate-release-notes/Screenshot-2024-07-18-at-9.46.00-PM-700x290.jpg new file mode 100644 index 000000000..8ebf34aca Binary files /dev/null and b/content/posts/2024/07/24/creating-a-command-line-tool-with-jbang-and-picocli-to-generate-release-notes/Screenshot-2024-07-18-at-9.46.00-PM-700x290.jpg differ diff --git a/content/posts/2024/07/24/creating-a-command-line-tool-with-jbang-and-picocli-to-generate-release-notes/Screenshot-2024-07-18-at-9.46.00-PM-700x290.png b/content/posts/2024/07/24/creating-a-command-line-tool-with-jbang-and-picocli-to-generate-release-notes/Screenshot-2024-07-18-at-9.46.00-PM-700x290.png deleted file mode 100644 index f08357aa7..000000000 Binary files a/content/posts/2024/07/24/creating-a-command-line-tool-with-jbang-and-picocli-to-generate-release-notes/Screenshot-2024-07-18-at-9.46.00-PM-700x290.png and /dev/null differ diff --git a/content/posts/2024/07/24/creating-a-command-line-tool-with-jbang-and-picocli-to-generate-release-notes/index.md b/content/posts/2024/07/24/creating-a-command-line-tool-with-jbang-and-picocli-to-generate-release-notes/index.md index e0c6a0dd5..8b572f583 100644 --- a/content/posts/2024/07/24/creating-a-command-line-tool-with-jbang-and-picocli-to-generate-release-notes/index.md +++ b/content/posts/2024/07/24/creating-a-command-line-tool-with-jbang-and-picocli-to-generate-release-notes/index.md @@ -372,7 +372,7 @@ Usage: release_notes [-f=] [-o=] -r= It will print on the terminal if we don't want to save it in any file. -{{< img src="Screenshot-2024-07-18-at-9.46.00-PM-700x290.png" class="size-medium" width="700" height="290" >}} +{{< img src="Screenshot-2024-07-18-at-9.46.00-PM-700x290.jpg" class="size-medium" width="700" height="290" >}} That's it. diff --git a/content/posts/2024/07/27/understanding-jvm-memory-layout-with-openjdk24s-new-printmemorymapatexit-vm-option/PrintMemoryMapAtExit.jpg b/content/posts/2024/07/27/understanding-jvm-memory-layout-with-openjdk24s-new-printmemorymapatexit-vm-option/PrintMemoryMapAtExit.jpg new file mode 100644 index 000000000..60ce3d7f8 Binary files /dev/null and b/content/posts/2024/07/27/understanding-jvm-memory-layout-with-openjdk24s-new-printmemorymapatexit-vm-option/PrintMemoryMapAtExit.jpg differ diff --git a/content/posts/2024/07/27/understanding-jvm-memory-layout-with-openjdk24s-new-printmemorymapatexit-vm-option/PrintMemoryMapAtExit.png b/content/posts/2024/07/27/understanding-jvm-memory-layout-with-openjdk24s-new-printmemorymapatexit-vm-option/PrintMemoryMapAtExit.png deleted file mode 100644 index 3859b22c8..000000000 Binary files a/content/posts/2024/07/27/understanding-jvm-memory-layout-with-openjdk24s-new-printmemorymapatexit-vm-option/PrintMemoryMapAtExit.png and /dev/null differ diff --git a/content/posts/2024/07/27/understanding-jvm-memory-layout-with-openjdk24s-new-printmemorymapatexit-vm-option/index.md b/content/posts/2024/07/27/understanding-jvm-memory-layout-with-openjdk24s-new-printmemorymapatexit-vm-option/index.md index 40bc2e3d9..6fab30e7a 100644 --- a/content/posts/2024/07/27/understanding-jvm-memory-layout-with-openjdk24s-new-printmemorymapatexit-vm-option/index.md +++ b/content/posts/2024/07/27/understanding-jvm-memory-layout-with-openjdk24s-new-printmemorymapatexit-vm-option/index.md @@ -5,7 +5,7 @@ lastmod: "2024-07-27T10:47:25+00:00" description: "OpenJDK24 recently added a new HotSpot JVM option called PrintMemoryMapAtExit." authors: - "chriswhocodes" -image: "PrintMemoryMapAtExit.png" +image: "PrintMemoryMapAtExit.jpg" categories: - "Java Core" related_posts: diff --git a/content/posts/2024/07/29/mastering-serverless-debugging/0mlv7ij1mypsmg0rzlsk-9fbd4ed6.jpg b/content/posts/2024/07/29/mastering-serverless-debugging/0mlv7ij1mypsmg0rzlsk-9fbd4ed6.jpg new file mode 100644 index 000000000..482f56153 Binary files /dev/null and b/content/posts/2024/07/29/mastering-serverless-debugging/0mlv7ij1mypsmg0rzlsk-9fbd4ed6.jpg differ diff --git a/content/posts/2024/07/29/mastering-serverless-debugging/index.md b/content/posts/2024/07/29/mastering-serverless-debugging/index.md index 6c35be518..1cdc31f5f 100644 --- a/content/posts/2024/07/29/mastering-serverless-debugging/index.md +++ b/content/posts/2024/07/29/mastering-serverless-debugging/index.md @@ -174,7 +174,7 @@ This command pauses the application and waits for a debugger to connect. Next we need to configure the IDE for remote debugging. We start by setting up the IDE to connect to the local host for remote debugging. This typically involves creating a new run configuration that matches the remote debugging settings. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0mlv7ij1mypsmg0rzlsk.png) +![Image description](0mlv7ij1mypsmg0rzlsk-9fbd4ed6.jpg) We can now set breakpoints in the code where we want the execution to pause. This allows us to step through the code and inspect variables and application state just like in any other local application. @@ -186,7 +186,7 @@ curl http://localhost:3000/hello The application will pause at the breakpoints you set, allowing you to step through the code. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yzpgf6da5rpw332ednvm.png) +![Image description](yzpgf6da5rpw332ednvm-d18987e3.jpg) ### Handling Debugger Timeouts diff --git a/content/posts/2024/07/29/mastering-serverless-debugging/yzpgf6da5rpw332ednvm-d18987e3.jpg b/content/posts/2024/07/29/mastering-serverless-debugging/yzpgf6da5rpw332ednvm-d18987e3.jpg new file mode 100644 index 000000000..910e7a5b1 Binary files /dev/null and b/content/posts/2024/07/29/mastering-serverless-debugging/yzpgf6da5rpw332ednvm-d18987e3.jpg differ diff --git a/content/posts/2024/07/30/failure-is-required-understanding-fail-safe-and-fail-fast-strategies/ibwgr51u71mcwstp6s4t-8c0c4acf.png b/content/posts/2024/07/30/failure-is-required-understanding-fail-safe-and-fail-fast-strategies/ibwgr51u71mcwstp6s4t-8c0c4acf.png new file mode 100644 index 000000000..6fe4cfb1d Binary files /dev/null and b/content/posts/2024/07/30/failure-is-required-understanding-fail-safe-and-fail-fast-strategies/ibwgr51u71mcwstp6s4t-8c0c4acf.png differ diff --git a/content/posts/2024/07/30/failure-is-required-understanding-fail-safe-and-fail-fast-strategies/index.md b/content/posts/2024/07/30/failure-is-required-understanding-fail-safe-and-fail-fast-strategies/index.md index 0b1e4dede..b3e9cd37a 100644 --- a/content/posts/2024/07/30/failure-is-required-understanding-fail-safe-and-fail-fast-strategies/index.md +++ b/content/posts/2024/07/30/failure-is-required-understanding-fail-safe-and-fail-fast-strategies/index.md @@ -58,7 +58,7 @@ However, fail-fast systems carry their own risks, particularly in production env Fail-safe systems take a different approach, aiming to recover and continue even in the face of unexpected conditions. This makes them particularly suited for uncertain or volatile environments. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ibwgr51u71mcwstp6s4t.png) +![Image description](ibwgr51u71mcwstp6s4t-8c0c4acf.png) Microservices are a prime example of fail-safe systems, embracing resiliency through their architecture. Circuit breakers, both physical and software-based, disconnect failing functionality to prevent cascading failures, helping the system continue operating. @@ -88,7 +88,7 @@ A balanced approach also requires clear and consistent implementation throughout This is where things get interesting. It isn't about choosing between fail-safe and fail-fast. It's about choosing the right layer for them. E.g. if an error is handled in a deep layer using a fail-safe approach, it won't be noticed. This might be OK, but if that error has adverse impact (performance, garbage data, corruption, security, etc.) then we will have a problem later on and won't have a clue. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qz6psox2d9bm4r5kmnol.png) +![Image description](qz6psox2d9bm4r5kmnol-0621955c.png) The right solution is to handle all errors in a single layer, in modern systems the top layer is the OPS layer and it makes the most sense. It can report the error to the engineers who are most qualified to deal with the error. But they can also provide immediate mitigation such as restarting a service, allocating additional resources or reverting a version. diff --git a/content/posts/2024/07/30/failure-is-required-understanding-fail-safe-and-fail-fast-strategies/qz6psox2d9bm4r5kmnol-0621955c.png b/content/posts/2024/07/30/failure-is-required-understanding-fail-safe-and-fail-fast-strategies/qz6psox2d9bm4r5kmnol-0621955c.png new file mode 100644 index 000000000..747b41958 Binary files /dev/null and b/content/posts/2024/07/30/failure-is-required-understanding-fail-safe-and-fail-fast-strategies/qz6psox2d9bm4r5kmnol-0621955c.png differ diff --git a/content/posts/2024/07/30/fuchs-2024-video-fepcos_j-client-server-application-in-java/fepcos.jpg b/content/posts/2024/07/30/fuchs-2024-video-fepcos_j-client-server-application-in-java/fepcos.jpg new file mode 100644 index 000000000..19c1ca0a4 Binary files /dev/null and b/content/posts/2024/07/30/fuchs-2024-video-fepcos_j-client-server-application-in-java/fepcos.jpg differ diff --git a/content/posts/2024/07/30/fuchs-2024-video-fepcos_j-client-server-application-in-java/fepcos.png b/content/posts/2024/07/30/fuchs-2024-video-fepcos_j-client-server-application-in-java/fepcos.png deleted file mode 100644 index 34313d7b1..000000000 Binary files a/content/posts/2024/07/30/fuchs-2024-video-fepcos_j-client-server-application-in-java/fepcos.png and /dev/null differ diff --git a/content/posts/2024/07/30/fuchs-2024-video-fepcos_j-client-server-application-in-java/index.md b/content/posts/2024/07/30/fuchs-2024-video-fepcos_j-client-server-application-in-java/index.md index e6d9fad97..9e82f1096 100644 --- a/content/posts/2024/07/30/fuchs-2024-video-fepcos_j-client-server-application-in-java/index.md +++ b/content/posts/2024/07/30/fuchs-2024-video-fepcos_j-client-server-application-in-java/index.md @@ -5,7 +5,7 @@ lastmod: "2024-07-31T10:39:07+00:00" description: "See how FEPCOS-J relieves developers of the network programming required to implement a client-server application in Java." authors: - "gerhard-fuchs" -image: "fepcos.png" +image: "fepcos.jpg" categories: - "Developer Tools" - "Java" diff --git a/content/posts/2024/07/31/javafx-links-of-july-2024/index.md b/content/posts/2024/07/31/javafx-links-of-july-2024/index.md index aaa8c6e11..9c85b0944 100644 --- a/content/posts/2024/07/31/javafx-links-of-july-2024/index.md +++ b/content/posts/2024/07/31/javafx-links-of-july-2024/index.md @@ -6,7 +6,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of July 2024, p canonical: "https://webtechie.be/post/2024-07-26-javafx-links-of-july-2024/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "Desktop" - "Game Development" diff --git a/content/posts/2024/07/31/javafx-links-of-july-2024/jfxcentral.jpg b/content/posts/2024/07/31/javafx-links-of-july-2024/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2024/07/31/javafx-links-of-july-2024/jfxcentral.jpg differ diff --git a/content/posts/2024/07/31/javafx-links-of-july-2024/jfxcentral.png b/content/posts/2024/07/31/javafx-links-of-july-2024/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2024/07/31/javafx-links-of-july-2024/jfxcentral.png and /dev/null differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/IMG_1807-c5a82996.jpeg b/content/posts/2024/07/31/jmanc-2024-trip-report/IMG_1807-c5a82996.jpeg new file mode 100644 index 000000000..c67fc900a Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/IMG_1807-c5a82996.jpeg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-018-b1debbc6.jpg b/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-018-b1debbc6.jpg new file mode 100644 index 000000000..cdbbccbcd Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-018-b1debbc6.jpg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-039-4e6cd236.jpg b/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-039-4e6cd236.jpg new file mode 100644 index 000000000..2a1b65c9f Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-039-4e6cd236.jpg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-051-83ea137e.jpg b/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-051-83ea137e.jpg new file mode 100644 index 000000000..b3102fa88 Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-051-83ea137e.jpg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-091-89e1d8f9.jpg b/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-091-89e1d8f9.jpg new file mode 100644 index 000000000..022a2806a Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-091-89e1d8f9.jpg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-110-b7e1011f.jpg b/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-110-b7e1011f.jpg new file mode 100644 index 000000000..cab4819d5 Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-110-b7e1011f.jpg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-117-27150387.jpg b/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-117-27150387.jpg new file mode 100644 index 000000000..1a31cf775 Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/JMac_2023-117-27150387.jpg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/auditorium-514f67bc.jpg b/content/posts/2024/07/31/jmanc-2024-trip-report/auditorium-514f67bc.jpg new file mode 100644 index 000000000..b3b2469fd Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/auditorium-514f67bc.jpg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/feedback-8464b4b8.jpeg b/content/posts/2024/07/31/jmanc-2024-trip-report/feedback-8464b4b8.jpeg new file mode 100644 index 000000000..9bb41d779 Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/feedback-8464b4b8.jpeg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/helenscott-3d89f6ae.jpg b/content/posts/2024/07/31/jmanc-2024-trip-report/helenscott-3d89f6ae.jpg new file mode 100644 index 000000000..41406bdf4 Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/helenscott-3d89f6ae.jpg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/index.md b/content/posts/2024/07/31/jmanc-2024-trip-report/index.md index a443d1f3d..b1e6a8a55 100644 --- a/content/posts/2024/07/31/jmanc-2024-trip-report/index.md +++ b/content/posts/2024/07/31/jmanc-2024-trip-report/index.md @@ -29,7 +29,7 @@ See you next year! 😀 ## intro In January this year we decided to test the interest of the Manchester Java Community on whether they were up for another edition of the [JManc Unconference](https://jmanc.org/). We sent out a survey to our members and from the responses received there was unanimous support for to us to run it again. This gave [Jon Bullock](https://www.linkedin.com/in/jsbullock/), [Dave Underwood](https://www.linkedin.com/in/david-underwood-6b929858/) and I the motivation we needed to put plans into motion for the 3rd edition of JManc Unconference! -![JManc 2024](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/jmanc-2024.png) +![JManc 2024](jmanc-2024-d172c29c.jpg) ## planning @@ -44,18 +44,18 @@ Another key decision came down to whether we would charge people to attend or no With this in mind we decided to release 70 tickets with the hope that 40 or so of them would turn up on the day. If 70 people did turn up on the day then it wouldn't have been a problem, maybe just a little more chaotic that we'd been planning for 😬 One part of JManc that's a little unconventional for an unconference is to have a keynote speaker. With a carefully chosen speaker we believe it adds a little more value for the attendees. This year we invited [Helen Scott](https://www.helenjoscott.com/) from JetBrains to join us which she enthusiastically accepted. Huge thanks to Helen for offering her time to help JManc be a success. -![Helen Scott](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/helenscott.jpg) +![Helen Scott](helenscott-3d89f6ae.jpg) The last aspect we had to consider that's been really successful in previous years was the evening social. The social provides a great way to relax and reflect following an intense day of discussions. We were delighted to partner with [ECOM Recruitment](https://www.interquestgroup.com/brands/ecom/about-us) on this with them agreeing to sponsor the social by putting some cash behind the bar at [Home](https://homemcr.org/) to cover a few drinks and nibbles for everyone. After all the planning it then boils down to promotion! With the help of our partners and friends of the MJC (such as the [JUnconference Alliance](https://junconf.org/), [ReframeIT](https://www.reframe-wit.com/) and [Foojay](https://foojay.io/)) we started to spread the word with the hope reaching a diverse range of people who might be interested in attending an event such as this. -![JManc Promo](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/jmanc-promo.jpeg) +![JManc Promo](jmanc-promo-fd6bc563.jpeg) Something that's really important for us as organisers is to keep things simple but there's an essential level of complexity that comes with running an event like this. Huge thanks to [Claire Isherwood](https://www.linkedin.com/in/claireisherwood/) (and team at Auto Trader), [Gareth Pike](https://www.linkedin.com/in/garethpike/) and [Rob Sugden](https://www.linkedin.com/in/robertsugden/) for helping manage this complexity and reducing the stress during the run up to the day. ## the day -![Welcome](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/welcome.jpg) +![Welcome](welcome-230687dd.jpg) Our predictions on the number of attendees were pretty much spot on with just under 40 people attending. My main concern with the attendee drop-off rate comes down to waste. The last thing we wanted it was for Auto Trader to plan catering for 70 people and the only half of that number turn up. Fortunately we were able to confirm the exact numbers to the catering team at Auto Trader on the morning of the conference so this wasn't a problem. @@ -64,39 +64,39 @@ We only really had full access to the event space on the morning of the conferen ### the marketplace \& discussion spaces We created a main space where attendees would congregate on arrival for coffee and pastries. This space was also where we created "The Marketplace", a key area for the unconference where attendees could propose their topic ideas, vote on their favourites and we could create the schedule. Throughout the day attendees revisited The Marketplace to connect with others, propose new topics and choose their next sessions. -![The Marketplace](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/marketplace-0.jpeg) +![The Marketplace](marketplace-0-922513e7.jpeg) On attendees arriving the first role of the *"dis-organisers"* was to get the new arrivals straight into the mindset of an unconference and thinking about what they would either like to share or learn about. This was some attendees first unconference experience so we led by example by proposing some topics for discussion and encouraged others to do the same. -![The Marketplace](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/marketplace-1.jpg) +![The Marketplace](marketplace-1-d4985a55.jpg) We also created 4 spaces where the actual unconference sessions would happen. One of the spaces already had a name in the Auditorium but for the others we naturally channelled our inner geek and called them Hot Spot, The Heap and Garbage Collection. -![The Heap](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/IMG_1807.jpeg) +![The Heap](IMG_1807-c5a82996.jpeg) Immediately before the keynote we did our first round of dot voting on the topics proposed so far. This approach ensures that it's the attendees who democratically decide the schedule for the day. -![dot voting](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/JMac_2023-018.jpg) +![dot voting](JMac_2023-018-b1debbc6.jpg) ### keynote The Auditorium also provided the perfect setting for our keynote session. -![auditorium](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/auditorium.jpg) +![auditorium](auditorium-514f67bc.jpg) The dis-organisers first gave a brief intro JManc and set the scene for how we were hoping the day would go. -![intro](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/JMac_2023-039.jpg) +![intro](JMac_2023-039-4e6cd236.jpg) Helen then took attendees on a tour of AI, tooling and ways of working covering some of the history and then focusing in on the practical reality of AI today with some predictions for the future. -![keynote](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/JMac_2023-051.jpg) +![keynote](JMac_2023-051-83ea137e.jpg) Unfortunately for myself, Jon and Dave we had to the leave the keynote half way through to go and create the morning schedule out the sessions that had been voted on. This part is easier said than done with there often being various competing topics that are highly voted. ### the schedule As an attendee, the nature of any conference is that, unless it's single track, you are more than likely going to have a clash between multiple sessions with topics you are interested in happening at the same time. We tried our best to avoid clashes between the most popular topics and I hope we managed to make most people happy. -![schedule](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/schedule.jpeg) +![schedule](schedule-0e8cae13.jpeg) Based on the actual number of people on the day we decided to stick with 3 tracks using the Auditorium for the most popular session in each slot. Following the keynote and a short break we kicked off the unconference style sessions. -![GC Session](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/JMac_2023-091.jpg) ![GC Session](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/JMac_2023-110.jpg) ![Auditorium Session](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/JMac_2023-117.jpg) +![GC Session](JMac_2023-091-89e1d8f9.jpg) ![GC Session](JMac_2023-110-b7e1011f.jpg) ![Auditorium Session](JMac_2023-117-27150387.jpg) The sessions on the day covered a wide variety of topics such as: @@ -113,7 +113,7 @@ The sessions on the day covered a wide variety of topics such as: * ways or working handling distractions, how to focus, teams/slack etiquette As you can see this is a diverse range of content, and not all Java/JVM specific. -![session-01](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/session-01.jpeg) ![session-02](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/session-02.jpeg) ![session-03](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/session-03.jpeg) +![session-01](session-01-2e52ee5d.jpeg) ![session-02](session-02-18c166f9.jpeg) ![session-03](session-03-5901d617.jpeg) ### evening social @@ -122,7 +122,7 @@ The day was super busy and was over before we knew it and the evening social pro ## retro In previous years we've ran a more structured retro session which has been a really nice touch however this year we kept it simple and just asked for feedback on post-its as people left at the end. I think this worked well, and thankfully almost 100% of feedback was positive. -![feedback](https://www.nickebbitt.com/blog/2024/07/20/jmanc-2024/feedback.jpeg) +![feedback](feedback-8464b4b8.jpeg) The organising group of JManc plan to run a retro in the coming weeks to review what worked and what didn't across all aspects. A few things that come to mind for me that will feed into this are: diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/jmanc-2024-d172c29c.jpg b/content/posts/2024/07/31/jmanc-2024-trip-report/jmanc-2024-d172c29c.jpg new file mode 100644 index 000000000..37bbcf70a Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/jmanc-2024-d172c29c.jpg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/jmanc-promo-fd6bc563.jpeg b/content/posts/2024/07/31/jmanc-2024-trip-report/jmanc-promo-fd6bc563.jpeg new file mode 100644 index 000000000..49540c9e3 Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/jmanc-promo-fd6bc563.jpeg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/marketplace-0-922513e7.jpeg b/content/posts/2024/07/31/jmanc-2024-trip-report/marketplace-0-922513e7.jpeg new file mode 100644 index 000000000..38da0ed7f Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/marketplace-0-922513e7.jpeg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/marketplace-1-d4985a55.jpg b/content/posts/2024/07/31/jmanc-2024-trip-report/marketplace-1-d4985a55.jpg new file mode 100644 index 000000000..b273f8dbe Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/marketplace-1-d4985a55.jpg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/schedule-0e8cae13.jpeg b/content/posts/2024/07/31/jmanc-2024-trip-report/schedule-0e8cae13.jpeg new file mode 100644 index 000000000..02e51f5e4 Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/schedule-0e8cae13.jpeg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/session-01-2e52ee5d.jpeg b/content/posts/2024/07/31/jmanc-2024-trip-report/session-01-2e52ee5d.jpeg new file mode 100644 index 000000000..8a538b67f Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/session-01-2e52ee5d.jpeg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/session-02-18c166f9.jpeg b/content/posts/2024/07/31/jmanc-2024-trip-report/session-02-18c166f9.jpeg new file mode 100644 index 000000000..b6853535f Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/session-02-18c166f9.jpeg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/session-03-5901d617.jpeg b/content/posts/2024/07/31/jmanc-2024-trip-report/session-03-5901d617.jpeg new file mode 100644 index 000000000..c53d8534a Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/session-03-5901d617.jpeg differ diff --git a/content/posts/2024/07/31/jmanc-2024-trip-report/welcome-230687dd.jpg b/content/posts/2024/07/31/jmanc-2024-trip-report/welcome-230687dd.jpg new file mode 100644 index 000000000..a5b133367 Binary files /dev/null and b/content/posts/2024/07/31/jmanc-2024-trip-report/welcome-230687dd.jpg differ diff --git a/content/posts/2024/08/03/are-java-security-updates-important/image-1024x679.jpg b/content/posts/2024/08/03/are-java-security-updates-important/image-1024x679.jpg new file mode 100644 index 000000000..889120361 Binary files /dev/null and b/content/posts/2024/08/03/are-java-security-updates-important/image-1024x679.jpg differ diff --git a/content/posts/2024/08/03/are-java-security-updates-important/image-1024x679.png b/content/posts/2024/08/03/are-java-security-updates-important/image-1024x679.png deleted file mode 100644 index 0c29eb023..000000000 Binary files a/content/posts/2024/08/03/are-java-security-updates-important/image-1024x679.png and /dev/null differ diff --git a/content/posts/2024/08/03/are-java-security-updates-important/index.md b/content/posts/2024/08/03/are-java-security-updates-important/index.md index e8b6a2625..cfef1816c 100644 --- a/content/posts/2024/08/03/are-java-security-updates-important/index.md +++ b/content/posts/2024/08/03/are-java-security-updates-important/index.md @@ -6,7 +6,7 @@ description: "Equifax had numerous firewalls in place that would have done all t canonical: "https://www.azul.com/blog/the-importance-of-java-security-updates/" authors: - "simonritter" -image: "image-1024x679.png" +image: "image-1024x679.jpg" categories: - "Security" related_posts: @@ -61,7 +61,7 @@ Firstly, here is a list of the highest-scoring CVSS in updates since April 2019. | April 2019 | 9.0 | 8 | For a full view on CVEs per update of the JDK, see [Foojay.io](https://javaalmanac.io/jdk/16/): -[![](image-1024x679.png)](https://javaalmanac.io/jdk/16/) +[![](image-1024x679.jpg)](https://javaalmanac.io/jdk/16/) As you can see, recently, things have been relatively quiet with only medium-level vulnerabilities being addressed, but there have been some high and one critical. diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/add-memory-dark-12096de3.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/add-memory-dark-12096de3.png new file mode 100644 index 000000000..dc0843cd4 Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/add-memory-dark-12096de3.png differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/banner.jpg b/content/posts/2024/08/09/get-started-with-allocation-profiling/banner.jpg new file mode 100644 index 000000000..4026c6fc6 Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/banner.jpg differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/banner.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/banner.png deleted file mode 100644 index b7a6c089a..000000000 Binary files a/content/posts/2024/08/09/get-started-with-allocation-profiling/banner.png and /dev/null differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/conditional-breakpoint-dark-b2e21426.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/conditional-breakpoint-dark-b2e21426.png new file mode 100644 index 000000000..9fdc38bc4 Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/conditional-breakpoint-dark-b2e21426.png differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/cpu-memory-charts-1-dark-9c17a087.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/cpu-memory-charts-1-dark-9c17a087.png new file mode 100644 index 000000000..ee35dab77 Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/cpu-memory-charts-1-dark-9c17a087.png differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/cpu-memory-charts-2-dark-9cd73a15.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/cpu-memory-charts-2-dark-9cd73a15.png new file mode 100644 index 000000000..490cc400b Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/cpu-memory-charts-2-dark-9cd73a15.png differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/cpu-memory-charts-3-dark-6b05305d.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/cpu-memory-charts-3-dark-6b05305d.png new file mode 100644 index 000000000..4ec64bd6b Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/cpu-memory-charts-3-dark-6b05305d.png differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/cpu-memory-charts-normal-dark-db420387.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/cpu-memory-charts-normal-dark-db420387.png new file mode 100644 index 000000000..8715d09aa Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/cpu-memory-charts-normal-dark-db420387.png differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/data-flow-to-here-1-dark-f68248a0.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/data-flow-to-here-1-dark-f68248a0.png new file mode 100644 index 000000000..f365a8de7 Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/data-flow-to-here-1-dark-f68248a0.png differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/data-flow-to-here-2-dark-dacee22d.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/data-flow-to-here-2-dark-dacee22d.png new file mode 100644 index 000000000..16b80f3e9 Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/data-flow-to-here-2-dark-dacee22d.png differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/debugger-threads-dark-b109e123.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/debugger-threads-dark-b109e123.png new file mode 100644 index 000000000..cbd852eb4 Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/debugger-threads-dark-b109e123.png differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/files-location-dark-3f4c7ddc.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/files-location-dark-3f4c7ddc.png new file mode 100644 index 000000000..859ede041 Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/files-location-dark-3f4c7ddc.png differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/flame-graph-1-dark-53bc84cd.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/flame-graph-1-dark-53bc84cd.png new file mode 100644 index 000000000..610b6bd1b Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/flame-graph-1-dark-53bc84cd.png differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/flame-graph-2-dark-a60be001.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/flame-graph-2-dark-a60be001.png new file mode 100644 index 000000000..5b485a8d3 Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/flame-graph-2-dark-a60be001.png differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/gc-dark-ad3745e5.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/gc-dark-ad3745e5.png new file mode 100644 index 000000000..64d65123f Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/gc-dark-ad3745e5.png differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/index.md b/content/posts/2024/08/09/get-started-with-allocation-profiling/index.md index 18e790139..eef4001d6 100644 --- a/content/posts/2024/08/09/get-started-with-allocation-profiling/index.md +++ b/content/posts/2024/08/09/get-started-with-allocation-profiling/index.md @@ -6,7 +6,7 @@ description: "Trouble finding memory leaks in a Java program? Learn how allocati canonical: "https://flounder.dev/posts/allocation-profiling/" authors: - "igor-kulakov" -image: "banner.png" +image: "banner.jpg" categories: - "Debugging" - "IntelliJ IDEA" @@ -35,7 +35,7 @@ In this post, we'll look at how we can profile memory allocations to solve a run Let's start with cloning the following repository: . Launch the application using the **Parrot** run configuration included with the project. The app seems to work well: you can tweak the animation color and speed. However, it's not long before things start going wrong. -![The parrot animation is frozen](https://flounder.dev/img/profile-memory-allocations/parrot-freeze.png) +![The parrot animation is frozen](parrot-freeze-431fb9d1.png) After working for some time, the animation freezes with no indication of what the cause is. The program can sometimes throw an `OutOfMemoryError`, whose stack trace doesn't tell us anything about the origin of the problem. @@ -47,7 +47,7 @@ There is no reliable way of telling how exactly the problem will manifest itself It seems we have a bug. Let's try using the debugger! Launch the application in debug mode, wait until the animation freezes, then hit [Pause Program](https://flounder.dev/posts/debug-without-breakpoints/). -{{< img src="https://flounder.dev/img/profile-memory-allocations/debugger-threads-dark.png" class="is-resized" alt="Threads view in the debugger shows a stack, which seems unrelated to the bug" style="width:811px" >}} +{{< img src="debugger-threads-dark-b109e123.png" class="is-resized" alt="Threads view in the debugger shows a stack, which seems unrelated to the bug" style="width:811px" >}} Unfortunately, this did not tell us much because all the threads involved in the parrot party are in the waiting state. Inspecting their stacks gives no indication why the freeze happened. Clearly, the we need another approach rather than [treating this error as a regular exception](https://flounder.dev/posts/efficient-debugging-exceptions/). @@ -55,31 +55,31 @@ Unfortunately, this did not tell us much because all the threads involved in the Since we are getting an `OutOfMemoryError`, a good starting point for analysis is **CPU and Memory Live Charts** . They allow us to visualize real-time resources usage for the processes that are running. Let's [open the charts](https://www.jetbrains.com/help/idea/cpu-and-memory-live-charts.html) for our parrot app and see if we can spot anything when the animation freezes. -{{< img src="https://flounder.dev/img/profile-memory-allocations/cpu-memory-charts-1-dark.png" class="is-resized" alt="Memory usage chart shows that the amount of used memory increases and then flats out" style="width:642px" >}} +{{< img src="cpu-memory-charts-1-dark-9c17a087.png" class="is-resized" alt="Memory usage chart shows that the amount of used memory increases and then flats out" style="width:642px" >}} Indeed, we see that the memory usage is going up continually before reaching a plateau. This is precisely the moment when the animation hangs, and after that it seems to hang forever. This gives us a clue. Usually, the memory usage curve is saw-shaped: the chart goes up when new objects are allocated and periodically goes down when the memory is reclaimed after garbage-collecting unused objects. You can see an example of a normally operating program in the picture below: -{{< img src="https://flounder.dev/img/profile-memory-allocations/cpu-memory-charts-normal-dark.png" class="is-resized" alt="Screenshot of a memory usage chart where used memory constantly goes up but then goes down regularly" style="width:642px" >}} +{{< img src="cpu-memory-charts-normal-dark-db420387.png" class="is-resized" alt="Screenshot of a memory usage chart where used memory constantly goes up but then goes down regularly" style="width:642px" >}} If the saw teeth become too frequent, it means that the garbage collector is working intensively to free up the memory. A plateau means it can't free up any. We can test if the JVM is able to perform a garbage collection by explicitly requesting one: -{{< img src="https://flounder.dev/img/profile-memory-allocations/gc-dark.png" class="is-resized" alt="'Perform GC' button on the toolbar of 'CPU and Memory Live Charts'" style="width:482px" >}} +{{< img src="gc-dark-ad3745e5.png" class="is-resized" alt="'Perform GC' button on the toolbar of 'CPU and Memory Live Charts'" style="width:482px" >}} Memory usage does not go down after our app reaches the plateau, even if we manually prompt it to free up some memory. This supports our hypothesis that there are no objects eligible for garbage collection. A naïve solution would be to just add more memory. For this, add the `-Xmx500m` VM option to the run configuration. -{{< img src="https://flounder.dev/img/profile-memory-allocations/add-memory-dark.png" class="is-resized" alt="Adding -Xmx500m VM option in the 'Run/Debug Configurations' dialog" style="width:773px" >}} +{{< img src="add-memory-dark-12096de3.png" class="is-resized" alt="Adding -Xmx500m VM option in the 'Run/Debug Configurations' dialog" style="width:773px" >}} **Tip**: To quickly access the settings of the currently selected run configuration, hold 'Shift' and click the run configuration name on the main toolbar. Regardless of the available memory, the parrot runs out of it anyway. Again, we see the same picture. The only visible effect of extra memory was that we delayed the end of the "party". -{{< img src="https://flounder.dev/img/profile-memory-allocations/cpu-memory-charts-2-dark.png" class="is-resized" alt="Memory usage chart shows that now there is 500M available memory, but the app uses it all anyway" style="width:642px" >}} +{{< img src="cpu-memory-charts-2-dark-9cd73a15.png" class="is-resized" alt="Memory usage chart shows that now there is 500M available memory, but the app uses it all anyway" style="width:642px" >}} ## Allocation profiling @@ -91,19 +91,19 @@ Let's [run the application with IntelliJ Profiler](https://flounder.dev/posts/ge After running the profiler for some time, let's open the report and select **Memory Allocations**: -{{< img src="https://flounder.dev/img/profile-memory-allocations/switch-to-allocations-dark.png" class="is-resized" alt="The 'Memory Allocations' item in the 'Show' menu in the top-right corner of the 'Profiler' tool window" style="width:657px" >}} +{{< img src="switch-to-allocations-dark-7198f062.png" class="is-resized" alt="The 'Memory Allocations' item in the 'Show' menu in the top-right corner of the 'Profiler' tool window" style="width:657px" >}} There are several views available for the collected data. In this tutorial, we will use the [flame graph](https://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html). It aggregates the collected stacks in a single stack-like structure, adjusting the element width according to the number of collected [samples](https://www.jetbrains.com/help/idea/cpu-and-allocation-profiling-basic-concepts.html#cpu-profiling). The widest elements represent the most massively allocated types during the profiling period. An important thing to note here is that a lot of allocations don't necessarily indicate a problem. A memory leak happens *only* if the allocated objects are not garbage-collected. While allocation profiling doesn't tell us anything about the garbage collection, it can still give us hints for further investigation. -{{< img src="https://flounder.dev/img/profile-memory-allocations/flame-graph-1-dark.png" class="is-resized" alt="The two largest frames in the allocation graph are int[] and byte[]" style="width:657px" >}} +{{< img src="flame-graph-1-dark-53bc84cd.png" class="is-resized" alt="The two largest frames in the allocation graph are int[] and byte[]" style="width:657px" >}} Let's see where the two most massive elements, `byte[]` and `int[]` are coming from. The top of the stack tells us that these arrays are created during image processing by the code from the `java.awt.image` package. The bottom of the stack tells us that all this happens in a separate thread managed by an executor service. We aren't looking for bugs in library code, so let's look at the project code that's in between. Going from top to bottom, the first application method we see is `recolor()`, which in turn is called by `updateParrot()`. Judging by the name, this method is exactly what makes our parrot move. Let's see how this is implemented and why it needs that many arrays. -{{< img src="https://flounder.dev/img/profile-memory-allocations/flame-graph-2-dark.png" class="is-resized" alt="Pointing at the updateParrot() method on the flame graph" style="width:657px" >}} +{{< img src="flame-graph-2-dark-a60be001.png" class="is-resized" alt="Pointing at the updateParrot() method on the flame graph" style="width:657px" >}} Clicking at the frame takes us to the source code of the corresponding method: @@ -130,7 +130,7 @@ public State(BufferedImage baseImage, int hue) { Using the built-in static analyzer, we can trace the range of input values for the `State` constructor call. Right-click the `baseImage` constructor argument, then from the menu, select **Analyze** \| **Data Flow to Here**. -{{< img src="https://flounder.dev/img/profile-memory-allocations/data-flow-to-here-1-dark.png" class="is-resized" alt="'Analyze dataflow to' tool window shows possible sources of values as nodes" style="width:1241px" >}} +{{< img src="data-flow-to-here-1-dark-f68248a0.png" class="is-resized" alt="'Analyze dataflow to' tool window shows possible sources of values as nodes" style="width:1241px" >}} Expand the nodes and pay attention to `ImageIO.read(path.toFile())`. It shows us that the base images come from a set of files. If we double-click this line and look at the `PARROTS_PATH` constant that is nearby, we discover the files' location: @@ -140,11 +140,11 @@ public static final String PARROTS_PATH = "src/main/resources"; By navigating to this directory, we can see the following: -{{< img src="https://flounder.dev/img/profile-memory-allocations/files-location-dark.png" class="is-resized" alt="10 image files under src/main/java in the 'Project' tool window" style="width:384px" >}} +{{< img src="files-location-dark-3f4c7ddc.png" class="is-resized" alt="10 image files under src/main/java in the 'Project' tool window" style="width:384px" >}} That's ten base images that correspond to the possible positions of the parrot. Well, what about the `hue` constructor argument? -{{< img src="https://flounder.dev/img/profile-memory-allocations/data-flow-to-here-2-dark.png" class="is-resized" alt="'Analyze dataflow to' tool window shows possible sources of values as nodes" style="width:754px" >}} +{{< img src="data-flow-to-here-2-dark-dacee22d.png" class="is-resized" alt="'Analyze dataflow to' tool window shows possible sources of values as nodes" style="width:754px" >}} If we inspect the code that modifies the `hue` variable, we see that it has a starting value of `50`. Then it is either set with a slider or updated automatically from the `updateHue()` method. Either way, it is always within the range of `1` to `100`. @@ -158,11 +158,11 @@ Now, this is where the debugger can be useful. We can check the size of the cach Let's set a breakpoint at the update action and add a condition so that it only suspends the application when the cache size exceeds 1000 elements. -{{< img src="https://flounder.dev/img/profile-memory-allocations/conditional-breakpoint-dark.png" class="is-resized" alt="Breakpoint settings dialog with a condition" style="width:946px" >}} +{{< img src="conditional-breakpoint-dark-b2e21426.png" class="is-resized" alt="Breakpoint settings dialog with a condition" style="width:946px" >}} Now run the app in debug mode. -{{< img src="https://flounder.dev/img/profile-memory-allocations/stopped-at-breakpoint-dark.png" class="is-resized" alt="A highlighted line indicates that breakpoint worked and the debugger suspended the application" style="width:938px" >}} +{{< img src="stopped-at-breakpoint-dark-d6e244f9.png" class="is-resized" alt="A highlighted line indicates that breakpoint worked and the debugger suspended the application" style="width:938px" >}} Indeed, we stop at this breakpoint after running the program for some time, which means the problem is indeed in the cache. @@ -219,7 +219,7 @@ public int hashCode() { Let's restart the application and see if things have improved. Again, we can use [CPU and Memory Live Charts](#monitor-resources-usage) for that: -{{< img src="https://flounder.dev/img/profile-memory-allocations/cpu-memory-charts-3-dark.png" class="is-resized" alt="The graph in 'CPU and Memory Live Charts' no longer flats out and goes down regularly" style="width:807px" >}} +{{< img src="cpu-memory-charts-3-dark-6b05305d.png" class="is-resized" alt="The graph in 'CPU and Memory Live Charts' no longer flats out and goes down regularly" style="width:807px" >}} That is much better! diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/parrot-freeze-431fb9d1.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/parrot-freeze-431fb9d1.png new file mode 100644 index 000000000..20ce0c1a1 Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/parrot-freeze-431fb9d1.png differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/stopped-at-breakpoint-dark-d6e244f9.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/stopped-at-breakpoint-dark-d6e244f9.png new file mode 100644 index 000000000..921dfd1a5 Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/stopped-at-breakpoint-dark-d6e244f9.png differ diff --git a/content/posts/2024/08/09/get-started-with-allocation-profiling/switch-to-allocations-dark-7198f062.png b/content/posts/2024/08/09/get-started-with-allocation-profiling/switch-to-allocations-dark-7198f062.png new file mode 100644 index 000000000..f66b93b96 Binary files /dev/null and b/content/posts/2024/08/09/get-started-with-allocation-profiling/switch-to-allocations-dark-7198f062.png differ diff --git a/content/posts/2024/08/13/trash-pandas-love-enterprise-java-garbage-code/blog-2024-06-27-teaser-253x300-e4362b87.jpg b/content/posts/2024/08/13/trash-pandas-love-enterprise-java-garbage-code/blog-2024-06-27-teaser-253x300-e4362b87.jpg new file mode 100644 index 000000000..102985361 Binary files /dev/null and b/content/posts/2024/08/13/trash-pandas-love-enterprise-java-garbage-code/blog-2024-06-27-teaser-253x300-e4362b87.jpg differ diff --git a/content/posts/2024/08/13/trash-pandas-love-enterprise-java-garbage-code/index.md b/content/posts/2024/08/13/trash-pandas-love-enterprise-java-garbage-code/index.md index 89e42f382..1229c6e17 100644 --- a/content/posts/2024/08/13/trash-pandas-love-enterprise-java-garbage-code/index.md +++ b/content/posts/2024/08/13/trash-pandas-love-enterprise-java-garbage-code/index.md @@ -40,7 +40,7 @@ A similar IEEE study of an industrial software system found that [up to 50 perce ## Unused and dead code in Java -[![Find your garbage code with Azul Vulnerability Detection](https://www.azul.com/wp-content/uploads/blog-2024-06-27-teaser-253x300.jpg)](https://www.azul.com/wp-content/uploads/Azul-Code-Inventory-Infographic.pdf) Find your garbage code with Azul Vulnerability Detection. See the infographic +[![Find your garbage code with Azul Vulnerability Detection](blog-2024-06-27-teaser-253x300-e4362b87.jpg)](https://www.azul.com/wp-content/uploads/Azul-Code-Inventory-Infographic.pdf) Find your garbage code with Azul Vulnerability Detection. See the infographic Java engineers can treat unused and dead code detection similar to garbage collection – choose your setting and let the JVM do the rest. Whether code is used in production is answered by whether the method is ever called (or inlined). The recording of this decision is made in one of three places: the bytecode interpreter, AppCDS (Application Class Data Sharing), or the ReadyNow feature of Azul Platform Prime. If the method is used again, there's no need to impact performance beyond recording the first call. The method was used in production, so the code is not dead. In this scenario JVM runs are tagged with the "application environment" to help record which application called the method for a given environment. Keeping these environments separate helps identify cases where the code and unit tests only serve to keep each other alive. diff --git a/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/DataRange-Scheme-1024x786.jpg b/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/DataRange-Scheme-1024x786.jpg new file mode 100644 index 000000000..5afdc2c54 Binary files /dev/null and b/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/DataRange-Scheme-1024x786.jpg differ diff --git a/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/DataRange-Scheme-1024x786.png b/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/DataRange-Scheme-1024x786.png deleted file mode 100644 index d3be89788..000000000 Binary files a/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/DataRange-Scheme-1024x786.png and /dev/null differ diff --git a/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/TornadoExecutionPlan-configurations.jpg b/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/TornadoExecutionPlan-configurations.jpg new file mode 100644 index 000000000..85a865625 Binary files /dev/null and b/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/TornadoExecutionPlan-configurations.jpg differ diff --git a/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/TornadoExecutionPlan-configurations.png b/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/TornadoExecutionPlan-configurations.png deleted file mode 100644 index e44e14cfd..000000000 Binary files a/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/TornadoExecutionPlan-configurations.png and /dev/null differ diff --git a/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/index.md b/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/index.md index d3ddfab2e..5017c3b32 100644 --- a/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/index.md +++ b/content/posts/2024/08/15/defining-patterns-of-data-transfers-for-java-applications-with-tornadovm/index.md @@ -66,7 +66,7 @@ executionResult.transferToHost(matrixC); **Note:** The **executionPlan.execute()** is a blocking call that performs all the steps (see the screenshot from the Java editor) in the executionPlan as defined by the programmer. -{{< img src="TornadoExecutionPlan-configurations.png" class="aligncenter size-full is-resized" width="963" height="292" style="width:676px;height:auto" >}} +{{< img src="TornadoExecutionPlan-configurations.jpg" class="aligncenter size-full is-resized" width="963" height="292" style="width:676px;height:auto" >}} ## Pattern 2. Data do not fit into the GPU memory @@ -92,7 +92,7 @@ executionResult.transferToHost(dataRange.withSize(1).withOffset(0)); An example of this API call is shown in one of the TornadoVM unit-tests, [here](https://github.com/beehive-lab/TornadoVM/blob/faffab7ee2fc9c9f06ece7f7e5f075fc056f379a/tornado-unittests/src/main/java/uk/ac/manchester/tornado/unittests/api/TestAPI.java#L283). Several variations of the above code snippet are shown in the following image. -{{< img src="DataRange-Scheme-1024x786.png" class="aligncenter size-large is-resized" width="1024" height="786" style="width:676px;height:auto" >}} +{{< img src="DataRange-Scheme-1024x786.jpg" class="aligncenter size-large is-resized" width="1024" height="786" style="width:676px;height:auto" >}} ## Summary diff --git a/content/posts/2024/08/19/interview-with-a-java-champion-reflections-on-a-storied-career-and-insights-for-the-next-generation/Ben-Evans-.jpg b/content/posts/2024/08/19/interview-with-a-java-champion-reflections-on-a-storied-career-and-insights-for-the-next-generation/Ben-Evans-.jpg new file mode 100644 index 000000000..42544331c Binary files /dev/null and b/content/posts/2024/08/19/interview-with-a-java-champion-reflections-on-a-storied-career-and-insights-for-the-next-generation/Ben-Evans-.jpg differ diff --git a/content/posts/2024/08/19/interview-with-a-java-champion-reflections-on-a-storied-career-and-insights-for-the-next-generation/Ben-Evans-.png b/content/posts/2024/08/19/interview-with-a-java-champion-reflections-on-a-storied-career-and-insights-for-the-next-generation/Ben-Evans-.png deleted file mode 100644 index 675a3147f..000000000 Binary files a/content/posts/2024/08/19/interview-with-a-java-champion-reflections-on-a-storied-career-and-insights-for-the-next-generation/Ben-Evans-.png and /dev/null differ diff --git a/content/posts/2024/08/19/interview-with-a-java-champion-reflections-on-a-storied-career-and-insights-for-the-next-generation/index.md b/content/posts/2024/08/19/interview-with-a-java-champion-reflections-on-a-storied-career-and-insights-for-the-next-generation/index.md index 3bc25e68b..e93f842ea 100644 --- a/content/posts/2024/08/19/interview-with-a-java-champion-reflections-on-a-storied-career-and-insights-for-the-next-generation/index.md +++ b/content/posts/2024/08/19/interview-with-a-java-champion-reflections-on-a-storied-career-and-insights-for-the-next-generation/index.md @@ -5,7 +5,7 @@ lastmod: "2024-08-19T07:52:20+00:00" description: "Java Champion Ben Evans shares his journey, insights on Java's evolution, and advice for developers in this insightful interview." authors: - "bazlur-rahman" -image: "Ben-Evans-.png" +image: "Ben-Evans-.jpg" categories: - "Interviews" related_posts: diff --git a/content/posts/2024/08/21/sustainable-software-engineering-input-requested/index.md b/content/posts/2024/08/21/sustainable-software-engineering-input-requested/index.md index 5bf82464e..163a7b75a 100644 --- a/content/posts/2024/08/21/sustainable-software-engineering-input-requested/index.md +++ b/content/posts/2024/08/21/sustainable-software-engineering-input-requested/index.md @@ -5,7 +5,7 @@ lastmod: "2024-08-21T09:51:22+00:00" description: "Since about a year ago, the Foojay community has a group of people that are working on a book with tips and information on Sustainable Software Engineering." authors: - "janhendrik-kuperus" -image: "itsustainability-1.png" +image: "itsustainability-1.jpg" categories: - "Books" - "FinOps" @@ -33,7 +33,7 @@ ven you or your organization does not do anything, we still want to ask you to f [ -{{< img src="itsustainability-630x510.png" class="size-medium" width="630" height="510" >}} +{{< img src="itsustainability-630x510.jpg" class="size-medium" width="630" height="510" >}} ](https://opnform.com/forms/it-sustainability-goals-ewq3yc) diff --git a/content/posts/2024/08/21/sustainable-software-engineering-input-requested/itsustainability-1.jpg b/content/posts/2024/08/21/sustainable-software-engineering-input-requested/itsustainability-1.jpg new file mode 100644 index 000000000..3fbc75a15 Binary files /dev/null and b/content/posts/2024/08/21/sustainable-software-engineering-input-requested/itsustainability-1.jpg differ diff --git a/content/posts/2024/08/21/sustainable-software-engineering-input-requested/itsustainability-1.png b/content/posts/2024/08/21/sustainable-software-engineering-input-requested/itsustainability-1.png deleted file mode 100644 index c18a76172..000000000 Binary files a/content/posts/2024/08/21/sustainable-software-engineering-input-requested/itsustainability-1.png and /dev/null differ diff --git a/content/posts/2024/08/21/sustainable-software-engineering-input-requested/itsustainability-630x510.jpg b/content/posts/2024/08/21/sustainable-software-engineering-input-requested/itsustainability-630x510.jpg new file mode 100644 index 000000000..cedd047f8 Binary files /dev/null and b/content/posts/2024/08/21/sustainable-software-engineering-input-requested/itsustainability-630x510.jpg differ diff --git a/content/posts/2024/08/21/sustainable-software-engineering-input-requested/itsustainability-630x510.png b/content/posts/2024/08/21/sustainable-software-engineering-input-requested/itsustainability-630x510.png deleted file mode 100644 index 823bd5dfb..000000000 Binary files a/content/posts/2024/08/21/sustainable-software-engineering-input-requested/itsustainability-630x510.png and /dev/null differ diff --git a/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/azul-downloads-arm-javafx-1024x813.jpg b/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/azul-downloads-arm-javafx-1024x813.jpg new file mode 100644 index 000000000..7b1fcffb4 Binary files /dev/null and b/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/azul-downloads-arm-javafx-1024x813.jpg differ diff --git a/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/azul-downloads-arm-javafx-1024x813.png b/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/azul-downloads-arm-javafx-1024x813.png deleted file mode 100644 index 4710b79b2..000000000 Binary files a/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/azul-downloads-arm-javafx-1024x813.png and /dev/null differ diff --git a/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/azul-downloads-arm-javafx.jpg b/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/azul-downloads-arm-javafx.jpg new file mode 100644 index 000000000..a86162256 Binary files /dev/null and b/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/azul-downloads-arm-javafx.jpg differ diff --git a/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/azul-downloads-arm-javafx.png b/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/azul-downloads-arm-javafx.png deleted file mode 100644 index 650552117..000000000 Binary files a/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/azul-downloads-arm-javafx.png and /dev/null differ diff --git a/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/index.md b/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/index.md index 630050c49..20d6c0c67 100644 --- a/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/index.md +++ b/content/posts/2024/08/22/running-javafx-applications-on-arm-with-azul-zulu/index.md @@ -6,7 +6,7 @@ description: "Since the April release of Azul Zulu Builds of OpenJDK, packages w canonical: "https://www.azul.com/blog/running-javafx-applications-on-arm-with-azul-zulu/" authors: - "frankdelporte" -image: "azul-downloads-arm-javafx.png" +image: "azul-downloads-arm-javafx.jpg" categories: - "Arm" - "Java Core" @@ -34,7 +34,7 @@ As [described in our documentation](https://docs.azul.com/core/install/debian), ### Downloading From Azul Downloads You can check the [available builds on the Azul Downloads page](https://www.azul.com/downloads/?os=linux&architecture=arm-64-bit&package=jdk-fx#zulu). Thanks to the search filters, it's very easy to find the correct download for, for instance, a Linux ARM system: -![](azul-downloads-arm-javafx-1024x813.png) +![](azul-downloads-arm-javafx-1024x813.jpg) ### Using SDKMAN diff --git a/content/posts/2024/08/26/debugging-kubernetes-troubleshooting-guide/index.md b/content/posts/2024/08/26/debugging-kubernetes-troubleshooting-guide/index.md index 1a5d789fc..947cdd636 100644 --- a/content/posts/2024/08/26/debugging-kubernetes-troubleshooting-guide/index.md +++ b/content/posts/2024/08/26/debugging-kubernetes-troubleshooting-guide/index.md @@ -162,7 +162,7 @@ Buildg lets us inspect container state at each stage of the build process to ide To install buildg follow the instructions on the [Buildg GitHub page](https://github.com/ktock/buildg). -![](https://github.com/ktock/buildg/raw/main/docs/images/vscode-dap.png) +![](vscode-dap-9d93542e.png) ## Conclusion diff --git a/content/posts/2024/08/26/debugging-kubernetes-troubleshooting-guide/vscode-dap-9d93542e.png b/content/posts/2024/08/26/debugging-kubernetes-troubleshooting-guide/vscode-dap-9d93542e.png new file mode 100644 index 000000000..8235d4bb0 Binary files /dev/null and b/content/posts/2024/08/26/debugging-kubernetes-troubleshooting-guide/vscode-dap-9d93542e.png differ diff --git a/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/index.md b/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/index.md index 447476149..ae4f1f05d 100644 --- a/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/index.md +++ b/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/index.md @@ -63,7 +63,7 @@ snyk code test This command will analyze your source code for vulnerabilities and provide a detailed report of any issues it finds. The Snyk CLI is versatile and can be used in several ways depending on your needs. For instance, if you want to scan your code each time you commit changes, you can integrate the CLI commands into your pre-commit hooks. Alternatively, you can include the CLI commands in your Continuous Integration/Continuous Deployment (CI/CD) pipelines to ensure your code is analyzed for vulnerabilities before it's deployed. -![blog-java-kotlin-snyk-cli-test](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1723566844%2Fblog-java-kotlin-snyk-cli-test.jpg&w=2560&q=75) +![blog-java-kotlin-snyk-cli-test](snyk-io-e43611f8.jpg) Remember, the earlier you find and fix security vulnerabilities, the safer your application will be. So why not start on your local machine before even committing the code? All you have to do is create a (free) Snyk account and install the Snyk CLI @@ -76,14 +76,14 @@ As a developer, your Integrated Development Environment (IDE) is your primary wo ### Snyk IntelliJ plugin The Snyk IntelliJ plugin is a powerful tool that provides real-time feedback on your Java code's security. Once you've installed the plugin, you can scan your project by right-clicking on it and selecting **Snyk** , then **Scan Project**. The plugin will then analyze your code and provide a list of potential vulnerabilities, their severity, and even suggestions for how to fix them. -![blog-java-kotlin-sql-injection](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1723566843%2Fblog-java-kotlin-sql-injection.jpg&w=2560&q=75) +![blog-java-kotlin-sql-injection](snyk-io-3f4663e3.jpg) In the above example, the Snyk IntelliJ plugin would detect that the SQL query is susceptible to SQL Injection attacks. ### Snyk VS Code plugin The Snyk VS Code plugin is another excellent tool for analyzing Java code for security vulnerabilities. To use it, you need to install the Snyk extension from the VS Code marketplace. Once installed, you can right-click on your project in the **Explorer** view and select **Scan with Snyk**. The plugin will then perform a detailed analysis of your Java and Kotlin code for any recognized security vulnerabilities, providing you with a list of issues and suggested remediation steps. -![blog-java-kotlin-xss](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1723566844%2Fblog-java-kotlin-xss.jpg&w=2560&q=75) +![blog-java-kotlin-xss](snyk-io-75b56b60.jpg) In the above example, the Snyk VS Code plugin would detect that the HTML output is vulnerable to cross-site scripting (XSS) attacks. @@ -92,7 +92,7 @@ By integrating Snyk into your IDE, you can ensure the security of your Java code ## Option 3: Connect your Git repository to Snyk and enable code scanning Connecting your Git repository to Snyk is a fundamental step in your journey to enhance Java code and application security. Thankfully, Snyk integrates seamlessly with popular source control repositories, including GitHub, GitLab, Azure Repo, and BitBucket. This integration allows your Java code to be continuously scanned for vulnerabilities, enhancing your application security. -![blog-java-kotlin-code-analysis](https://snyk.io/_next/image/?url=https%3A%2F%2Fres.cloudinary.com%2Fsnyk%2Fimage%2Fupload%2Fv1723566843%2Fblog-java-kotlin-code-analysis.jpg&w=2560&q=75) +![blog-java-kotlin-code-analysis](snyk-io-9c93ca01.jpg) With the above Java code snippet as an example, once your Git repository is linked to Snyk, Snyk Code will automatically analyze the code using Static Application Security Testing (SAST). This analysis detects security vulnerabilities, such as SQL injection, cross-site scripting (XSS), and insecure deserialization, among others, and displays them in the Snyk User Interface (UI). diff --git a/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/snyk-io-3f4663e3.jpg b/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/snyk-io-3f4663e3.jpg new file mode 100644 index 000000000..bfb32acc7 Binary files /dev/null and b/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/snyk-io-3f4663e3.jpg differ diff --git a/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/snyk-io-75b56b60.jpg b/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/snyk-io-75b56b60.jpg new file mode 100644 index 000000000..a5c0e2e9d Binary files /dev/null and b/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/snyk-io-75b56b60.jpg differ diff --git a/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/snyk-io-9c93ca01.jpg b/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/snyk-io-9c93ca01.jpg new file mode 100644 index 000000000..afdabcd14 Binary files /dev/null and b/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/snyk-io-9c93ca01.jpg differ diff --git a/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/snyk-io-e43611f8.jpg b/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/snyk-io-e43611f8.jpg new file mode 100644 index 000000000..a270ea04a Binary files /dev/null and b/content/posts/2024/08/30/four-easy-ways-to-analyze-your-java-and-kotlin-code-for-security-problems/snyk-io-e43611f8.jpg differ diff --git a/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/1-OViVway4sDw2tYTuEfriiQ-d5ebcd9c.png b/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/1-OViVway4sDw2tYTuEfriiQ-d5ebcd9c.png new file mode 100644 index 000000000..2ebc7cf52 Binary files /dev/null and b/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/1-OViVway4sDw2tYTuEfriiQ-d5ebcd9c.png differ diff --git a/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/1-RJdOontfwrBFbzak7B2VAQ-fb35b51b.png b/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/1-RJdOontfwrBFbzak7B2VAQ-fb35b51b.png new file mode 100644 index 000000000..c47c7da70 Binary files /dev/null and b/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/1-RJdOontfwrBFbzak7B2VAQ-fb35b51b.png differ diff --git a/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/1-YcY6m7k2T-2AD_ymmgYq1w-8df0123c.png b/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/1-YcY6m7k2T-2AD_ymmgYq1w-8df0123c.png new file mode 100644 index 000000000..f35c24f81 Binary files /dev/null and b/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/1-YcY6m7k2T-2AD_ymmgYq1w-8df0123c.png differ diff --git a/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/1-itY7Ter9yVO1vNPmLmSoFA-e99e98ac.png b/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/1-itY7Ter9yVO1vNPmLmSoFA-e99e98ac.png new file mode 100644 index 000000000..fe80c7c10 Binary files /dev/null and b/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/1-itY7Ter9yVO1vNPmLmSoFA-e99e98ac.png differ diff --git a/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/1-vITaeRHSieVNTBaRVNMnw-4c71353d.png b/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/1-vITaeRHSieVNTBaRVNMnw-4c71353d.png new file mode 100644 index 000000000..f08967fa4 Binary files /dev/null and b/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/1-vITaeRHSieVNTBaRVNMnw-4c71353d.png differ diff --git a/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/index.md b/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/index.md index 699ddb45d..fb6f814a7 100644 --- a/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/index.md +++ b/content/posts/2024/09/02/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/index.md @@ -28,7 +28,7 @@ In this article, we explore the tools available for profiling performance issues ## Understanding Various Aspects of Profiling Performance Issues Profiling a Spring Boot performance issue involves analyzing the application's runtime behavior to identify and diagnose inefficiencies, bottlenecks, and resource constraints. This includes **monitoring CPU** and **memory usage** , **thread activity** , **garbage collection** , and **database interactions**. Profiling tools collect data on method execution times, resource usage, and other performance metrics to help pinpoint the root causes of performance issues. -![How to profile a performance issue using Spring Boot profiling tools - 1*YcY6m7k2T 2AD ymmgYq1w](https://miro.medium.com/v2/resize:fit:720/format:webp/1*YcY6m7k2T-2AD_ymmgYq1w.png "How To Profile A Performance Issue Using Spring Boot Profiling Tools") +![How to profile a performance issue using Spring Boot profiling tools - 1*YcY6m7k2T 2AD ymmgYq1w](1-YcY6m7k2T-2AD_ymmgYq1w-8df0123c.png "How To Profile A Performance Issue Using Spring Boot Profiling Tools") Visualizing Spring Boot Performance Profiling Process @@ -224,7 +224,7 @@ Run your Spring Boot application and test the endpoints. You can use a tool like > Simulate high traffic using [Jmeter](https://jmeter.apache.org/usermanual/get-started.html). Use load testing tools like Apache JMeter, Gatling, or Locust to generate a high volume of requests to your endpoints. This will help us to generate insight into Digma. -![testing tools like Apache JMeter, Gatling, or Locust to generate a high volume of requests to your endpoints.](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*RJdOontfwrBFbzak7B2VAQ.png "How To Profile A Performance Issue Using Spring Boot Profiling Tools") +![testing tools like Apache JMeter, Gatling, or Locust to generate a high volume of requests to your endpoints.](1-RJdOontfwrBFbzak7B2VAQ-fb35b51b.png "How To Profile A Performance Issue Using Spring Boot Profiling Tools") Let's look at Digma's features for understanding performance issues and analyzing our application. @@ -234,7 +234,7 @@ The [duration](https://docs.digma.ai/digma-developer-guide/digma-features/analyt In observability, we can see all recent calls, and by clicking on calls we get to see the insights. -{{< img src="https://miro.medium.com/v2/resize:fit:720/format:webp/1*OViVway4sDw2tYTuEfriiQ.png" class="size-large is-resized" alt="Duration" >}} +{{< img src="1-OViVway4sDw2tYTuEfriiQ-d5ebcd9c.png" class="size-large is-resized" alt="Duration" >}} **Last Call Duration:** @@ -268,11 +268,11 @@ The [bottleneck](https://docs.digma.ai/digma-developer-guide/digma-features/insi By distinguishing between synchronous and asynchronous executions, it ensures that only blocking assets are marked as bottlenecks, allowing developers to focus on critical paths that directly impact user experience. We can add another method that simulates a more time-consuming process: -![How to profile a performance issue using Spring Boot profiling tools - 1* vITaeRHSieVNTBaRVNMnw](https://miro.medium.com/v2/resize:fit:720/format:webp/1*-vITaeRHSieVNTBaRVNMnw.png "How To Profile A Performance Issue Using Spring Boot Profiling Tools") +![How to profile a performance issue using Spring Boot profiling tools - 1* vITaeRHSieVNTBaRVNMnw](1-vITaeRHSieVNTBaRVNMnw-4c71353d.png "How To Profile A Performance Issue Using Spring Boot Profiling Tools") The bottleneck feature helps identify parts of your system that are causing delays by taking up a lot of processing time during a request. It points out which components are slowing things down and could potentially impact the overall performance of your application. -![How to profile a performance issue using Spring Boot profiling tools - 1*itY7Ter9yVO1vNPmLmSoFA](https://miro.medium.com/v2/resize:fit:700/1*itY7Ter9yVO1vNPmLmSoFA.png "How To Profile A Performance Issue Using Spring Boot Profiling Tools") +![How to profile a performance issue using Spring Boot profiling tools - 1*itY7Ter9yVO1vNPmLmSoFA](1-itY7Ter9yVO1vNPmLmSoFA-e99e98ac.png "How To Profile A Performance Issue Using Spring Boot Profiling Tools") **Performance Metrics:** diff --git a/content/posts/2024/09/02/javafx-links-of-august-2024/index.md b/content/posts/2024/09/02/javafx-links-of-august-2024/index.md index 209136f5a..200e8b866 100644 --- a/content/posts/2024/09/02/javafx-links-of-august-2024/index.md +++ b/content/posts/2024/09/02/javafx-links-of-august-2024/index.md @@ -6,7 +6,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of August 2024, canonical: "https://webtechie.be/post/2024-08-30-javafx-links-of-august-2024/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2024/09/02/javafx-links-of-august-2024/jfxcentral.jpg b/content/posts/2024/09/02/javafx-links-of-august-2024/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2024/09/02/javafx-links-of-august-2024/jfxcentral.jpg differ diff --git a/content/posts/2024/09/02/javafx-links-of-august-2024/jfxcentral.png b/content/posts/2024/09/02/javafx-links-of-august-2024/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2024/09/02/javafx-links-of-august-2024/jfxcentral.png and /dev/null differ diff --git a/content/posts/2024/09/05/updating-the-twelve-factor-app-methodology-a-call-for-participation/Screenshot-2024-08-29-at-13.07.44.jpg b/content/posts/2024/09/05/updating-the-twelve-factor-app-methodology-a-call-for-participation/Screenshot-2024-08-29-at-13.07.44.jpg new file mode 100644 index 000000000..9c2bc0e59 Binary files /dev/null and b/content/posts/2024/09/05/updating-the-twelve-factor-app-methodology-a-call-for-participation/Screenshot-2024-08-29-at-13.07.44.jpg differ diff --git a/content/posts/2024/09/05/updating-the-twelve-factor-app-methodology-a-call-for-participation/Screenshot-2024-08-29-at-13.07.44.png b/content/posts/2024/09/05/updating-the-twelve-factor-app-methodology-a-call-for-participation/Screenshot-2024-08-29-at-13.07.44.png deleted file mode 100644 index fc6857f52..000000000 Binary files a/content/posts/2024/09/05/updating-the-twelve-factor-app-methodology-a-call-for-participation/Screenshot-2024-08-29-at-13.07.44.png and /dev/null differ diff --git a/content/posts/2024/09/05/updating-the-twelve-factor-app-methodology-a-call-for-participation/index.md b/content/posts/2024/09/05/updating-the-twelve-factor-app-methodology-a-call-for-participation/index.md index 9dd598d41..dfd6c011b 100644 --- a/content/posts/2024/09/05/updating-the-twelve-factor-app-methodology-a-call-for-participation/index.md +++ b/content/posts/2024/09/05/updating-the-twelve-factor-app-methodology-a-call-for-participation/index.md @@ -5,7 +5,7 @@ lastmod: "2024-09-05T07:44:56+00:00" description: "The 12 factor app methodology is being updated and we need your help with it! Contribute your ideas and help us modernize 12-Factor." authors: - "grace-jansen" -image: "Screenshot-2024-08-29-at-13.07.44.png" +image: "Screenshot-2024-08-29-at-13.07.44.jpg" categories: - "Cloud" - "Tools" diff --git a/content/posts/2024/09/11/a-fresh-look-at-embedded-java/azul-downloads-embedded-screenshot.jpg b/content/posts/2024/09/11/a-fresh-look-at-embedded-java/azul-downloads-embedded-screenshot.jpg new file mode 100644 index 000000000..3cdd6d2ce Binary files /dev/null and b/content/posts/2024/09/11/a-fresh-look-at-embedded-java/azul-downloads-embedded-screenshot.jpg differ diff --git a/content/posts/2024/09/11/a-fresh-look-at-embedded-java/azul-downloads-embedded-screenshot.png b/content/posts/2024/09/11/a-fresh-look-at-embedded-java/azul-downloads-embedded-screenshot.png deleted file mode 100644 index 8672e5a88..000000000 Binary files a/content/posts/2024/09/11/a-fresh-look-at-embedded-java/azul-downloads-embedded-screenshot.png and /dev/null differ diff --git a/content/posts/2024/09/11/a-fresh-look-at-embedded-java/index.md b/content/posts/2024/09/11/a-fresh-look-at-embedded-java/index.md index d1f7b9465..4890b4e07 100644 --- a/content/posts/2024/09/11/a-fresh-look-at-embedded-java/index.md +++ b/content/posts/2024/09/11/a-fresh-look-at-embedded-java/index.md @@ -36,7 +36,7 @@ Java is used on embedded platforms for in-car infotainment and information displ An essential but not well-known fact is the energy efficiency Java delivers compared to other programming languages. This is another important fact in today's economy, where ecological and energy costs become increasingly critical. According to the study [Energy Efficiency across Programming Languages: How does Energy, Time and Memory Relate?](https://sites.google.com/view/energy-efficiency-languages/results#h.p_nggWE5Z-iDZ0), Java is, for example, up to 38 times more energy-efficient than Python! With modern, powerful systems based on ARMv7 or newer, the exact same Java runtime used in big cloud environments or on powerful machines runs just as smoothly on the smallest Linux systems. Azul provides builds of OpenJDK for various platforms, as you can see on the [download page](https://www.azul.com/downloads/?package=jdk#zulu). If your system is not on the list of downloads, you can contact Azul as they have other builds available for customers who are not listed on the free download page. -![](azul-downloads-embedded-screenshot.png) +![](azul-downloads-embedded-screenshot.jpg) ## Use cases for Java on Embedded diff --git a/content/posts/2024/09/17/java-23-has-arrived-and-it-brings-a-truckload-of-changes/Object-hashcode-diff-3-3231dc18.jpg b/content/posts/2024/09/17/java-23-has-arrived-and-it-brings-a-truckload-of-changes/Object-hashcode-diff-3-3231dc18.jpg new file mode 100644 index 000000000..5c6682198 Binary files /dev/null and b/content/posts/2024/09/17/java-23-has-arrived-and-it-brings-a-truckload-of-changes/Object-hashcode-diff-3-3231dc18.jpg differ diff --git a/content/posts/2024/09/17/java-23-has-arrived-and-it-brings-a-truckload-of-changes/index.md b/content/posts/2024/09/17/java-23-has-arrived-and-it-brings-a-truckload-of-changes/index.md index 748529c7a..d021a7a8e 100644 --- a/content/posts/2024/09/17/java-23-has-arrived-and-it-brings-a-truckload-of-changes/index.md +++ b/content/posts/2024/09/17/java-23-has-arrived-and-it-brings-a-truckload-of-changes/index.md @@ -1133,7 +1133,7 @@ Markdown documentation comments use the `///` prefix instead of the familiar `/* #### Example of the Differences To illustrate how documentation comments can change now that Markdown is supported, here's an example diff screenshot from the JEP: -![Differences between regular documentation comment and Markdown documentation comment](https://cr.openjdk.org/~jjg/Object-hashcode-diff-3.png) +![Differences between regular documentation comment and Markdown documentation comment](Object-hashcode-diff-3-3231dc18.jpg) #### Syntax diff --git a/content/posts/2024/09/30/javafx-links-of-september-2024/index.md b/content/posts/2024/09/30/javafx-links-of-september-2024/index.md index 3c77957c3..7cfb62816 100644 --- a/content/posts/2024/09/30/javafx-links-of-september-2024/index.md +++ b/content/posts/2024/09/30/javafx-links-of-september-2024/index.md @@ -6,7 +6,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of September 20 canonical: "https://webtechie.be/post/2024-09-27-javafx-links-of-september-2024/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2024/09/30/javafx-links-of-september-2024/jfxcentral.jpg b/content/posts/2024/09/30/javafx-links-of-september-2024/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2024/09/30/javafx-links-of-september-2024/jfxcentral.jpg differ diff --git a/content/posts/2024/09/30/javafx-links-of-september-2024/jfxcentral.png b/content/posts/2024/09/30/javafx-links-of-september-2024/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2024/09/30/javafx-links-of-september-2024/jfxcentral.png and /dev/null differ diff --git a/content/posts/2024/10/01/sql-best-practices-every-java-engineer-must-know/1.jpg b/content/posts/2024/10/01/sql-best-practices-every-java-engineer-must-know/1.jpg new file mode 100644 index 000000000..32d105bb2 Binary files /dev/null and b/content/posts/2024/10/01/sql-best-practices-every-java-engineer-must-know/1.jpg differ diff --git a/content/posts/2024/10/01/sql-best-practices-every-java-engineer-must-know/1.png b/content/posts/2024/10/01/sql-best-practices-every-java-engineer-must-know/1.png deleted file mode 100644 index 5e9bcc2a2..000000000 Binary files a/content/posts/2024/10/01/sql-best-practices-every-java-engineer-must-know/1.png and /dev/null differ diff --git a/content/posts/2024/10/01/sql-best-practices-every-java-engineer-must-know/index.md b/content/posts/2024/10/01/sql-best-practices-every-java-engineer-must-know/index.md index 9929cca3e..013abac7b 100644 --- a/content/posts/2024/10/01/sql-best-practices-every-java-engineer-must-know/index.md +++ b/content/posts/2024/10/01/sql-best-practices-every-java-engineer-must-know/index.md @@ -5,7 +5,7 @@ lastmod: "2024-10-09T09:33:23+00:00" description: "This comprehensive guide dives into the best practices for SQL query optimization, tailored specifically for Java engineers." authors: - "abo-saad-muaath" -image: "1.png" +image: "1.jpg" categories: - "Databases" - "Java" diff --git a/content/posts/2024/10/08/unleashing-the-power-of-git-bisect/index.md b/content/posts/2024/10/08/unleashing-the-power-of-git-bisect/index.md index 1e31545cf..6215ea890 100644 --- a/content/posts/2024/10/08/unleashing-the-power-of-git-bisect/index.md +++ b/content/posts/2024/10/08/unleashing-the-power-of-git-bisect/index.md @@ -108,7 +108,7 @@ Notice that bisect isn't linear. Bisect doesn't scan through the revisions in a This is where the non-linear, binary search pattern starts, as Git divides the search space in half instead of examining each commit sequentially. This means fewer revisions get scanned and the process is faster. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rf7xc1qn53lztck18jue.png) +![Image description](rf7xc1qn53lztck18jue-748ea13c.png) ## Advanced Usage and Tips diff --git a/content/posts/2024/10/08/unleashing-the-power-of-git-bisect/rf7xc1qn53lztck18jue-748ea13c.png b/content/posts/2024/10/08/unleashing-the-power-of-git-bisect/rf7xc1qn53lztck18jue-748ea13c.png new file mode 100644 index 000000000..b3924747e Binary files /dev/null and b/content/posts/2024/10/08/unleashing-the-power-of-git-bisect/rf7xc1qn53lztck18jue-748ea13c.png differ diff --git a/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/attach-dark-b9dd5106.png b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/attach-dark-b9dd5106.png new file mode 100644 index 000000000..dd2c4f43b Binary files /dev/null and b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/attach-dark-b9dd5106.png differ diff --git a/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/banner-941a31d0.jpg b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/banner-941a31d0.jpg new file mode 100644 index 000000000..00bec6e62 Binary files /dev/null and b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/banner-941a31d0.jpg differ diff --git a/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/flame-graph-dark-5c53ce64.png b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/flame-graph-dark-5c53ce64.png new file mode 100644 index 000000000..eb0624ad1 Binary files /dev/null and b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/flame-graph-dark-5c53ce64.png differ diff --git a/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/go-to-test-dark-23595b75.png b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/go-to-test-dark-23595b75.png new file mode 100644 index 000000000..fe88d2a63 Binary files /dev/null and b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/go-to-test-dark-23595b75.png differ diff --git a/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/index.md b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/index.md index 02614cbbe..b4dbe9b78 100644 --- a/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/index.md +++ b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/index.md @@ -6,7 +6,7 @@ description: "Analyzing a curious bottleneck in IntelliJ IDEA using the built-in canonical: "https://flounder.dev/posts/profile-idea-with-idea/" authors: - "igor-kulakov" -image: "selfprofilingin.png" +image: "selfprofilingin.jpg" categories: - "Debugging" - "IntelliJ IDEA" @@ -27,13 +27,13 @@ This might be useful if you are writing an [IntelliJ IDEA plugin](https://plugin Also, regardless of whether you are a plugin author, the described case might be interesting to you because the profiling strategy that I'll cover is not exclusive to IntelliJ IDEA – you can use it to troubleshoot similar bottlenecks in other types of projects and using other tools. -{{< img src="https://flounder.dev/img/profile-idea-with-idea/banner.png" class="size-medium" alt="Self-profiling IntelliJ IDEA – post banner" width="2400" height="1260" >}} +{{< img src="banner-941a31d0.jpg" class="size-medium" alt="Self-profiling IntelliJ IDEA – post banner" width="2400" height="1260" >}} ## The problem In this post, we'll look at a rather interesting performance bottleneck I stumbled upon a couple of years ago. While working on a side project in IntelliJ IDEA, I noticed that finding tests (**Navigate** \| **Test** ) for classes with certain short names, such as `A`, was surprisingly slow, often taking 2 minutes or longer. -![A dialog saying 'Searching for tests for class...'](https://flounder.dev/img/profile-idea-with-idea/go-to-test-dark.png) +![A dialog saying 'Searching for tests for class...'](go-to-test-dark-23595b75.png) The presence of the bottleneck didn't seem to depend on the size of the project – even in projects consisting of a single class named `A`, the navigation would still take very long. I have never experienced delays related to this feature even in the huge IntelliJ IDEA monorepo, so the slowdown in an almost empty project seemed especially curious. @@ -68,7 +68,7 @@ For this, go to the **Profiler** tool window and find the corresponding process All these tools are covered in the [documentation](https://www.jetbrains.com/help/idea/profiler-intro.html), and in this post we will focus specifically on the profiler. -![Clicking on the process in the 'Profiler' tool window reveals a menu with the 'Attach IntelliJ Profiler' option](https://flounder.dev/img/profile-idea-with-idea/attach-dark.png) +![Clicking on the process in the 'Profiler' tool window reveals a menu with the 'Attach IntelliJ Profiler' option](attach-dark-b9dd5106.png) We need to attach the profiler *before* the problem happens. For example, if the problem arises as the result of calling some API, attach the profiler to the process first, then reproduce the events that cause the problem. @@ -82,21 +82,21 @@ To analyze the snapshots, you have several [views](https://www.jetbrains.com/hel For the problem at hand, let's start with the **Timeline** view to see if we can spot anything unusual: -![The 'Timeline' tab in the 'Profiler' tool window has a lot of green bars in one of the threads](https://flounder.dev/img/profile-idea-with-idea/timeline-dark.png) +![The 'Timeline' tab in the 'Profiler' tool window has a lot of green bars in one of the threads](timeline-dark-99fb3057.png) Indeed, the timeline indicates that one of the threads was extraordinarily busy. The green bars correspond to the samples collected for a particular thread. By clicking any of these bars, we can see the corresponding stack trace for the sample. -![Clicking a colored bar shows the stack trace in the right-hand side of the tool window](https://flounder.dev/img/profile-idea-with-idea/timeline-with-stack-trace-dark.png) +![Clicking a colored bar shows the stack trace in the right-hand side of the tool window](timeline-with-stack-trace-dark-20dd72fb.png) The stack traces from individual samples suggest that the thread's activity is associated with finding tests. However, we still don't see the big picture. Let's navigate to the busy thread on the flame graph: -![Flame graph with two highlighted methods that occupy almost the entire graph's width](https://flounder.dev/img/profile-idea-with-idea/flame-graph-dark.png) +![Flame graph with two highlighted methods that occupy almost the entire graph's width](flame-graph-dark-5c53ce64.png) The methods that might be of interest to us, `JavaTestFinder.findTestsForClass()` and `KotlinTestFinder.findTestsForClass()`, are right at the bottom of the graph. We don't take into account the folded methods below them, as they don't have significant self-time or branching. They control flow rather than perform intense computations. To verify whether these methods are indeed related to the slowdown, we can profile a non-problematic case: search for tests for a class with a more realistic name, for example, `ClassWithALongerName`. Then, we'll see what happens to these methods using the [diff view](https://flounder.dev/posts/get-started-with-profiling/#snapshots-diff). -![Method list tab with 'findTestsForClass' query shows the corresponding methods with 93-95% difference](https://flounder.dev/img/profile-idea-with-idea/method-list-diff-dark.png) +![Method list tab with 'findTestsForClass' query shows the corresponding methods with 93-95% difference](method-list-diff-dark-7d1e9754.png) The newer snapshot contains 93-95% fewer samples with `JavaTestFinder.findTestsForClass()` and `KotlinTestFinder.findTestsForClass()`. The runtime of the other methods doesn't differ that much. It seems like we are going in the right direction. @@ -123,11 +123,11 @@ The code is filtering the short names that are currently in the cache using a re By [logging](https://flounder.dev/posts/logpoints-tricks/#logging-breakpoints) the class names after the condition, we get all the classes that pass it. -![Breakpoints dialog with the following condition: "Searching for class:" + eachName and the Suspend checkbox cleared](https://flounder.dev/img/profile-idea-with-idea/logging-breakpoint-dark.png) +![Breakpoints dialog with the following condition: "Searching for class:" + eachName and the Suspend checkbox cleared](logging-breakpoint-dark-c4255f79.png) When I executed the program, it logged about 25000 classes, a surprisingly large number for an empty project! -![Console displays lots of lines saying Searching for class: followed by a class name](https://flounder.dev/img/profile-idea-with-idea/log-classes-dark.png) +![Console displays lots of lines saying Searching for class: followed by a class name](log-classes-dark-c421227e.png) The logged class names are clearly coming from somewhere else, not my 'Hello World' project. The mystery is solved: IntelliJ IDEA takes so long to find tests for class `A`, because it checks *all* the cached classes, including dependencies, JDKs, and even classes from other projects. Too many of them pass the filter because they [all have](https://en.wikipedia.org/wiki/Letter_frequency) the letter `A` in their names. With longer and more realistic class names, this inefficiency would have remained unnoticed, just because most of these names would have been filtered out by the regex. diff --git a/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/log-classes-dark-c421227e.png b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/log-classes-dark-c421227e.png new file mode 100644 index 000000000..6bdf37b08 Binary files /dev/null and b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/log-classes-dark-c421227e.png differ diff --git a/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/logging-breakpoint-dark-c4255f79.png b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/logging-breakpoint-dark-c4255f79.png new file mode 100644 index 000000000..3c24ffe71 Binary files /dev/null and b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/logging-breakpoint-dark-c4255f79.png differ diff --git a/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/method-list-diff-dark-7d1e9754.png b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/method-list-diff-dark-7d1e9754.png new file mode 100644 index 000000000..209a0817a Binary files /dev/null and b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/method-list-diff-dark-7d1e9754.png differ diff --git a/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/selfprofilingin.jpg b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/selfprofilingin.jpg new file mode 100644 index 000000000..2a390d564 Binary files /dev/null and b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/selfprofilingin.jpg differ diff --git a/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/selfprofilingin.png b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/selfprofilingin.png deleted file mode 100644 index 1617f1d30..000000000 Binary files a/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/selfprofilingin.png and /dev/null differ diff --git a/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/timeline-dark-99fb3057.png b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/timeline-dark-99fb3057.png new file mode 100644 index 000000000..f63a980e5 Binary files /dev/null and b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/timeline-dark-99fb3057.png differ diff --git a/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/timeline-with-stack-trace-dark-20dd72fb.png b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/timeline-with-stack-trace-dark-20dd72fb.png new file mode 100644 index 000000000..f4bf6c830 Binary files /dev/null and b/content/posts/2024/10/16/profile-intellij-idea-with-its-own-profiler/timeline-with-stack-trace-dark-20dd72fb.png differ diff --git a/content/posts/2024/10/18/book-review-mastering-the-java-virtual-machine/1-Imp1YF-K_d6Ytwc43qfHIg-cb13e038.jpeg b/content/posts/2024/10/18/book-review-mastering-the-java-virtual-machine/1-Imp1YF-K_d6Ytwc43qfHIg-cb13e038.jpeg new file mode 100644 index 000000000..019ce375e Binary files /dev/null and b/content/posts/2024/10/18/book-review-mastering-the-java-virtual-machine/1-Imp1YF-K_d6Ytwc43qfHIg-cb13e038.jpeg differ diff --git a/content/posts/2024/10/18/book-review-mastering-the-java-virtual-machine/index.md b/content/posts/2024/10/18/book-review-mastering-the-java-virtual-machine/index.md index f41b43564..2a8551970 100644 --- a/content/posts/2024/10/18/book-review-mastering-the-java-virtual-machine/index.md +++ b/content/posts/2024/10/18/book-review-mastering-the-java-virtual-machine/index.md @@ -5,7 +5,7 @@ lastmod: "2024-10-18T13:54:50+00:00" description: "Discover the bleak of beauty of Java Virtual Machine (JVM) which provides greater insights for Java Developers, packed with intriguing topics." authors: - "mahendra1413" -image: "mastering.png" +image: "mastering.jpg" categories: - "Book Review" - "Books" @@ -40,7 +40,7 @@ As we explore the details of **"Mastering the Java Virtual Machine"** in this re Author: Otávio Santana Genre: Technical Fiction* -{{< img src="https://miro.medium.com/v2/resize:fit:640/format:webp/1*Imp1YF-K_d6Ytwc43qfHIg.jpeg" class="size-medium" alt="Mastering the Java Virtual Machine" width="396" height="510" >}} +{{< img src="1-Imp1YF-K_d6Ytwc43qfHIg-cb13e038.jpeg" class="size-medium" alt="Mastering the Java Virtual Machine" width="396" height="510" >}} Mastering the Java Virtual Machine diff --git a/content/posts/2024/10/18/book-review-mastering-the-java-virtual-machine/mastering.jpg b/content/posts/2024/10/18/book-review-mastering-the-java-virtual-machine/mastering.jpg new file mode 100644 index 000000000..a166eb8eb Binary files /dev/null and b/content/posts/2024/10/18/book-review-mastering-the-java-virtual-machine/mastering.jpg differ diff --git a/content/posts/2024/10/18/book-review-mastering-the-java-virtual-machine/mastering.png b/content/posts/2024/10/18/book-review-mastering-the-java-virtual-machine/mastering.png deleted file mode 100644 index 85a3921fb..000000000 Binary files a/content/posts/2024/10/18/book-review-mastering-the-java-virtual-machine/mastering.png and /dev/null differ diff --git a/content/posts/2024/10/25/the-art-of-full-stack-debugging/0elcqadckt63igxjlzso-ff9406d5.jpg b/content/posts/2024/10/25/the-art-of-full-stack-debugging/0elcqadckt63igxjlzso-ff9406d5.jpg new file mode 100644 index 000000000..959f1a4c1 Binary files /dev/null and b/content/posts/2024/10/25/the-art-of-full-stack-debugging/0elcqadckt63igxjlzso-ff9406d5.jpg differ diff --git a/content/posts/2024/10/25/the-art-of-full-stack-debugging/3l1ixd5iuyunrvh9ru15-2799b443.jpg b/content/posts/2024/10/25/the-art-of-full-stack-debugging/3l1ixd5iuyunrvh9ru15-2799b443.jpg new file mode 100644 index 000000000..af1965684 Binary files /dev/null and b/content/posts/2024/10/25/the-art-of-full-stack-debugging/3l1ixd5iuyunrvh9ru15-2799b443.jpg differ diff --git a/content/posts/2024/10/25/the-art-of-full-stack-debugging/egm0deq97u05j8tr1ikj-2cf09d6e.jpg b/content/posts/2024/10/25/the-art-of-full-stack-debugging/egm0deq97u05j8tr1ikj-2cf09d6e.jpg new file mode 100644 index 000000000..80c25fc40 Binary files /dev/null and b/content/posts/2024/10/25/the-art-of-full-stack-debugging/egm0deq97u05j8tr1ikj-2cf09d6e.jpg differ diff --git a/content/posts/2024/10/25/the-art-of-full-stack-debugging/index.md b/content/posts/2024/10/25/the-art-of-full-stack-debugging/index.md index dd58917e7..bd67614d9 100644 --- a/content/posts/2024/10/25/the-art-of-full-stack-debugging/index.md +++ b/content/posts/2024/10/25/the-art-of-full-stack-debugging/index.md @@ -67,15 +67,15 @@ The debugger allows developers to set breakpoints, step through code, and inspec We can launch the browser tools on Firefox using this menu: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/egm0deq97u05j8tr1ikj.png) +![Image description](egm0deq97u05j8tr1ikj-2cf09d6e.jpg) On Chrome we can use this option: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lsi1y1om76prwf8gdob4.png) +![Image description](lsi1y1om76prwf8gdob4-3ef943ce.jpg) I prefer working with Firefox, I find their developer tools more convenient but both browsers have similar capabilities. Both have fantastic debuggers (as you can see with the Firefox debugger below), unfortunately many developers limit themselves to console printing instead of exploring this powerful tool. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0elcqadckt63igxjlzso.png) +![Image description](0elcqadckt63igxjlzso-ff9406d5.jpg) ### Tackling Code Obfuscation @@ -91,7 +91,7 @@ You can use code like this in the JavaScript file to point at the sourcemap file For this to work in Chrome we need to ensure that "Enable JavaScript source maps" is checked in the settings. Last I checked it was on by default but it doesn't hurt to verify: -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3l1ixd5iuyunrvh9ru15.png) +![Image description](3l1ixd5iuyunrvh9ru15-2799b443.jpg) ## Debugging Across Layers diff --git a/content/posts/2024/10/25/the-art-of-full-stack-debugging/lsi1y1om76prwf8gdob4-3ef943ce.jpg b/content/posts/2024/10/25/the-art-of-full-stack-debugging/lsi1y1om76prwf8gdob4-3ef943ce.jpg new file mode 100644 index 000000000..fb851a909 Binary files /dev/null and b/content/posts/2024/10/25/the-art-of-full-stack-debugging/lsi1y1om76prwf8gdob4-3ef943ce.jpg differ diff --git a/content/posts/2024/10/28/javafx-links-of-october-2024/index.md b/content/posts/2024/10/28/javafx-links-of-october-2024/index.md index e5f902c4d..530c9e4c5 100644 --- a/content/posts/2024/10/28/javafx-links-of-october-2024/index.md +++ b/content/posts/2024/10/28/javafx-links-of-october-2024/index.md @@ -6,7 +6,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of October 2024 canonical: "https://webtechie.be/post/2024-10-28-javafx-links-of-october-2024/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2024/10/28/javafx-links-of-october-2024/jfxcentral.jpg b/content/posts/2024/10/28/javafx-links-of-october-2024/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2024/10/28/javafx-links-of-october-2024/jfxcentral.jpg differ diff --git a/content/posts/2024/10/28/javafx-links-of-october-2024/jfxcentral.png b/content/posts/2024/10/28/javafx-links-of-october-2024/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2024/10/28/javafx-links-of-october-2024/jfxcentral.png and /dev/null differ diff --git a/content/posts/2024/10/31/exploring-new-features-in-jdk-23-module-design-pattern-with-jep-476/index.md b/content/posts/2024/10/31/exploring-new-features-in-jdk-23-module-design-pattern-with-jep-476/index.md index 8da36c771..47bdb5cda 100644 --- a/content/posts/2024/10/31/exploring-new-features-in-jdk-23-module-design-pattern-with-jep-476/index.md +++ b/content/posts/2024/10/31/exploring-new-features-in-jdk-23-module-design-pattern-with-jep-476/index.md @@ -5,7 +5,7 @@ lastmod: "2024-10-31T09:41:21+00:00" description: "JEP-476 is another great example of Java platform evolution while enabling internal project stability, transparency and security." authors: - "miro-wengner" -image: "jep476.png" +image: "jep476.jpg" categories: - "Java" - "Java Beginner" diff --git a/content/posts/2024/10/31/exploring-new-features-in-jdk-23-module-design-pattern-with-jep-476/jep476.jpg b/content/posts/2024/10/31/exploring-new-features-in-jdk-23-module-design-pattern-with-jep-476/jep476.jpg new file mode 100644 index 000000000..a691cc96a Binary files /dev/null and b/content/posts/2024/10/31/exploring-new-features-in-jdk-23-module-design-pattern-with-jep-476/jep476.jpg differ diff --git a/content/posts/2024/10/31/exploring-new-features-in-jdk-23-module-design-pattern-with-jep-476/jep476.png b/content/posts/2024/10/31/exploring-new-features-in-jdk-23-module-design-pattern-with-jep-476/jep476.png deleted file mode 100644 index 496e1eb95..000000000 Binary files a/content/posts/2024/10/31/exploring-new-features-in-jdk-23-module-design-pattern-with-jep-476/jep476.png and /dev/null differ diff --git a/content/posts/2024/11/03/how-we-almost-missed-a-plane-in-kazakhstan-but-openjdk-could-have-saved-us/commit-change.jpg b/content/posts/2024/11/03/how-we-almost-missed-a-plane-in-kazakhstan-but-openjdk-could-have-saved-us/commit-change.jpg new file mode 100644 index 000000000..5ac8ee708 Binary files /dev/null and b/content/posts/2024/11/03/how-we-almost-missed-a-plane-in-kazakhstan-but-openjdk-could-have-saved-us/commit-change.jpg differ diff --git a/content/posts/2024/11/03/how-we-almost-missed-a-plane-in-kazakhstan-but-openjdk-could-have-saved-us/commit-change.png b/content/posts/2024/11/03/how-we-almost-missed-a-plane-in-kazakhstan-but-openjdk-could-have-saved-us/commit-change.png deleted file mode 100644 index 4880c6d93..000000000 Binary files a/content/posts/2024/11/03/how-we-almost-missed-a-plane-in-kazakhstan-but-openjdk-could-have-saved-us/commit-change.png and /dev/null differ diff --git a/content/posts/2024/11/03/how-we-almost-missed-a-plane-in-kazakhstan-but-openjdk-could-have-saved-us/index.md b/content/posts/2024/11/03/how-we-almost-missed-a-plane-in-kazakhstan-but-openjdk-could-have-saved-us/index.md index 7f974e49e..5e2027e5e 100644 --- a/content/posts/2024/11/03/how-we-almost-missed-a-plane-in-kazakhstan-but-openjdk-could-have-saved-us/index.md +++ b/content/posts/2024/11/03/how-we-almost-missed-a-plane-in-kazakhstan-but-openjdk-could-have-saved-us/index.md @@ -40,7 +40,7 @@ But why am I telling this story here on a technical, Java blog? Because we almos In 2023, I wrote the blog post "[Time Zone and Currency Database in JDK](https://www.azul.com/blog/time-zone-and-currency-database-in-jdk/)" for the Azul website. In that post, I explained how the OpenJDK sources contain a full database with information and the full history of timezones, daylight savings, and currencies. I even gave the example of the change in January 2023 with the currency of Croatia changing from the Kuna to the Euro. Apparently, something similar happened when [IANA database 2024a](https://www.iana.org/time-zones) got integrated into OpenJDK with JDK-8325150: "(tz) Update Timezone Data to 2024a". That ticket contains several changes, including: "Kazakhstan unifies on UTC+5 beginning 2024-03-01." Indeed, Kazakhstan changed their timezone on March 1st of this year! You can find the [changed data here](https://github.com/openjdk/jdk/blame/master/src/java.base/share/data/tzdata/asia#L2507), modified by [commit 917838e](https://github.com/openjdk/jdk/commit/917838e0a564b1f2cbfb6cc214ccbfd1a237019f). -![](commit-change.png) +![](commit-change.jpg) Because we wanted to be sure of a good price for our plane tickets, we bought them well in advance, in January. For our flight back, we had a departure time of **05:20** . But because of the time zone change, that flight actually departed at **04:20**, an hour earlier. Because of delays, we didn't notice that change in the arriving flight... diff --git a/content/posts/2024/11/05/front-end-debugging-part-1-not-just-console-log/g7ojrpu5d225e69qoc46-5b9f8052.png b/content/posts/2024/11/05/front-end-debugging-part-1-not-just-console-log/g7ojrpu5d225e69qoc46-5b9f8052.png new file mode 100644 index 000000000..b22508274 Binary files /dev/null and b/content/posts/2024/11/05/front-end-debugging-part-1-not-just-console-log/g7ojrpu5d225e69qoc46-5b9f8052.png differ diff --git a/content/posts/2024/11/05/front-end-debugging-part-1-not-just-console-log/index.md b/content/posts/2024/11/05/front-end-debugging-part-1-not-just-console-log/index.md index 7318e7bff..17748e7d2 100644 --- a/content/posts/2024/11/05/front-end-debugging-part-1-not-just-console-log/index.md +++ b/content/posts/2024/11/05/front-end-debugging-part-1-not-just-console-log/index.md @@ -63,7 +63,7 @@ DOM breakpoints are an advanced feature in Chrome and Firebug (Firefox plugin) t To use it we can right-click on the desired DOM element, select "Break On," and choose the specific mutation type you are interested in (e.g., subtree modifications, attribute changes, etc.). -![Subtree modification](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tnhcf65djlyctm44fjxr.png) +![Subtree modification](tnhcf65djlyctm44fjxr-a488419f.jpg) DOM breakpoints are extremely powerful for tracking down issues where DOM manipulation causes unexpected results, such as dynamic content loading or changes in the user interface that disrupt the intended layout or functionality. Think of them like field breakpoints we discussed in the past. @@ -73,7 +73,7 @@ These breakpoints complement traditional line and conditional breakpoints, provi Understanding who initiates specific network requests can be challenging, especially in large applications with multiple sources contributing to a request. XHR (`XMLHttpRequest`) breakpoints provide a solution to this problem. -![XHR Breakpoint](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g7ojrpu5d225e69qoc46.png) +![XHR Breakpoint](g7ojrpu5d225e69qoc46-5b9f8052.png) In Chrome or Firebug, set an XHR breakpoint by specifying a substring of the URI you wish to monitor. When a request matching this pattern is made, the execution stops, allowing you to investigate the source of the request. @@ -95,7 +95,7 @@ These are things that are normally very difficult to reproduce. E.g. touch relat CSS and HTML bugs can be particularly tricky, often requiring a detailed examination of how elements are rendered and styled. -![Inspect element](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n1u9cdoost95glyce2it.png) +![Inspect element](n1u9cdoost95glyce2it-53cc5aaa.jpg) **Inspect Element:** The "inspect element" tool is the cornerstone of front-end debugging, allowing you to view and manipulate the DOM and CSS in real-time. As you make changes, the page updates instantly, providing immediate feedback on your tweaks. diff --git a/content/posts/2024/11/05/front-end-debugging-part-1-not-just-console-log/n1u9cdoost95glyce2it-53cc5aaa.jpg b/content/posts/2024/11/05/front-end-debugging-part-1-not-just-console-log/n1u9cdoost95glyce2it-53cc5aaa.jpg new file mode 100644 index 000000000..d872afcf5 Binary files /dev/null and b/content/posts/2024/11/05/front-end-debugging-part-1-not-just-console-log/n1u9cdoost95glyce2it-53cc5aaa.jpg differ diff --git a/content/posts/2024/11/05/front-end-debugging-part-1-not-just-console-log/tnhcf65djlyctm44fjxr-a488419f.jpg b/content/posts/2024/11/05/front-end-debugging-part-1-not-just-console-log/tnhcf65djlyctm44fjxr-a488419f.jpg new file mode 100644 index 000000000..5ca6d3429 Binary files /dev/null and b/content/posts/2024/11/05/front-end-debugging-part-1-not-just-console-log/tnhcf65djlyctm44fjxr-a488419f.jpg differ diff --git a/content/posts/2024/11/12/foojay-io-at-jfall-2024-and-the-winner-is/digmafoojay-1024x697.jpg b/content/posts/2024/11/12/foojay-io-at-jfall-2024-and-the-winner-is/digmafoojay-1024x697.jpg new file mode 100644 index 000000000..f1a59ba47 Binary files /dev/null and b/content/posts/2024/11/12/foojay-io-at-jfall-2024-and-the-winner-is/digmafoojay-1024x697.jpg differ diff --git a/content/posts/2024/11/12/foojay-io-at-jfall-2024-and-the-winner-is/digmafoojay-1024x697.png b/content/posts/2024/11/12/foojay-io-at-jfall-2024-and-the-winner-is/digmafoojay-1024x697.png deleted file mode 100644 index 206ef4af6..000000000 Binary files a/content/posts/2024/11/12/foojay-io-at-jfall-2024-and-the-winner-is/digmafoojay-1024x697.png and /dev/null differ diff --git a/content/posts/2024/11/12/foojay-io-at-jfall-2024-and-the-winner-is/index.md b/content/posts/2024/11/12/foojay-io-at-jfall-2024-and-the-winner-is/index.md index 1cb558789..9eb9699b5 100644 --- a/content/posts/2024/11/12/foojay-io-at-jfall-2024-and-the-winner-is/index.md +++ b/content/posts/2024/11/12/foojay-io-at-jfall-2024-and-the-winner-is/index.md @@ -26,7 +26,7 @@ You can find all the interviews [in this YouTube playlist](https://www.youtube.c {{< youtube 31bhIAR_oc4 >}} What was also great is that Digma, in the form of [Lee Sheinberg](https://www.linkedin.com/in/leesheinberg/), actively participated in the Foojay.io booth too, i.e., Foojay.io is a global network of enthusiastic Java and, more broadly, OpenJDK developers, which was reflected in the participation at the booth. -[![](digmafoojay-1024x697.png)](https://x.com/Digma_ai/status/1855967865175785896) +[![](digmafoojay-1024x697.jpg)](https://x.com/Digma_ai/status/1855967865175785896) It was also an opportunity for [Nataliia Dziubenko](http://Nataliia Dziubenko), new engineer at Azul, to meet several of her new colleagues in person, such as Gerrit, Frank, and myself. ![](IMG_8951-1024x791.jpg) diff --git a/content/posts/2024/11/19/hot-class-reload-in-java-a-webpack-hmr-like-experience-for-java-developers/index.md b/content/posts/2024/11/19/hot-class-reload-in-java-a-webpack-hmr-like-experience-for-java-developers/index.md index b2f02f6b8..ea06319c4 100644 --- a/content/posts/2024/11/19/hot-class-reload-in-java-a-webpack-hmr-like-experience-for-java-developers/index.md +++ b/content/posts/2024/11/19/hot-class-reload-in-java-a-webpack-hmr-like-experience-for-java-developers/index.md @@ -41,7 +41,7 @@ The core components of our HCR implementation include: Below is a simplified flow diagram illustrating the HCR process: -![HCR Flowchart](https://res.cloudinary.com/dlsxyts6o/image/upload/v1727932300/image_2024-10-03_111134341_fwi3rh.png) +![HCR Flowchart](image_2024-10-03_111134341_fwi3rh.png) 1. **Source Changes**: Developers modify Java source files in the specified directory. 2. **File Watcher**: Detects changes and triggers the compilation process. diff --git a/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Configure-Application-1024x787.jpg b/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Configure-Application-1024x787.jpg new file mode 100644 index 000000000..60a9cc917 Binary files /dev/null and b/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Configure-Application-1024x787.jpg differ diff --git a/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Configure-Application-1024x787.png b/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Configure-Application-1024x787.png deleted file mode 100644 index 1417b99fc..000000000 Binary files a/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Configure-Application-1024x787.png and /dev/null differ diff --git a/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Run-Application-1024x502.jpg b/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Run-Application-1024x502.jpg new file mode 100644 index 000000000..fec86e35a Binary files /dev/null and b/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Run-Application-1024x502.jpg differ diff --git a/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Run-Application-1024x502.png b/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Run-Application-1024x502.png deleted file mode 100644 index 83ce5ddec..000000000 Binary files a/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Run-Application-1024x502.png and /dev/null differ diff --git a/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Run-Tests-1024x943.jpg b/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Run-Tests-1024x943.jpg new file mode 100644 index 000000000..3783c7cc1 Binary files /dev/null and b/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Run-Tests-1024x943.jpg differ diff --git a/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Run-Tests-1024x943.png b/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Run-Tests-1024x943.png deleted file mode 100644 index 1066c02e9..000000000 Binary files a/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/Run-Tests-1024x943.png and /dev/null differ diff --git a/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/index.md b/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/index.md index 1369bc6ae..61939eb1a 100644 --- a/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/index.md +++ b/content/posts/2024/11/20/build-and-run-tornadovm-with-intellij-idea/index.md @@ -165,7 +165,7 @@ You can select the TornadoVM-Tests configuration file and run. This should run a The outcome of running the unit-tests should be similar to this image: -{{< img src="Run-Tests-1024x943.png" class="aligncenter size-large is-resized" width="1024" height="943" style="width:604px;height:auto" >}} +{{< img src="Run-Tests-1024x943.jpg" class="aligncenter size-large is-resized" width="1024" height="943" style="width:604px;height:auto" >}} ## 6. Run TornadoVM Examples/Applications from IntelliJ @@ -239,11 +239,11 @@ You can add any values that will be selected as arguments for your class. In our You can click Apply and Run your application. -{{< img src="Configure-Application-1024x787.png" class="aligncenter size-large is-resized" width="1024" height="787" style="width:624px;height:auto" >}} +{{< img src="Configure-Application-1024x787.jpg" class="aligncenter size-large is-resized" width="1024" height="787" style="width:624px;height:auto" >}} The output should be similar to the following image, which is executed on Apple M1 silicon. -{{< img src="Run-Application-1024x502.png" class="aligncenter size-large is-resized" width="1024" height="502" style="width:628px;height:auto" >}} +{{< img src="Run-Application-1024x502.jpg" class="aligncenter size-large is-resized" width="1024" height="502" style="width:628px;height:auto" >}} ## *Summary* diff --git a/content/posts/2024/11/23/langchain4j-musings/Gartner_Hype_Cycle-2428adb1.svg b/content/posts/2024/11/23/langchain4j-musings/Gartner_Hype_Cycle-2428adb1.svg new file mode 100644 index 000000000..27b0aa811 --- /dev/null +++ b/content/posts/2024/11/23/langchain4j-musings/Gartner_Hype_Cycle-2428adb1.svg @@ -0,0 +1,3099 @@ + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + eJzsveuSJbeRJvgE5x1yf8hMnB1lBwJ37diaZdZFoxZ1MVHq6TZZG61UTEo1qqziFout5T79+ucX +BAKBzDyZxd6l2YinW5XHDwLucDgcfgPiJ//b77742dVX7/988zN/uVycfvKTZx9uXn18/+HnFwy9 ++OXbt999+/EDQD/9/WcXbr1cqNHVL8uX2vBfbj58++b9u5/zT5eOfnyJp3/6xT9/8ceLLz7/5Ref +9X/Tz3948/HtDTX4xasPH9/dfPjv339z8+z7129vLr/9j798ZgRQj89ffbxBr/+05n9a8kX8uSsX +v/s1Nbh+/927r968+8v1+/+bfnee/j9fpLxehAL0//3N72++HdtcehcDGtIfJVBrd1lzSvTIcplL +TfTc8/evv7u9effxdx/ev7759ttn79++//Dtzy+eff/q3cWvX/2Ffnl18W83b9++//vF9dtXr/92 +Ii7EL1++eXtDA7599fGigDVXv3Trl9ffvXn71W++u/3zDXEirksE3H/JXf7xW+qLusXfAOcvf3lL +kC9uPn4kegkh+Pvs1//2q2fE9/e33I6GoJ+f/un3N395wxNCLPr3z7RtT7M0Xujz01+8ff/nV28v +nt/cfHPxxc0rovu7Gzzyv18sl4UauK7RLz7c3LyTH+Xp7afffffhhvmgzw5P8s/CGWvgdg1+f/NV +e/Iy7n764v/67tW3f/1M+POHm9tv3tKs86T5mqitXyL+d/tbWxLXZWpXyN0alvUi53qZYy0XaVmk +1TajN//x5ubvP7/4zft3NzJtVx8+fvHm/6F5yHW9SG4V6O+/e3vz4Y/v3nykaWBQlTn79fuvbt4q +iJ99+fYVT1Xjhf6vNPjDqw9/uflIUvj+7XcfeW2URX8iofj81fc3ECwnCH77zc27P7z/F6bvZy6Q +JEd36VIiPpGsXriwpovi0oUrjCZfZK/4hMlOOkY36MR6z8Tw35Fc/fbDm7+8efdzpS1/+YsPb77a +ZI0WTZH/YfIhFO3/q/2/0ElD/vjx5p3STUL+7NedzC6Xv/6CML5499Wz97fg+bdYqCSq70g0377/ +i/zW/uZf6PHvvhHq+fuXND2/+/DmHfo8/YZ/KV/+7u139NMvPrz/7ptfvvv6/emnopZ+9+rjX0mc +b9599S3pF4HJ1wt5gqCfv/mPG4FdvnrzzWf39veHD69eE9qL3/75f968/kgPK2D764vv3ny8ebij +L16DTR8urj989+1fL/7w/v3bRt/+p0amghmK9j8OHL/jB9799p1w+ohJG4yYaHH86LBQ67sx0I8/ +5t6fvXr79s1fPrz65q9vXs8QTH5vmOS3RyCjNU6qvD3PX+3fM8Ty+9s/v3/75tvbTRo7yO9ou39D +2/wX33/78eb24d6e33xN22rHNoa+ePcfN2/ff9MR2SCv3n118T9effjmvq4xTV+/efcVrRBezxsb +399+A5Ph4ou/vvrmhsn9+NeX3PKLM8T47at3rz5cMLx1CfVD8kv6bK+SBNY6jV+SYuxV389+do9O +TBfX77qff/Hh1VdvSNuSOcWa7uari99T73/GTnyA8O5x/dXpT6f/dnr58uUL/jynzzP6XNPnij6V +PoU+mT6JPpE+gT6ePit9HH0WfPhx/PecPs9OL569uObPFX0qfQp9Mn8SfSJ9An88fVb6OP4sL5bn +TAN6eY7/nvHn+vT8mj5X9Kn8KfTJ/En8ifQJ/PH8Wfnj+LM8X57xoJ694A/3eKL/kf+u+XPFn6qf +wp+sn6SfqJ+gH6+fFZ8T/+O6z9J/rl/K5/R/ErvLUlxZ6eNLKLGkkksptVyVa0L7nFj1si7V1bX6 +GmqsqeZaaq1X9ZqIw/hf1JdXy5W7Wq/8VbiKp6t0la/o+at6dXV1TSN5Tnx/eb3Qx12v1/46XMfr +RJ98Xa7r9dU1/ntGLH1x/ZLpc0S7pyFheOlZPvH4K3Hkmnn0nNhGDCRWOmasJ0aD5YkmAFNReWqu +mbPPaeZoBmkuMaMrz3A40VRHnvrMogCRuGIBwZQ8Z8khCWJZgkxBtiBjkDXIHGQPMghZhEzWE4un +8FRmVwTnhX70P2L3Qh938ZMvrz+cHPF+WRa3rItfwhKXtOSlLHW5Ik49Izl5QdgX59zqvAsuuuSy +K666K3fNc/qchvRyXVa3rqtfwxrXdFozzWRdr9ZrEoDnJMsvPfXunV+998FHn3z2xVd/5a9ZXp4T +R16GJZAtF3wIIYZEnxxKqOEqXJ9ItJ7z4ngZl+jiGn2kNjHGFHMsscYr+lzTTD2nZQTeLMmlNXn0 +kmJKKScSqVTTFWY8PTvRAnnBDFyyy0Ru9pnQ5ZhTxn8lk3zlq0zCwfL+nNcpmL3s2ceCC9E14YX4 +QoAhwhBiiDEEGaIMYb7mdfScRfoFT93Cgg3RhnD7E8k3JBwyDimHnEPSIeuQ9mtejiLxLzDvJPWQ +e0g+ZB/SH8AOWgBYAvmkqwDrACvhmtf1c14PL1hiZE1gVWBdYGVgbdjqwPrACsEa4VVyYvXwnJfK +CxY2WS6Ol7vnRWPLJrG2kJVTWZ9ct/XznFUPiekJ+oj1kiwkz1pLFlNijSYLypaULarnrBJlYdnS +4sV1Yj0a2/LqF1i/xM5eZKe2ymyJ2fLShcVSoZvGc94srnibyLxBBN4aHG8J2A6e8S5QWf8n1vue +9f3CWh4a/prVejmxNo+sw6G7F9bYz1lFX7FSzqyEA6tcxzr1BTHoGU3TFc1YodlLNJOBZnWlGV5O +RP8L4uIzmssrEolCEpJIVgLJzUoytNAYXxCnn9F8X5HMFZK/RLIYSDRXEtKF+PCCZuMZycQVCWY5 +kYQnkvZAkr/SKliIWy9oyp6R4FyR9BZaTYnWVaAVttJaW4ijL2han5FwXZGEF1qa5MrRMvW0YF1a +TsT2FzT3z0gCr2gZFFrhiVZ6oDW/0tpfaGpekHw8Iym9oqVSaN0mUgaBFMdKCmSh6XtBMvSMJPmK +1lM5ka5JpHMC6Z6VdNBCc/yCBO0ZifsVLbpCyz+R2gqkvlZSYwvJwQsSxme0JK5oYRZSeIkUXyAF +uJIipNX/EpsydjBaesQS0piJNCehJi3qFlERTUEsC+tXaFjoWGhZ6FnRtNC1om1F34rGNZ0rWtf0 +rmreU1O+z5vy7dUvKWDVv70GFh1sGning09Y8wclbGq4KWHWwc8HHTzVwKedAjb1K8r3mWhe1bu+ +6dyi+lZ0rejZ/3YCq/xL/bzQj9gzZmqwxvKs+HzlD7Rw5k/iT+QPhuRP3rMUQA7w4fnAmmcOiYn0 +jCXjmqXjirkIGYGUQE4SywqkBfLiT6v85yA4LDovxWzjyXnGQgQxgiBVFiaIU+bZjCxUQShBB5jw +EyRFzEcWsudiKrGoQdgqC0xmkUssRswjFr2VxWxhAXSbCC68S52xLh9Ymf3CPD1lZR7Jekhf3qkx +R52pWvMkapMt4aT2r2rOTnea9jT9aRrUq7UqWpT16ElVqShTUaeiUEWlrrxxLtgVWK8+5831WrVr +5a03s44VLRtOLKkrK1vHU/qSVe4L3tKfseK95q3+ijf9wio4sxpObBYE/oisk2ieRLCqyAbvU2xa +vGAj47mY7Wx4XLMJcsV6Gx/7L7cPG0kn1uf2Ce3ju886fNzhs2yfU//lrs9eNv50Wi5zbHHDuFzU +epmXJeHnL04/+fKun6+/pS4QQpVffL1caL1eFAL5Uu3p+5pID/pjiBdpvaRV0j96/I2ekQ6d0RPy +ZVpC2cid/orniJQ12k/pkpZJuPB7cu9to320n90l6YFw4dJlSNn1XdzVhHvQUOnFSuwgSaK/25PH +n+iJ6+fNNTcXe+51f/Hx5ubtxbPv33KogJzuAUDd1Z3P/Q/z6R/m02LGE5vr4g2/ZBN9ZeMchnlh +a/ya7fAXYoHbUz+E/cEenQYjTo+MRgyxCPbDdmGI0xCF2GIQWwRiiz8kdqEs9MCBBw07SNCBfKST +RhyuLdrADhGcIQkyZPZ/rnomicTEHeP2wnmvbJ4lmScRzR7FjreHME/f8qwAxCT8MI0+kOV7mgYf +ZqGHvc17p8V72kIOnypv/bj/oQX/19KC29z/CVs5DATSgt3ObRA1TehbrpeEY2eUdFA2R6pLNCz9 +wV3mutkw8x/5KQxzTfIDWTe0VML21OxHeaoUkn75IYZLGn/snpr8KAZTxEKQH8gKi2QSdfbS5Ed+ +KlQSlig/rIlp2p6a/chPLYEmTbsju4eWd2ebzX7ceL0MXH6c+fPHd+9e3d58dfEXBV1UTzbQDEod +BzOE2J986HP8z+8+Yfuc2GeNGh2QT24fMeKrftg5UQ9Y4vjiF7+QKAJHyJYTq1THAYWVneqgYYXI +PndmHVvYS7liTWuB3ufsw79knStal6MNpxB2cd/Cbg5UcBd4UEW8DwCbOq4agFCNfIJ/PIkC14li +fsgU4A3rhB2LoxLLY/5z9344dnOSf9rHHz5h94m7T+o+WT4njSsVjS7Z56p9rvWzZWOe6+eFxJ/k +Y2SenNNwlHy8hqUC78hRw1MSosq8PxfeoyuHPq44CHKtSSCOWp04RiIhVwlfmURvsrsJqwnpJqAm +nCaYL0+Qy8fPzhn//Sd3eL98nPU5PfHB9a7PKJCP+RyFlz4n/h/MjkbHPvXz0j6n7c9OnI6fh9Wn +qs3TUXuqLI4KtFehuYuG1L0qPTVtumlU06mmVTvNqh/XqVdTsapkT6pno8Y3s35K07hV46HXTe8+ +06jpC9O+qn+hgd0JI0QAxizQh6yhxxlDMu9bxHOLdu5DnVugcwtz7oOcLcQpC/2x8n7/qkSXLQx8 +DAKXXRDYQsAcBG4R4CEG3LP0QUv2wZDr3ow93WXHyjiM/jNC2HfTv8WwT7swdtnC2DIR/Vp/uua4 +Q/30ig7YHoj+V10HeZIDiGql+JYGWOEWdrkAzQZwPmCbPoQjo6tkWF66khA9JId05agcWdFutNjP +actWqVtLknjipXMx069kjC8OkUUY5WT/ti4fbso9rhkFiUvJCf8s0TMZSxLEZBLTQups8/Oai91d +MBaylDwPicxxepy4bUO6TDm4zhI/q/mnWdJhakmHnSWtBsjsc919thoVrZDZ7zTbJnJqO8feUIkH +Q2VqprRKCGdm80ljEqlZzJu9rLZys5T9oThikpk7HUIVpdnGfazijmjFQzbUeabEYL6eprbrYLV2 +RutosO6NVTJTT81SfbGzVHszdTNSexN1b55Wk4RTb53axDfLYZvx3jDtZvtHYHn+JxqKd871pxiK +eJwtg3zWZ5Jjap/af07dxN694Psl3y/7/eJnOThNTMuZGXn0vO9wuk+dubj3uq/utRJlZ3r5n2ep +rcupj1uNhltvuo3G29l56tNmxT3VjnvAotstm9GsG0260aDrzaHeGNql808a02MjqJ+OTw2EjnHQ +UwuEPikMejQfTw+FQcXE6g2rWVFFV1LRmVLHigrl+t4endnTSdfJfTbpNhHPT20uxg== + + + 4oqdXbqFTKZe6WM/pwHwAxu6B3NXDV5m9soThs/C0/aSp+4FT99zrb695mm84qmsmrbnskY2GDhg +hiDbSYxgVlESw1lanc1WYbPZ13fX1qgYnB6Sg70lHdbCdmZyga3OmsVWXieW9BltxZJW23ip9EMq +ZNJGspD9JUl9Z+7e2+oM+zmsl873Wf3zmnPPKQbHNnDgkTj+5tcY7jCgz2z/GAv6f/z1zceb/ypn +88h03n0lvqz/SMP/r5mAeigNf3Za6tNSJb08XvyewK/eDlJqUBSj/ENY/yGsc2G9TxgfEuQ7hfUx +R5D4aK0c7ZTDeTjL/eHNVxfv313gX5Lq3Vco84CYjvxDG9K66D/kzv/ky++0DEsqz/71e/76z/Tn +/yTg3y/Cxa8v/vTvy8VXDP/X32PIuw5vN4h2evE5gfZ4epA2/vzQEyDvGM1vJXO65hA5xmV/uFAX +JHv/xq1+rwwG9b+Sbe3i71uvPl0mVO11BAZ3WbwTaly8JDmPO9iK8rc1XXh36fMA439dEhiS3N7t +YANWgP5M/8/dL+6C0XmhhmFrP2x+ClV4G4j7pgcYV3B7mNLEj4JWvwONOHe0rDvGKKhnQsiXEP8d +LGYJO/aMMVjPhLhernUHGXAaKSwLfs+Wo3ykfFlz3rGlYe3YsqNEeZDWy0zWUQ8acRot2jsji+ku +gTZ56WHWOyMbYExU2stLDxuwjvKCWYj5zkkygTlIL40Lk1DKAOswq8T0oBHrIDE9axTUs8EkpofZ +nPSsMViPWSTmQMt6YIzNXs8YlZieCSYyM+ntGTOjRWWmB41YjRoTP5vt2ztW52wVmyTdqwgNgrah +k6IOp9HSLTqlZLYgZgvHJq7De9RNBuko2WM0OgZN9BBLuPl6tzjPVNNRmUzU35+Py/8hpvS0zCRo +ImgK6mmZ6JxeVkyuesbstMRk/c52qdlmpiBIad1LS49hk5aelumynCyZ2cZw9yT1tBwXeScv57KF +uZv28rLTQhPFdFQlE+XXycu5bOlpMXk5z/rpaZnoG9BCdozWjF06+meN/R/LkkvwbAG5u6ydmaKY +6JNl1qCX569PYoaRoV7Z+nKOYxE5gQi1wyZGxVE9THTIXXbLOiHhPH4MKxKUFH+Jq1wOVsCeEXfZ +ClNuuJoW3M9Csk2oL3hnZ1KYhnEN3z6wV/eK506LdNAJX0/W5+0DW1+P5z4Db8SDKJTY3lEn/XI1 +eWDOu92wTfL6YU9s2uWufXC2XSoZhdAiApYSKOqk8NLJH3+bbHI9WyZG5HLXLjjbLIUOT0sgsCi2 ++afZD8yPuNQiK/NoUc7U8URrLw/ZiI9Zkz3+O+2sHvtdluE6IeEsRgxKr1uSByNrz4e7TLEZMx4l +oYze7yX0YNIPu82dpn/X31MltadntpPMdpz77O2Rnj+eXkjIAPc/ScBgGkL44uOrDx++v/jib9/z +Kar2Bfd7OZRYr54QOCjOhCIRUuYJKNd8elIMYej1toNZx8r7Ad0eas9/PukTsD6eUDmLAEENLKAk +H9hWuIZk8XVdZe2OXd/e0fWnkivSUmkRLVjAFbsIpGVNqJqAtAi9TBREcME1ZMlfLiFXoQp3r2VH +miuGS5eXevGWlQaJQPaFoPTzWqJASZeUQv06kp5oQOQqfL5EKExbpUtaMYQn+EsfozYjskuq5Dn7 +crm6WBTqFE8oJI/e2iLzga2enqm0QKTbSouAhSdc5hqV0MOg3ipbgNCzuZKwjNQnp+be07MuRiRV +sg4hX/qlUCexSg2QjXaNHm3dpStGxrJeJuIqUYyjAtqSpnEVEK0voyxc1ojL7Xy8RP7FBkGtiNsh +QsUZF/Jlzj4wtHgbGnjDexvhj5lm/u1sWDbeHGn6yRhxC7GHcIhzS8Qu1EVFv8qcFEhUU7moYG4Q +jmdHY6n5otD4FVGqxKmAIxtLWWScOdEMkNosRDtNIcMKcYG+oF0pq4ynrGxSobfsF21XSEKYkJgM +hDwXqf+KY56rEHcYhQ0POilXuLcr0UUK91Zap1TrRc0k8U4mk9ZMggXmFloPi8pZJs1eaPx1xeEJ +YRppwxqSx2hKlmeJXWBtSahmawStJeBqwssYRDBoqAGHOKhZdqnY8NySwkWhZsvauOBIqIjPa1gV +No6iSSv1WSABHlJu0krihGClQ51bNGGjkVQU6kEPBJUJ4i3a0cqL2QuqSu3WhYRycXJz5luxIHhG +WLbXKvhpxy6FNkoQFUExtyy0PrAwHfG2SpdYuQvZH6Bn8VnoWeNlXmlxQIh9XVTOx+HYOAmX4+VK ++yZt+l7GCRnDomSkuihofwqhYvmQvEavK9WJqGBt1KwzTrsGwSOtYmlDEplovQFYbGYd9QyRrBW1 +fgJboUcKhkj7YtbJIE2WA/PS0/LVqSS6aNcFz4lDUdfyYSib5iEpcyQMtLcutZrmyZeFjIoLUjEk +PLqYScorLTycmS7Z1A4xFPISKslvMuAqph8xgw9GybQHORlOejYmpR/aZoVUQuuQ3aNAYtdKayGS +zrCGZJVFTCIRxPFY6ZL4E2m+SLnkNejT43jaQIma4GHokLCtVSdzhTQWVH3W1ZemSn1mu8tj/zD9 +yMe6SBN70txt3/EwKAOt0/YwrSmgJeW4rjbJK2xK2oA9LaTWkubJedqPAs3IErdxLqjypD1rLbo4 +mCEevgpxqQntOBwbJ7ZhkkXeumLUCU0RyW7IJ+nYoIwmXsZKWhD9kxrLpnDD4gKL9xqF0bRbyT6w +QqKrNqRtr2IbojXFOyivAy8zAr4uS6imr2V1YsXkxZuqKkkpCrq15UVuy6Udi7rRtX0YT9tDaCEs +hSWaV5calD5hM/YoQ3DFdOcCmxotl1X1OY2pFigXj+KARYQ0FlqE2K6gM3QfSZhIHhLNU1JFS3gc +3wRMOoo4420TqjR53DIm3XKg9SM0A2mcpbQNjJ1s4K5OpXkcTpNbqEQYJuhhJR2g8XoujQCpZAmp +QNLOovPksbXLmEiJpIr7CSCEq+oraBYufiBVs5opRIh4uWJQfi1mQpCG4u0eWsmZSJLo41wfq7ZS +bT1ENXqw1kmlNhuk0J7CUJ9sQR1GtY03yCbOG4mvavlR+zUyRlIqvui2gX26VpZBYmSysYXMOt5j +LemAaftD/TjGRuvTRrwYw0iDLGtqpJH9ytc80waYtmGk1UkPZDqHNuTEwgGbxIfGHNbfoGD1jY37 +UW0KmNQHOIHZg612q4YT771VxVQ0BgJDRC426RrM8KLFSdr2ojoUufimBCPmt8BQDfZ4pNHS/Fb4 +ZbZBmzVHLZsOAI2VeF0hMTbjpGzZbIElVlxpDVGfeVFhWC3WchjQNlIY4sQDmgwWqVttzbcoUxfB +5J7FChNboyRTbFCVXELYRdtes8L/pI2BBhW8zSC4x4zCrR7JNbISppWtnroNADlxtMyx2bIVFyJj ++Aupu8YnNhNp+J3pPwyoGQ7YzmgPgjIlWRTfm9BjwSZYOKEZMzQ7ERtYMhuO2vF8ki6i/V5GCW2G +6cTuU3VDxUYeakDEgIxEZzYPTya1Y+lRG6ESJ0nZs1ADFBaZygShDcWa8UwmbLQ65+Mw2vCKDJt0 +KFsat9IWXj+eL7ZBkmqvOEENbycXZ0PhSaQh8y3aygaeQxoKm+zKBmYNwdgTU3pSJAUbuw2X6CbB +cGDXUnRWAwQ8A+SL+ohEMk8fofU1RYPthmHDI/vGlwovDabWItZ7hKXC/lXFUW0ZIPmbLhd4eTRZ +ZvPC44M14iIuf9dtIAbZ0eAl5lXFnBDRZpXYvytO93BYOAtUCh4hL902pujXlfsMpg9g9kANgCRy +/RQ78SvC+iMg//F2NqI21CpL1MEA8otsotQaV3Gw09ZcC6I7oIYOLWnevI1KFB3os1UReZ/xHDdp +U0IjVE7B/vSNLMdbE3XuVPcQ/SlGebp56Rgp1AuAGUa98QQE0b/ZLK3DePqBRqKa5jyRq2H5Dr6T +n8SKV5eOqAZafSR+bLEpSQEGr4emVe8CNjDJA27xSeQXGnK2BUics6KG6ZEqN2uWG1Ydpo2683iL +gFojbKoTKWFVN5CVAoknVlawMQ/DaEafY6+dFkOBAXUrTdkUg9HjdFFhZtnchnW5CcwKkYA9iQiA +zWvhgTCDtJkwZt1cbJZ6L1cZRV3zRDUMali6ixobyYsfRLDNJiMtSF4Zuwi29oZB2NgsvIroJq0h +/BEkzCmxX2gZX7CJV2g9mVvvxDvEpkcjVTcxi0MNYFPisMHWJJv1UlwDslaB0ZODcsVj2/Wy12fd +FzzCARFuGdzCYGoqSkN6oJg+I0OL9AbjzrZXeMQNsNKwDdl8HsbTMQJhXilgdaQpETKLqSRvnKDp +Dcg6wQVsMV+YX1GtUmEDyemyiInfnFU2g7NYabQ3rMYw1pYc3TG3gVhLitkxMKsVArciOeEXe8c6 +uhA5IrA2a9rD6XGFYd5mgPjl1UDMCF+8nY3lXHFwAW4vSS1JJ+2PToMTZNN57AmEYjGDAoHARFOP +yJ253rR3sLsBLWYbBQcGsFkhkmiCDjwVgYyIyJAZRCGxGFDDYhs14mQE51RT80gRlCzYnHipabAL +ITnsvVBCed3Q7IZztjRwfC45zm6E3KI05G4FMRGaGYLxLciqQKuZSgIn1gyjw2/+HVi2IDMZFxGC +t6fOaY1L59oHhGppFRBH6rKENsAlEV+oZWnYiRU5guEu9CyDnotw49rUDOM5WyJW3TzJlaNJCa3g +aeGdgiyCRZlNSr9W3lOqJBwApM2Vp0/2M50qMi2WjFh4oJ9zNoGip6LsZ83y4FAKp4J7OUnquGBn +tqAxXBO4p7LvKsOjhGscb4HmqY0DOl8msJVBNcGkSxbp92mVLbOFumlPWGEOI1Adg65n7K3UP++4 +3nRq4Fis5zHX1aZqYfaIDVOKmdD0PDRMQOCsrSIyF+H2xiBrURnhhWW0EFLeWMZ6mrA3XTSM51yJ +KPCJV/FpNUICrwBbAkJpa1a7G1FRttrwriFzJErSLMBSt12kRCGfw5JRxakibhkR3aVZhiHNQBpT +Ae4F0qJbH3kVERYy+vRm7pL/xB4DSOLgHQNX9ZsdPMQiiIbxnC0OVQN08HQDdSucQEAJaWynnghj +IM3EYVdEbVs4nXR0qpGDl82UKUip0pRj0HVR969A08JQXPLmkCJ+n1PgoG+LC5HThR2a2oWgTnbF +JDPHYIP4jWMchiXcbb86jOd8FbGKxwhl5GMx33TRNFCA86+6iTjAoTmOSW7CrbYydKlz5vUjg4K1 +RaYDsX1LLrEeQainmFiwgwnBQWCPU2cCjZKpQLeNxbAM2LpibW6qkP3uxMke2plazmoc2Pm6ggyG +jA1ANrVSW8SUN3Xky0qwqGeRaCd0tF9NHSIJhsWJ/cG7LmIMGxRbSXOPOABTOOGGiU9bGGOtqXKQ +cNuYaJzsoqIt+5zGEz4ehDihs4Uh/IPfQTQ0f/M4so0p56UnK4Q84dCTg/Wvy4YdbA== + + + Mvm3VUNbJ8LKpLybMVEQcVvZby9mIZckKX7cJeo00YGFsFa2WFoEqCZJaSLHZnZIjYKD1CIxXDUH +9IHQsiymvYPsr7hqzCzuYRjGBbz9Cv5k0rV+K03Z+eFYsHoySEYFRMrjtn4LrHfHIY3mLJEa5SlH +GtPSiKVKfWmEOJRi+rJi0SOZYKYOrXOc5OeLWp3KECJ80Prwn72KINgAhw/+R9KtdxyHjQ+2JdKA +2PIcnE22k73qZXj6XqMdHASXvc20kcWmsZ8Xi5ghK7XArGUDJ7YIDceUOF28ao8kh2LyhyBBYAYu +HGt38iYuAQXVwjGKXlDrmeUEwBbsO4zGhhmglWH5Iz6QLE6TNPILhpbc3B1NoNPeihS/2fQIdGD0 +a9DNb5XMouzhNnhEBDUtTvo8mVGPixBYT5jHjoBLYl2EtaLLGTYv8jUA8nbXGMKBBYRS1Sw4jMcG +imUMj5u2Aep3UUWF/HZh0ylhxameRoiM8+RkMVRLxVhOCiwkB8Q3C1YjMXAXzdbNGoeGibharyg8 +gBRLpl4ZCAkRAYBOSGayoDdIA+jaouShSmAH0BSqOQTDwNqI4Z7wzoRksWUmQ1LHE+mJ4jfr3OHy +P5eIwc5tQ+baP/BhDRZ3RZgMIU8nuSGjDZs/B2+QIF18o00SAzDyvG1CoYqFz0Zs1Og7mkhMCEGN +FlIHfzhfkBBHsv11HNo2ZhJ+8ovhj8ChUOM1IQjKq0UtA+QeaILgN6lHTSYCLgtAZIG0uln1JNuI +zHQxR9xWuJD1QQJttSVrENlH6irp7gl3NiLGUTjUoXoCVjKqLEKzYYmb+YI9GXN/hhHYyFYvWWlT +/7fSlvUEPV+D6tHMRgQnW1sgBSdX4VBbgpRxIyeDUz2h88ewbXNKdnO8sFcXrppdrfLBqfGHQNQS +mhLkSDMizkV3J/AAKa7gNqt/HMa5xleuwhZafOx0cbEEfMLCWwaLKQ+fcK6JHVLedhiWUINywStN +mRTFlA4INKs64dvIV/bfq/dt8+J6BYiO7ZFk5fLSjOrQ2n6NxDv2YWu2MrbYlYeMYzjbyipRjg4h +eAif/1Y6490EDqfpqKzBFEQ9bS/L8CJRYunFW2YY0gtwu0ur7SBepoSRFilAUXo5zAFT0UL7Bdlp +2p6D3uGuo1+QI4bIlY5LiNdAjJ0GvcdhnG14L0hpYE8oKBtpp5FgPWAzzljFaiIX20+R8o7mLxQR +CujYterOS8bAUhCOCrhzyWqcyCFJsMx49zQDkSxXjztUodhTNKsZbimb3Vyo1ZZQkCIkUcem21C5 +IVDf9NVxWIC+PEcg2HfhIATEzHvLfwYRMJexgtU2WpFKBBKS7yU0b2kJUo5HOqJ5pxx5Qvpg0eoe +MqIUEpxVHxAS8d2weGrdCunYEmW/37cyniCzL7vx2vjGwR6y9rAVbTUR+xE9Wjrg5yDctBMO6OQm +kyoba2diNtEoW7rUJGPlJEYYBAM1bDnuBcMja2gS0OSiXi4t16pSATUZm+OnQrHWTgWPozlbSTQO +wnrxLYKlIuERTDMPQUWCdHW05JFKBKln2zSaPPitNk7lAWs67aVhGcQgSFXiIAWXOy6xFMBRW1uB +4jCEs2UgId1ekaHd6kC9VK4Ut1WBBvYZuAZwqwFd5VQKYqw217Tn0SSlsOkuh72GMKD8xCpAkStH +agrVH5YiRf654oqLuOlHjqWTU1iWrfhzpT2AzLriusrPYRBnzzyi8WRml7xVhSYJ1Jd1qwklxc4l +oQjIbBWhtA/Susxlqwf12P6IJFRQWniSJjyQKGe3+U2IcKDEjFSqLQfUuSDPgT3Y1he/wYK8UIK1 +OlDENmCv5yLY3x7GsA39zEpgpI/YMdtVG3I4/FBuSNYSCg539YacSBwLDtmxQKFQX3AIO/RYcehQ +qnQoOeSdaaw5hIKTE7d90SH2q7witLOrOjyMqxm6hHBSd4it6FB4CGt5kfKovvIwxknpISpU98WH +scyqD/EelrH8EAr9WH/oIOOHAkSX10kF4nFUZ2uACD8e1Va7AD4ixss6RPDhg0rFaR/C59lG2mIX +w4fXJg7eLogfNUS5j+LDM4TiGML4yySOz+4MDOB9IJ983hrHSP5haOfvCUjEo0Ckj+WDjOSGYD5k +ZOWKhD6az0l3RH124XzwTz3ZPp5PvN6KElrMk2Myh4g+iugOIX0Q6YV/u5j+IvnufVB/GNmjNUas +E08RwSLEv3pXkSMzhGrnLCL+A6+09xZZFogZe2+RdD60bucuYpkc/EV29KE0O4fRcfX2zmPEaCcu +Y537jLDvWKnsnUZSJW7de42Yfjlm17uNEWV0qD7t/EaYy1xztHMcIaKD31gnjiNkC7ZE7zmyoQym +964js0OP420SNg7nfPNgkarknX2Aw0EYam8gYLI5rLizEFASMZgIMUxsBNwLSz5fbyNAr/OoeiMB +oxMsnZUA14B1VW8mYMnj4MjeThhG8wh1UHh73VkKi1a8daYClB5P/M5WgCs7GgvOvOXeWoC7gBTM +3lxY5FROZy/I0g17g8FxTbYvO4sBM89B6t5kGEZzrjAEVKXiFEvUNATf30AUZOhERM19beUYsnkg +cuA0XE8CSTyPEsi07T/w1WAS2vVF11RACAKFwlgxtoBxSo1rTgLMCPU6OcMgKrKFHrBHcciTKAqr +IY+szBhYltTw7Ad0tjwgclj57BDiq8oJVmKVz0k5ky6yPriIhyvTFjUVkC1xzJw1qaMCdchHHLg0 +XdkY9PAMZ5e04JCwSKVc8Ju3hxNECwwSuNlBNxAEJHAkmSWtrB3DOATJFZ3OgLvRnCsQCUEeRNYh +hli/XCQe5G9W1nbYCTvRkiR2Soq5FYnLyRD0k1W0kUDhUjbE270VcEUtLUIxYdahJA4RS1hZZSRp +fQx6TMWq5heLjtLyS5qISVqXxa50DA3NfjxnywPbb7CMcdE16cZ2LAC1vMBhU4rKOUh2RmW71frb +lCYu/9AiMRMc8NMbGwPjZ6DtF6weISSJL7JuFfTsKLBhUFv9fyqIcbAd7hrDYOxKTFstzMNgHm0i +aGCdfXazECxhgKyjt2i05QvWpbMGWr4ABWUtom7WZBcC7NIFl1u8oWULXK+XLVlQuupsyxUg3BqK +IdJUAVK7zU4YBtTMBIum85kEPYnWEgWoHd/UveYJyPVNlmlraQKUWdu5sC5L0BkUW5JA6rmNKskR +LJ07tKUIuoDJliGg9dMMV00QoDJm2ayZ3YAeqwpQ9JbDXhMgyl9yqzVlRYAzFLpFmRrA8RfLtjct +kKWwbKcEULjnBh3QF+6qEuAzk4MOwHEOC9KaCkAcpdVXDsN4tALgOoOSduufQ1ian9b1D7faLEhb +/nDunW+VtlL72c2sLf5Vj1XsF794u/3aX7tibFv7duivX/sQ07wdO9oNw8ZPNg6faYTMoPiBU/KS +TsXeG6LubBnhJ2TfsOe08hRCmoPUA5BEN+CK0k/ex9yWyuYYORc6KEkF5fEIeiJqaoeBild5xsJc +U8s5sO0FiizFXFAkukhKNa1WXjaM5lwhxwHXEqXYbC1qB6KKidOCsDuCpUnIU+AMK61GEpJiQ5aD +SSh0tPRfLlIYjCGTb6ktee+Tgg9cgmhATiaAEWu2yKyXugQu38trYwRLtJPDbxvHsmPk2VkF1jig +s+W9OomEYhp1u8MZEVpayC3ZoUbkN2AcEmz1GpPA+RiEL3C81w4FoigKy40PuFl5l5OtPodNZFGu +kPWGhazWddX0TE5dUSG8YC+0aIil4qx2YFJqq2DYD+JcMSCMyZHVmZHxtcE7qfODiZ9zqxvjBYZX +3VWTx6pWf5JTmAzLUpibw5YtAjNBOvwcC/JWJ7LMASC1YxCRhvjgbLJV3tYgdSwZRRu5cc4hS5Xz +5jCM4zh78hHZgYfK1SpWEE8MQIwLXpGlFAPXy6Vly7NhweE4DU4VFNUEsEQRTYtRKn7fCgbefuBp +WkAJPjW2bsRFbE9AwCRw2s52Shz2iCtXyEQrheMyB8KAkILVvo9jOHfy+VAGrci0bmW/sDiI98hO +epV8FNlkuWejFe+jpKUd+1UzD2opy00q7WAPWBnl7FGxI7LwKXA8MsYt6oOoCbQlDufYXo2CH1T9 +xS4rEzVnj01lKdsZhH4YZ889TsmhFj24be5RicbXG5Vt7jluy0cp2uQ7BDZIzlC5Y5OPEwBwPVAf +ZJOPukBcco3KdZt8yw6gfM8mH0XumZMxNvnY3hGLsVIYhjnxhn3ZJn8cxLmTj9PPOLcSlm3yYT0h +BlO3ybfkVli2yUetIsqHUFXXjh6rb46TYMvWjotNAbPJVwPN+66IVy/LQMFRy5YECTmiZMnmHjxC +Sg3+pc39OIqz595plSRC9VyjcSuD5crhqjlvMSP5VFxFSMjs0iL84bJbC/HIDQnQV85iOVXu8MBF +ENXkASd+SMchu2gHsTgLhJOFWQwBGxcirShg64qd4d3hlet2LuwwirNn30l8l7MaZWmyj8xTlTPk +NqscqMCtEzE3IFfX19INH0UoiEaltktBchBfB8iO0RKChQ9wttJlWHa58oO1DRQH82PgY6FWGchM +KjwPjcGHQZw9+2HVmhnCjgIRvb0zko3LR57aWcci2tanLT+JGlWoIAQ6S2lVaLiiH+eguASEYZrg +wukts11hA6EGB4eOSqtq49JeHzczNeCo4sKkOLdVvzkcAfRdwfI4jHNnP2A3RT64Sv5Gg1+8g/rN +zkC6CQXuKCY0j4RQFbKF+Uzp0iJkDgcwUbq8FeAJ32DkuEYsjkcgCd1OqXHpTeVHqy0RBMfWwAfr +VlOtYBJtmKIOjL/DIM5f+kGPN+MPdpHE1fVylobd89Qq2tSbh9OLFzYpFH4euwHLVu6PB4vcSpC6 +0mQgQbqZryUIfgsxLylJ29xizAgCsAW8bCYQ55zEBF7lZJhAk1Szuz4jcRjZuRLBp4yy3PWTrNBV +bvNRlpRoZ5lBhlulMNW1bJrXBCECgqW4xj0+OOt4xwpbUER46jdbB51J1NB35/C4LAeFS1ws79v5 +nsoeN4BhtfocBBal1N1tNy0cxnW+ioDFi0uhHL9oQjRkKHrgf4Exp+HFEGUG+ciCtwNCWSpc+aoD +O3SK6fUQBdx0EGyx40YilCAtyDdpBRPivZ5vfMaJ6M7oQsU0+rTTgtEuG1jyVhkZNcwOIPlu3vDs +B3S2mejs9EXlko9b7YxPIOGkRdbUGxxYJJgX7JW+rWZOQaN0pm1bbUngOqSwmY8OXi2ApOgaUERl +QR1ObFa25CMXjhU3K1v2gijv7mgMw3JY0lYIOA5nY4PDDZZ8mTpGD9Godm2fiAivFJgffPMHbTok +8lpmkmWzw0mG4u2kBomyBD5RLOmsHBZaPQU9MtqyYl5JRJXAVi7MNiewweawoFqVu2HQshVH81rK +HFQsW5EP6ydewbBrLXDr+FAwirMJWkOr7xgGdrbugL24RKkhWBAMMJbwmQ7EfUxDeg== + + + fje4XIaSN7SNxNUuPmHWYRHzBUOpEa5X+WGQztsaxwYkVVk4reE31kmpOhsi26FNPmkuvN84F7zM +XQx2zuQwqEfKia9b2UjSc+ToE7FdMrFKtqwKDQn2EWxOs+AQSmZTp22eyELhqpLanYryagiies0u +kcF2hXt3etMJeSm2Q8t2dRLvZiRtoMTSJNh04JPDALQA3DiKsy0MLTbmK1K8Lzb84PjAF3i43UwF ++xqwaFfu8NQJdVsrPjhS83YPDrYE2B0VcQrdmQlWXGajs1ixDsYFowF3wHiVLz5cEcuOx9isEG3G +TJR2/8V+GI8Vgszsy7LbCBOyyACSNeZjwDuEDCQtqWAYzGZcLRXMGIdVARlIcVMbWGSQgdRZEZBn +yEDSi5OMo5CBpAtIecVcToVv6NFmLAJIqpozOYzhXAkARrAuVSny0LGzACA0m4wK8a84Q57bQIUw +THbaOATCktRsK2E8/yntLvng+Ufwu8mw1mUjL2TXZ2HtYP6Zv7nxjec/lSZ1wxgeOfuIVK9ySVWK +VSu2Fz3569cug1d0E8fpoODbJVF8eNC77fAo6plxRQOf64stH5D5vgCPigONxK6aXEPVoRnWuEwK +97KiR76gVVtmXJHI9KxWP++0BMfjaLYq1HE05wpCtrsw4fOvalpmPXwFDN64UPn8Dx/hc+22RqXO +baoZ3JKzkrCS18YFlh8AQ9Lli1QJok985G9J7ZIxCczDEWnskhC38LpxC6/P5TnJ24WS+7E81niA +aUR7LM6vwUK6VRjbDogcL7bx40wsTAccFmxux1LEcsAVTO3KgSWL4YDTxq1yBieOgajk7jgpSlqx +UEqSe7asJdsNuMmyHRBFZhJ7coGhbZs3tWSrAWeI7VzgOKCzbQYYodhe+TqlUhonYDLggs01b8OD +yYBQe2jV50XJK1sZCRgGgwHHs5tHthS9+jfLOQkbB5sLKLgPlhXF4DCzpb+wFWyAtbDndxVzoUgw +4+1sNB0b7Kbjhb0L+oP2URwxMr9Lb2v0VdK/Lb+8yOUtaysA5JoMUp7YMLc7H4JkI1iztrNgml3j +834bjBN3HGE05ypK8BJWWYvZoTCWq7O6uxM4O8v3z5ct54iWGhZds9lS43AaI/QCZPO/OfGLjWpV +vchPMjGlu7fRqmd8kX8Nh1xtA9eua8lh29wuV5E7MirHC7f6qqDVbHy6MW8uOmc60LKl2UOyHtu5 +ImYO8ppAHet2BcVuOGdPPu95fEIfkW5dBJy25CP12e7bQ8UbF/zwzalrq2xgdYx6WtXQCWIKdYfK +262yhC96Rbum8xcJwKNdUwRJI+rcoV0TBp2Pqjhgpidal3rbACY7N+W9H8ts5oGYL8igRnxG6Vaf +RHkHTky0m49w9JlN8ignORXIFxGGrQgV5gzKSfmOg8W3/YHVB4BmyCW9twRDjuZ6YDfl+l08bYdZ +cZawdWnXyTBznCLPpW2I+9Gcv+qLhLh4CRU1DHGHIN8LgDXdSsqT3HQs52zMOcpas40wVIt0ILZQ +5Ez/2s7eFL3Bed2OJeNEilRi4WIdqzHH7UWcUvXdAcsq99/xirM6bKcqlZfX4lusdz+g6bpHGJHP +0uOAXIoWcpfqnrBV98ADznrxNK3wloRpJ47wqj5jD19tytUniykmXNCRJMtO6jsYkMOsGPViRVKI +9/PVLnjcjB9c8tv6NAuN+aOXGZQSGyv2AzpbAFCCz9GKhGrw1dm5cq7SQcWXtxgCzlbDOU6xM14t ++ojy8bhud05x/VBCKk39VaSY+E6HxHkzb7a0ZPlRrdKM36CnsFPYMrJ835LWnNNcr9ZSrneLOC3R +7uDbj2c2/8ArhVxJ9li97HBZi6Bo55C8Vn9yrXsu26gXZU+7MdbrASk+nGy3VuMSRL42I3Vy6734 +3Bi1S+ZCkkJFUSY/vm4eydZntnkI2wnkajr4MKLzNQACOzhdj5LZpgG8qoC8dHXHXlUAdJBVS3nV +AKl2CsCrBmDlGbaqNGiAVORSNoGpBsB+4RfXGqJ4NdWtgMrr+oeiq12whdd/7s9SjKOZLn9OI9Bs +ZM4l6Yj1tsXcFfhwRAjrH+Z72+C9rn+4Re3CLJ/a1cbtXgoOEmH9Q+eXjmN8ySEqhVoek2t7yaJN +cvmKDbp12Uwdr8sfyNtVJsN4zl/8er+KRfD1soWapBy/1arBM4bvjwIiW3sICiQ+DJDN5kJuii+C +9ttBAsgHXp8S5GIuBuHaVhz/xra2XbPAmUfoWauyZlOL1l6IW8qLmeeZkmQZ63EU0xVf9IhxklsE +NQYgZ4f7KEaSSjo2uayKOLUDCu3oAF8VQbs47GO73sfrrWGAra7F1PhMHt88s9HL5VxoZ0cqMa3a +nwm912o5oG2hmGEYZ880zlNwYBK7d9SbpxF/5gplJFU0sMkBez5bvPIrYN5KOxq/tHN2G0Pk2/89 +Z4iqnVeOjk1GxPQWu4RztVr0Zctbx1WTKWHdLqjG4Z6cxBwg0ou1dHAb2XDIFmIfRzObciCOq2yp +SUPBsb0No7sSFxWbvkpDzrsqCtlHkNRqJS9wrhdJLeW8JUjEQgTQ7uNF3f7qJS233fSJAuhFLhfK +7S5Lv/XZRB/8WSylZrHYcUDnW/d6aSw2nsXKKLmeE/dbBruxF9GrBS7OukVsEzwbuHpuS22yqYui +27qZ57B0ETLBuV6zSjlWVTnN2i6HSvreAk47L820J39AaLFKLei8ihzwurUbhzGbdIRp2HfTVLcO +VS4qJf5ZxRhflF/yBd+Pufk2qPvFbaFWpYogH3JGiMZY0UxSO5EjNGsz9H1e+FbRFk6E0sfhRn6N +QWwVo6xyADPVB5Ygb+XX7gL5YRjn7+ZO7zBKsXs1wlLlBsmEJLidn1mKnGOD7WVmBGeiKhcwtTAj +YGzQJLdVHHMEh+9exnXC7Y0sOBtS+ULlsL1ZAeP3etLG9lBcTsevQdCrkqxPTpIl372sYRjPdD8H +XmjeFCTwdGtPcuy2y+hzNIoNjrClqnF/Ha4egbma2osjEADHPdBrd6ASoRlidVq7A1UIwqD7/hYN +4GY9g5bNmHBOiiRTd5SeAzswMNlWrlvQazeeRxhzuOCTj8HASAnKCi9vjOCTpM3jgAx6Ln7HXtby +YquMm8v4czNPnF2n4LeLE2Abo4yaD00Gq39nQ3+VW6OTRU/RVo8P8cWirSmvFqarXdMPm5lNfZQk +NgLGcc3tuqBXKUcYMXZbO6K4cOf53Fzqhp/lHYN8o11teHix8n0boVmki1TV8gnE2KyuVaI6DF2b +zbfKUVk+ftm8X6/7P7fNzfwNdodV2HKA0G56g1Na222n48jOFgkcN8F1zqW7LhGRBai4knaamevb +cEHaWppm5lwbbkoxawtpA5x1KtsmlJ3cj13CtknkVVId1CzbIYzsJF5Y4qVtiXmVil2ipCndrFda +lC1oOA5iNvvAiJMHJYsHcKvP4dRHwZ3/qQ2U3a+yVTjCy0lCGNfEmfrGblPC9hIi7FTY8QiW7L48 +i+yXTlXj7SEIT2NWNYLBxwe1O91wwA7UU5e4Va+Ngzh7mle9Q4dDYUXPishrHypHkLbSnqr3nSAO +V3O7x1XyDngPTrBLlBa9tJD0Ubv/AgdKnDQM5sehHnLhxDlOnKsW4/M/EsVbFk2YoJ5usZCWOXKo +JXUa/CrmyB3GM5tynHricwgubBfx4Em+1w7d1TY8j6otiZotDahpeb8FfKpW0OCWLjNh+UpNaCSE +7EppfHDR6e0E0bfawFQ5dMnFMI0RW5+pNE5wEpORF2P4OJ5u+h84KRNUv4TEY7kdYG6lQSMIgTgi +H2uovDPq2+bk++sTn5uRZNPWZujE7zHpQw1GLPUXWy9pwJQ2TI0abRPGTsIRE1/1WDXW4Vlr3g6g +ED1XGLDUALBygWi03+kreqpFvLmtxaGHHos+oiCOtvBD2kfcY4kdFqVDWtSxh3rAwrc9mmjC99S7 +HjsQE4j0It9qiuSKZyvbflfkfIM/ZyIZtNahhx6Q2yMKykLg1kfeY8mGZaPDWux7GMZiQwzGTH69 +RbaitgZjYQta181vhqj89lHhsH5HZ1zKhknY2hw62WHShxqMha31wveedpj0uz4k1FibMnZSjpj4 +srwoLKhx80o6GL/NZdXQfdX0GG7z4d/1O89OkMlobcLQR9jj0WcMxv+2PuKAJ3Z4jJatzb6PeMTz +tSxpgectrNpgOJ9A1mLSS+Fw0SnaQA3o7/xd9YnQaG380Iff4zHFpTC2ylofecCTOzxGy9Zm30c4 +4mENtOiLdcI2zgbzQiNSx1j51UvfRYuD7Tv6QuIWGfquzdjHDo8+YzCmsfURBjxhh0doUVhHP/cx +jsfGieINvhlpEVf3toOxi0o0ZieLIumtYbB99Hf+/losHV5cXZuxjx0efcZgTKP1kZc9HvuuzzAt +rc069LEe8bAuUnlG7ZLX2xw7WED5Q9A1kfQCkaDrxr6zgtC11dqEoY+wx6PPCEyPrbQ+8oAnd3iM +lq3Nvo94xPO16AIef8zbfDaYri3ciAkeRj2rvOpttvad9YMXvF2bsY8dHn3GYDwXrY884Mk7PEKL +tQlDH+GIh9+cozwN3Xx2MJ6LqGs/6FxF1Q+hm8+oOqS18UMffo9HnxGYzkXrIw94uvlstGxt9n2E +Ix592aeFoto4OxjTiNoiLpjQ9eMX4bN91y1cftvajH3s8OgzAtP7ulsf64Bn3eERWtaGb9+HO+Lh ++YwSNlvLJrcNlkXmEFhA9H9VWeEXbsnvTZ5wPg+x3K7Nvo+wx6PPGIxlrvVRBjylw2O0WJs49BGP +eOQ9glEUcajbhPZAng2uVee3wle1WRZ1vA3wmh8Lqhy6Vod+dtjsMQZGLSRq/cRlwGYAe0yWamsV +x37iEZu9PJH7Q+3bNugN2Ijlwp+8DsPJa0+Glz62Vn7sx++x2WMC9Eas9eNHbH5gMdPkB9Zs/YQj +Nh6003fz8Xk5syE6qBOJ5EJytjnxwgl52UfSF5gZhElxyUjo2h372uO0JxtU4llbX+sB57rHqbS1 +dvnQ1zjOZivqrQSx09EdjCcr6etXohLEV53L720S8PI/rMeuzb4Pt8ejzwhM9WvrIw94Oh3daLE2 +69DHesTT6y5+9ZTfqS5+Ny0cMdMX/Jou31SKfu0119Zi6CHssPSKS15llfzF1se6x7I2LI0OaRHH +HuIBy9dq9jDYMXG3OxBS0p4Tm3JIzHGtazDi5KsaQnKHobbwYw9+h4Uf6UCR07atD7fH4josSoe1 +OPQwYrH3gLY36GR74WkH41kARN6pjZyJ5+/OWmhvuGaTnarWJh16STtc9pQGqxaZi60fXPzZ45Lv +r5VCoWdrM/aSD7jsDb7iyq69ftqgplOWRQMcq+mdRTf+BhFVaftC3+7Y1x6nPdmgolO2vtYDznWP +U2lr7dyhr3GcGwdML3YhtR2Qgwt8qk5erSMBMwBEV3ZRNTkLBpK7VseOdvjsuQbkEA== + + + Q9dTGvGlHT6lylqlQ0fpiE/eTKFbHd+Z2BXFNqDQG7zFZoqgCPYKYQUwIcG2xq7VsaMdPnuuAYXe +rac64qs7fLuI0Y5w7Sgc8cka9yoUnLbL7a3GDSj04mofViHYJoDCjv4bQJae1g30rcaO1j0+e64B +hd6tp3XEt3b4GlXWyh868kd8fA+RXnnRj7uHMbVlGHVZVVF2gy7DmNvNQ62TdY9JH2owprMM490w +bcMtw2h7cqUTf8Qk0h3lYtmih7pvByAX9Dm5+4+zV2jENeHcQAGvdU2wdu1bDd2EPTJ7zIBcl7D1 +E0ZsocemJLVGcewmHpFptEq8jbpFHzsY33SEQw3qsfCmUmrzalpUsNTm+VibXR/dd989YzC+Xqz1 +UQc8dcPTaFFYRyv3MY6nTa2ds1xj50h0QHEAUGoHbq+mSPnlW9JiM+1RaKahT22Vx37yHps9JsCk +DkDrJ43YUo/NaOpaDf2UIza5LE9jd7mLLfdADgzjnLpExjRyzEf5uUUXXnbmKvatDv3ssNljBtTq +KusnjtjiHpvQZK06qjUtvhyxySK2E7XL0m1RHVCpVbbWanQo82vt6dAp2lrlQ0d5j8+ea0DdWbKZ +dotuPsXsvy2L0KjqW40dlSM+85VTP4DbAagn8EMbt7wLdwlt3Nu0Lb6NW1v5sR+/x2aPbdyRP/w2 +bM/GRtiGvZkyYRu2tRo7Ckd84i0v5kVu1ncPE7t5qeaPimW9VPNaN+t7adGQ1ubYS4/LnhJYs5tb +P2pZN1yd9d3o0TaN4tbLMK62IZtR2r3rswMl3H9ZFuu84MLxYhawfGXda2Zya3Hooceijyioymmu +rY+6x1I7LEqHtHBjD+6Ahd3i1cBdrmgDaiA5OutcM0HRGQFduig6I3Jrdehnj00fa0AJy7V+8ogt +77ApTdZqHfsZx9blx6S/RRMxtwNw1QyZvKxz0XRM0jB3A2i+K7fIlCbJhn78gE0fa8CiebLcAnZ7 +bLHD1mjaWg39jGPrAiC6zPsASANZAERyyIvTwIOz37cAiOShFwuADD2EHRZ9REFbAET7WPdY+gCI +0mEthh7iAQvnVYrGfroIZgdjewG33HL8SCOT/GJ3+b3ZARyXDrFvs+8j7/HoMwLTkGPrww94usBl +o8XalKGPcsTD8qulU8i1LnoRTQfjIxxJz+bicAvaJHlrXfv+Wp7h12q0NmXoo+zx8DMbjF9n1PoI +A56wwyO0bG3GPg54NF8vHodIjOXrGyzBl+E7h7O88Rn72WrBMf3+Wh7S93JomzB2EvaY+KEGYwH1 +F1svccAUe0xKTWtz6OSASfZWrYkvXRKpB4q1i5JU9lGajnSyekqXR+IKXjbr3bY7Dv0se2z2mAA1 +D7T1s47Y+mB/o6lrNfTjjtg4cWbr2G32Yw9jZ9U3ZSChBB+3YJ5x0DeVom3C2EnYY9KHGoztvdaL +W/aY3GY2Nmq2NkMn8YjJrtPmAm++wzvY6+o2KMoQq/whF2dhhwtRXhdbrQ1DXqtzkXEt3a7d2Ncy +4LQnGzSu60XX1XpAufYoG2mtnRu7Gke5CXiVFywhMxvMZu6AfMjb2QWGOI8hZ2n10JYBROT09rCt +VRn7KXts9pgBpZC49RNGbKHHZjR1rYZ+6hHb14pR3m4dXZ9fatDFckKZz/IB0FI42Zp0qZ4sx/t2 +7Y5d7VHakw3aUkLalzvgdHucQlprVg5djaNsGtyCSmvpSq46IN9quK6W7zAv3VlOJHfVUM7yJlur +oR83YNPHGpBvo936KSO2Lsqy0WSt1rGfcWw26KzFeyjnsSk3WLFSmypqhAMx1AbXKOvvjfO5iDpq +bcrQR9nj0WcMJqU22kdd9nhqJ1VGS9dm30c94hH3X9PdsXOCN5j4rkFuGwgaOnCW6+4DFzB9Xdja ++KEPv8ejzwgsWSGk9pEGPKkPkCgtW5t9H+GIR90FOaDousNMG4xDEzBtIC5Bd8ykKTH7bjY/BK9r +s+/D7/HoMwaTUiLrww14XIfHaLE2YegjHPGw3KZjgLKDMY057QOUOR4DlHiNbh+gzHHoIx4Dhx2M +aWx91AFPF5JotFibNPSR7ghQcnxn5aMHXaXDBtQKhUXNmpaGR3xkrQ3AQVKtyzUYYjZ9L9333D0j +ME1Ztz7yiKjLe2/kdK123RyG1eRXfc3UH8bbYCZ77FhyHF/katErtDe5UjektVmHPtY9Hn3GYHYS +S/rwAx6/WydCy9Zm34c/4tFq7Z0pfNvDkL0OfDKQXzZY9F0RJiv2nVU/56Ni32bs42BydzCmrfXh +Bjxuh0doUVhHv5RsLUc8uk5XeQ/Fwi/mvh1gnH3ISV64wRccLrzosjXAd110cufW1mboJO4x6UMN +xkfOt17cgMltmBo12iaNnaQjJi19lWhlRFp9DVb7qkDOvXOV0RrlZFlCIxzpsQYMYBr0nQt9q303 +bsClTzVgCCVfbN3kEVnukDWSrNU69jOO7JBK4NcbjakEKPddKsFWSQvu90uppQD6Vod+dth2qQSr +vN76GRMXaUhcCE3WqqN6n0rosUnSKG01eW3QHVCI9aryoyHA3cBaDtjZBrp59K2GfuIemz1mQD0p +Yf3EEdvOEjGaWqs09pOO2GTQaqV432fKNqBmuDSX7i3z7tX48X0RnH3pWx362WGzxwQYLMNl/YQR +W9hjE5paqzD2E47YzA+WquHSDboDCrG47EANDS03WIT3BjBP1kyN1mroZ9ljs8cEaFe6tn7qiK0v +5Ww0tVZu7McdsX2tsqWyoDdU345QvsEMENEKfHcYjgW3IIRBXquQqLC1duHQVxhw2pMNyqfRu77q +AWftcTbaunZjX+M4Wy7FfljLVtzQwaQuwYIr7OLxQVChQ79zosOCNNYmjJ2EPSZ9qMGkLqH1UgZM +W9HMRk1rM3QSj5h4tjVuW3uf32Dmpmvs15wup/Hh3jFzGkPu2uz7yHs8+ozBxDe3PtyAp3fxjRZr +U4Y+yhEPz6ne1QMjzurBG2zVszP6/p+kL73BbYz6e6vTLnoLetdm7GOHR58xmJy/sT78gMfv8Agt +1qYMfZQjHk6daNFf7oIYHYy3FK5zlXcQ8WKK6lTmLoLBOwQJXWsThz7iHo8+YzD+t/VRBjydA9Zo +2drs+0hHPDzOVoSXW4qoA0mCx/KMKx8zjK3irx1EbKXnrcWhhx6LPqKgogme1kfZYykdFqVDWrix +B3fAgiH+8fTi9JOrX/ovX7z76nevPn68+fBOvl/f/OXNO4X8/OKnf3z37tXtzVcXCrlwn50msAuS +GTLk6P+o6+9OOBXt9Fz0v37PX/+Z/vyfBPz7Rbj49cWf/n25+Irh//p7yOOFvmwOfXzOVmP3V+E/ +iv5LZH75X4DCXTznHn6L/6X5xS2zeFXl4hF2xUWOJMJ8QhkH1Z1cuwSHR/whGGfcIeds7C/69fPW +7vOTHfF+Lh5UxItp7F4q+8pvdPPIa/ErH/EKXvhGwf5iD2eRo8MKcvx+1PaofV1NceEbrnDBI/Yo +LpVDKizYX5psY6QKMprs2Y5km/f/8kc81oi7/dEQ9yh+3iEEmHrHVxGsFa8dJD/V5RTw4tJFxELO +ppsQ4Co0mXrc79b+0qmXdnshgGbuhKB9VaJR09kRTX5PRzReRtbxWV/VYY/aV+GGfjNe2aPKyph6 +PhtSBRlN9mxH8k4INuJufzTEPYqfD2mCpay49RuvqeGX1u7vm+ZVfyt/BVEty/bHQTdsIoDoKGi0 +xJV9rbpenA54ZUKL/cGM2waNhSbssueMebzM5IsyVh9Tthf7Q5ISgs3e+2LErHZVQaN1N/eNqtsf +AVWP4eBdC78W3JCJydc/kr2xWK8n+Vtb5HKw36Yax9baXwdlsM063mrazXr7qjTjCrSO5rD0RMPt +7Tjs/Y7F9lWYYd+UVfaocpL67dhsSO3HtGdzR/Ju8jfibn80xD2Kn5+08MtiQlDaeifA9pdOfVmO +QgDl0wlB+6pE57gjOq890b3GI5ApS310053cNu74bI9uWrjjsyG1H8uezx3JOyHYiLv90RD3KH5+ +kgkgq17tQL+art/+OmiHox0Ylp0dyBLb2S2QaLFb9K/eDlSQWlP2qH1delPLFpk9qmsQL4/0B1NL +QUaTPduRPNqBSsntj4a4R/HzkzSBrHq1A3XqQ+n+OmiHox2oQtC++r3doqSSfHdE9ypwM7Xs0U2Z +dqaW8app3qaWOz4bUgUZTb2CnwnBRtztj4a4R/Hzk2wCWfVqB9L/ifnX/jjohqMdqLmY9jXvrRjI +M1sx+kdnBypEzKr2nK2gzeJqC1PNp6wWl/7RW1wKasQse4ury66oHag03P4IqHoMBz/VDtQ55wvO +TdNvfx2UwdEO1FlvX/PeblFSSZw7onuNt5la9uimOztTqynWtOMy9dux2ZDaj2nP5o7k0Q7sZv/H +Qdyj+PlJQlAWE4LS1jsuBG1/6dSX5SgEZqhYGrbsiTa7RUklu6Ujug9/bKaWPboFUjpTq0VZyo7P +KMra+GxI7cey53NH8mgHdkLw4yDuUfz81HigvraT/lpM1bc/DrrhaAWWnRHIKqszWlwwo0X/6o1A +BZlydDs7q/RmVpDLoduDUmeAXuWv3spSUDOj9F7pRu5oACoVtz8Kwh7Fx08NAurM01+Lqfv2x0Eh +HE2/srP8jGKzVJROVD5sFPcBkM24skdbJKWzrZRL7UHhIXrdGNxQCqjZTvLoRu5o9XUz//8/YY/i +47vHa3tTXredWaIgszuaBgu7mGT7agFxt4tJlj4kGfaR9H0gfRdH30VQLQIXlc9d/PTr0/kODaIk +2yhbCCXuNt6GM+1G2b7G/cZr8eClH6Zt+ApSc8Aeta9rbyu0nSXtxrqRvA32vBnNaz/YFiqIuw3G +sNp3pal9jfsNRseT136wfR/bnmiP2te13xNbOKXsBruR3A32LG0Fr7e2wTaXuO4c6uZ/2fe006kW +VWlpmdV0ahdVabv52m8BLTKbd+HgvAsENYuumpXQBYIGMb53U4Z3tw22uX515zi28NO6G2z7Wvdq +RMeD3MR6UMcWZKy7wdrX1Ks9e6S5ya3RMNhiy6BXOAoyjdLs5rBzfttXv1c46vKW3vcN22JuCqc9 +twvY7Fx1c/W8KpzOUX/MGoQ5vo2y2ep+p3AazrQbZfvq9wrHAg9LP8y+j03h2KP2dekVTvNn0m6s +G8mPFcu89oNtNqnfKZxeM3aDbV/9XuHoePLaD7bX0JvCsUc3xdkpnKZVy26wG8lPUDi6vHuFY1G/ +ZW++t+9hp3DMfG/xv8UUTme+931sCqeFAPIu7pB3HkezOlujzuN4pMLpBtssj7xTOL1m7Abbvua9 +wtHxxNQPttfQm8Jpvm7tB2vflr3C2VTwYbDnWkJqjvWKyVnl8s5Cs69lp5aaP2DPBlVLnYEWNsXW +1FJ7rncjelvSHhJaSm9JPtIK6kbYwg8CalpHUaZ+hPat2b1+N0J0HA4qSUGm2t1OJQ== + + + lV4jmceTduPcyH2CBdQNtLnYAmoaR5Da17JTR0ZtezaYOuoG2pvFmzqyR5vN2mkjM/DLbqAbuTbQ +p9Yg+UkNkv/sIl6uofL/8olbfjEs/5vT6SlVSX1/t+279iixoT2WHUye+3zoxyqY1HvZvwPUgVmF +3/kKfC9PcgkhV2/twTgojjdbD2Dtwy4UGzsZ4dbLCNdu7OexmxFu30c4ad2QUQ2M9yGSIAd+1bW+ +83qRtcxyTNJdST7kHzmDJO810eFtTDwANq4q0QeA9fX5AZO59bsnbzeABgN01Ptv9+DdOaeR3zGP +17no+k32thRwPHjRWO2GCyH1VnRGdEvuaeXq+bRjwqp1+D2oQFn0z00YcSD6OK6RKOPWvuXtgUMm +Bftv92HqGebIOIngkwv6lnQPDbiy5qtpKbJhV3k5VScy/N6vtOMEv1yv5B0IJxvjTgJm4zzSeBxH +W4LdcwNdxrK9Sri9tzthGwpwSVCGb91ArMsJ6A5JtC0ziNzhNYAOr5kaiiNoACHvGDsZ55H8I/IJ +hTnrC5I7ovcIt0hbr5OWMxSBtf989/TIhdU7HK7Cy2pg/V4s/BrXRexBvNGmV0i6kjqNYMutW0K8 +KGPt1QufE7FWyrWeoCPBhzFNFOCeqMaoS1cws5hY0zXRIFC1ZE32KsZG0K/bfgimdvoxmN7pKbZ+ +djAhbTf8I5MmrNQHu6FN9NpE+xmx3YPjODc+rfa+qrXZVPYKIycr4W+dGunFz/TIbsZUkfSDnfFz +Ro8925E9UVUzhabqpXvQVmLfv8F6OuzRnt5xrKO66oyLmQZSUP+0PTmDdY8+fkWamjDyb+8Y5owd +9mzHtZkiuluh9qOxJ3cjHIgzPsqq7q2ipX07qqm7tEL/xI5xEOVtyQec+WhvZesMShYtu5JQDTtM +fNypFZOPXvn0mI+0HOmd6TrrXkX+8yNdj12hbW/uxtUs025gphz6kZkO6cdhorKDiajsmHJk3WQg +9mA33JmmnGnURm/37DjWjVfeYjbtj0SrxxW2nCATf5uw5faOLg1lj3qm9GYKw3jUP9vMgw5HcxI6 +BrZnOz4bjp2oKS07mNHcPTsTg16h9Up9qr4U1uOxZ2ewO62Mh5amaQwj/vYOBs0Y2Z7tGD7VSvfo +4n4w9uxugAN9e41m3m6nUXoH2EBgpoJYl4c96Cz10vf7eGtWlQ+PJu40oA368/kQjsiPBM605IDQ +2GZy2TOuwTqeTDg3IW7s7cCbs3xO1VQ9b2aacKYxTVP1wzSiesbOCL1bXvonB+KMj0ZEz8cG65g2 +4+2MmLG/kZPnOaPj0G877dSPYKbFptpOF13/rP3eM2lG/WyUs6n5esK52zv6vC/ItVMaM+2psH4m +ZjO2055nBY1MRfUCPFVl9+jvh2RhxvUR77YlL0Z3rMgxIHprWqpLrCwXv9dVKhK1molTmwKTxr/i +ZvHi76eDz3R7mrmDd/uM98eCjgGju6NKPbqjH/dnWTVkjyyJ+aDLJ9sfS4C1L3wgvZLXCHOPZ3ft +o/mrOK6/Oh08o35xPeD2TbzDe3zIByJCk8DRxGf7825qI2wAiEF7VW4nBniG35a8GbnVGKJs+tXp +4AXedvqhI2UWo5lEVu6JvzzgUs48z6N/qsM3Mz5Ihm2+/5yzXn51OprPt6eplT2xxWeux90eygNR +i0lsY2bY6woIsEEwcA7FYGQ21kXcXRMBWym6Y1d7sJOA0RDvV8BDvsLMp7jP93gomjGLeswchT/v +J7gJQoHIH1bCYiGA1X5OexmYBmVmAY1JRGDmnN/nxD/kx0z9nYlfpCwQM4GvMRNlUOVfG7plNIP9 +UVR5qBnbL4E+kjCxkCZ21MQevcdsfcDdnTjFM4vR5p4FGFpedXpRGdhPvWmGZmrZNsgjH63PPjHy +kOM3cxDvcyQfsmZnVu/MOh5k/35j4DwVMLqGt6e5i3afK/eQNTm1Ou+xTnc++8R1BRuemt9Nk/xu ++uzC4b07NfG/uBoNt6ALQP5wp6dkecdeb3uYdqwr536oPv/5pM/RxPXmT6ihA7HXYpwFOtCOqJP0 +VL6T2y1GmcI8SfKiPVdSI3OQPfn5pLfOcL17EXKNvDuSYbAeJ15+exesRzr2txFyHlvs+Xokh8Z4 +QD2D1SM1dU9MmPA+THjvJ8z3E+6P/Z3N/TThfppwP064HyfcH/t7LPfTkftpwv044X48cj/NuZ8n +3M8T7qcJ99OE+2N/Z3O/TrhfJ9wvE+6XCffH/h7L/Xrkfp1wv0y4X47cr3Pu4018R8WzzDTPTPXM +dM/YY0Ol8DhRcemozyagOFFx8akqLk5UXJqosxksTlTckZDHqTg/0XFhos9mMD9Rcv4OLRcnWi5N +NNoMFida7tETkCYTkCYTECcTECcTMPb3VC3nJ2ouTFTaDOYnem6cgDyZgDyZgDSZgDSZgLG/Ryu6 +OFF0aaLUZrA4UXRPnYA6mYA6mYAymYAymYCxv4OuizNdlyZ6bQaLM103Dt20U5noOiFvp9gmoDLR +deWpuq5MdF2Ps9lKE1iZ6LojIY/TdWmi6/JEr81gaaLr0h26rkx0XT9GP+G/n0zA2N+jdV2Z6Loe +aZxMQJxMwNjfU3Vdmui6PNFrM1ia6LpxAvJkAvJkAtJkAtJkAsb+Hq3rykTX9UjLZALKZALG/p6q +69JE1+WJXpvB0kTXjRPQNFOZ6bqdvpnpoJkSGns0VE2h8EODkyYPDV7aDGhPfz7p0TClCaY0wxRn +mOIE09ijYaoTTHWGqcwwlQmmscdNcFpRn7McWLUkSXcAQHNJHOpwmjDynDBqbBVJuT3NXXH9eQKa +GLgdCMGdWdzki1OXPD1rCPFI6MxrncUMmjxNvM49qeEHIbUcSZ25eDMHOx1JLXNS8w9CqnNHWhvs +IX+0Hokd+2syMAa/nkbuGDnqxTUeZXMCeigO1Qts+EEE1k8k9iEXcBY1m8Vtepn9NGrHuEQvtA/5 +S7Mo0yzO0Yvtp1HbxMzP5PYh92IWlzn0eJDcT6N4DAj0kluOYjoBPRRe6CU3/yCSmyaS+5BBPwuG +zHzxXnI/jdrR0ewl9yHrdxY5mDmuveR+GrVNztJMch8yFmeO9qHHg+R+GsWje9dLruLeGwQT2EPu +4s5MsKTJpwlvT26ckdusghnwIfdqZyx8GsGj89DL7462NCN45g/O3JGdyfBpBDeB6yneNv6eujoj +eeZBHfo8Gg53Ev1geQwTLeVR5sIcAyt9BLweg+Lm5xzjKndEDzoUYYLCT3D4I5IwR5KPSPIESZog +SUckeY5kc/gmTuCONzN+TRi23IHH8gWTWQnHKZiA/GRa7opg+8nEhMkkzGB+MjN3BWr9ZG7CZB5m +MD+ZnDvjkX42PWEyFTOYn83PAZUFOScTlI+zMQGlyQTdFXZLkwnKk8mYwdJkgu6KLqXJBOXJZMxg +aTJBdwZR0myC8mQyZrA0m6ADKltYXcCh6bU+tmALdQLrQwtjfwfd1uEJMzx+hshPMI09HhRchynP +MKUZpjTBNPZ41HI985Yp96bsm/Fv7NOQPbXOJU/qXPJneIXrEiq/ynWJ+vahUJL8W592l8HY520H +035tF+9x7WD27OeT/gDbH0Kwgnk9/VLsApb+kpkEged3Oqy1bPcP4LyXhklXC+VGOx7YnQq051O8 +1JcutR7XSxQxebyRUN4cwgigAkPdvj87sW24a2NdwEAP9K99N44869C0Nojwyi1A3Idxp8czthlI +3Y/lmYnxMEUbh7biylY5aBf7dBweCemnvUQpfMOrv+u6DXA24LFNoytfukrz28RhCZdhIRvzWU+8 +NsqX67INZdkh2P92IHHCz6/Pl7O4EgFlncjZeWdl7PlNzlqPMnmxEH2t+ySHhXpi9w3saRMf+94z +ZGyDdzXHdL8oj21GKnfDeCQPDd9EEo2H3vyM3E7wHp/v58BgNs0hXJJa3fgw48vYptGlQmbfd5J4 +aOQv/ZLuF/mxzUjsbAIewU97bKL7IIAoFPVWG9pKZ2WF949vItk6lMk2uTGwKfGe3LGN/Tt91hbq +2AbokrtP+McmA6X7oTySjYruqVI5UHu7gWyas7tcSqeBpzwZ2hhRKm36dSeRQ5NY6Sea9Pskf2wz +EDph/CP4OO77j91oRvG67WBGIQ922VQIGOJrCbtRjo0aYcqpZoz03BwbNYz3TNrY5kDtZME8gqGm +Ungm69oYanB+OekSdlYL6+8cmtliz5qqse+92WKwhg87jZuYE2MDNUfsedtiexxjm5HOcSyj1bIp +p8esyZGS3maxNWD2iGA4Dnb/ezMfaJ1WNzfPxjZikMjzS9dzDz9QNeHhE8yUUWS6EzK+nSy65/le +tAxmUyaGiGFQndHTu2/QSBKhOVoQQwOzQO6T3LHNgcRhGE80VA7CZ3psPV4eeHy6n4MG02k2E0Qw +HHmy/73ZCSpYUx9kbKO2x13ivf99pG/G9CdYJkcxbDHZthVUXdBdSLY3UE0KDWZTvDN869p0bU/x +2KaRJZJ2tBrGBmp13CPrY5ORzHEoT7NNDoIolT9ddVAB8yQcv72caE9uZ5nYNJvVIf1P+LH73cwD +lbCJtTC0MDR3Sfn+94G2CbOfYIw8bf8Yhak3RZoNpVaG6nEzRLbR7Rs0W0B5M7MNxja9XTabnv3v +BwInK+IJ1gf9y2Gsx0qfPd+Hi1qfahWYBWI4TO3Y995KMVizGAD3cwvi0EbxWR+2y/Z4xjYjreN4 +HslOQ9nrtKeYNP10tD5Vl5vJYjhmrBnbWB+846xzI25sIwaM9bDs+t//dqBwwvgnmDcTmbT7HVa7 +zSVulyEcojC9TLY+zVJl68UwqBbq6d03aKaGitrM9BjbmPlyn9iPbQ5kDkN5oolzFMezYgcjxb2N +Y3NtNoyhmHFmbGN9mKRN3ZaxjeK7T+rHNiOtsxl4gr1zjq7MW+J8u2WoC/qaXLY+dcK7YLLlw1m9 +9ySPbZr1oYI3s0YObdSiuWcFjE1GUsfhPM3omWhKsxl9OxFtonmwevqpsA51ss2qMQRTrgxtUrur +jmVuYpwMLXpL+i7pH9sMdE44/wQL6KkbzihfvQ3UAptq4jR1b1ZQP8qxkXVinJrZKWObPmJ615SN +bQ7EThZMH2roF99vTl0e6lFpkmW3M2M33NIjhmFmSoxtGlUdfNw5xzay91oPy67//W8DfY32J+4i +PeueEtFfdhuIEGVbg/U92/DGNo2ezsg52JNjm840uWtyxjZ7SrdRPE3RPZV7+vjS6zihyLSX9TxT +yGMbI6YLew3KZ2jRh6zumqCxzY7KRv8TNduEb48KNC87nSY0mbJqC8U0Wj+qsVEjqE9xDppmbNPn +Je+aorHNQGobRse/dknQZnewJP2Aye5HBpp6FduH9h+dzH58QPbr0x1Jwyfk6z8hl2dz0i7wicM9 +bXel2e9i0X103pVmPyMPfq/sfHoC+5HBob1CcMY6rGtn51Anc/voBPbjQ61fn6ZZvw== + + + JyTon5qOu3emHsOV+6i7K03+kMT/IHnlx4bCHrPUJnP36PzyYyOjX5/mCc6n5M8/Ie14r+A8gi/3 +pvfnqewHpPoHS2o+ITpwhqqZZRSfktt8Svit38Z2SaXH5m+fnPO5V2wew5o7SZtv7mdkRc9a8T9I +WvMJDv5j1HXPvqfkN58SSut2sh79YxO4T0vjnDVzj+HOnQTOt/hPlfsfKkv5lFjHGRprMq9PSVY+ +PhDWb3U99kdnY5+c3jpnlzuHL3fniWe7/wMS/4Plw54Qv3iKI9LH/Z6SG3tKQKvf6XaphSfkAD8h +5H/WdncOf+6j7y5L4KFU2Q+Sw3pCKOcR/ljPmqfksZ4S1uu2sh79E5J1Tw3Kn7XLn8Oa+6i7a5d/ +SKp/qAzTU8JYd0zNU7JIjw9a9rtRj/0pqbKnZhgeMfh7M3XzrfgBybzjZFHE9y9/8/7d7z68effx +zbu//OxnAuYDR/0Pp998g1+K/HL94btv/2r9tKNHDMUBpM9Oy8UV/f+//v303Wl3vmh+uojPFv0s +5+ovE3bLEmq8DPzeQIIuHg6136Cf76EFb9elFfL5vos7wK2PdyfkdpBP1JdEuZaTNUiVOrW/oQeH +q5Vpn6eOaVb8EoU4hzvZcS0yg3GBPYCOxCpXAfL+L8AQirYkwjA5Al5r1LbUvz2eFBXbZIKoVq+P +440A+jjeipD08USCp21TXRUYECaeDuDZCaLxT1cfPj5/8/rjm/fvXn34/uLnBPoprpsuOaXPLv7p +i48kAX+5+On19dXr19/d/v79x1do+tnFf6WG/wf9P1OxXq4FwQcem1905gjsA+I2DCZOKqza4Nzq +FdaxZl2cjm2VK8YFHErQttswXM7WaSwx6NiWvD1fYjk09TSrCozOOh3o/wF54y9LMgnx/H4UgW4U +h7UKbbSIXVWCfc1RgUtalAt8S/gz7WAjeU0hadtI3DGgs173BPyg855IG6n0OfZ/BJwXm+OQclEe +5+hMqt02m7qKsXwuXp8OQJVezHAOR9hs1nNwtiLjqi1LrbbIai33MRZtl2STsCYjPizKWBJVE9th +9P9fcDY60wI5GGN9Mokum5S7oMyuMTfG+saG4mnstsqyjpe+1f/0oXlUY7E+X+mvtS0Il7wTqFtq +0ClyKwtSdWLSCDAEvNgdQJ+813mjvbzgXn2ACSq8CZfFsbYArhRkRWEHdw2YTJVGassiVqEOVpGc +ZIykXpt+T5epkRW8M1WebSIITBuUsLeSEOYivbK3DCD0GQwnBpLs6fwkWS0MztUpsT4bVdHr856L +XgToY4hNdFP0RQigzcs2o6AgNttlK1hJ0Shb06r6dqn8cgEFE/xCgKpSAKyiLwm4rsEpV2CnWQcb +fre0jWupkTugLSy2vaj4KDBmetsLtVs+qGuivOhsEVdLMAbsZeiHE88FvLX1X5xt9Eu4XNaiuhnx +fYH54FlRkTUGkfs3bhrJD0im2+GyCjCXNCwzHATnsDh3ipsdhY8kBy5G7Te4pG39UpwAae0WBZLr +VQQY0mITQciyGADqyChQuMvUiqJYWjYRFKwltw5W1Xc0/042EpyUWrMCSXMKWbTl1JS1JeymZ8rF +pCYQyUrwq7ZN3jQVW7hTfv+gc8liKHyQl2YLeM1O+csWuACDzwYsjbg7RherV7ZH77y11e0Ia6Y0 +9mTRrhU72NZBcN7AvhoFa2xkqaro7NwKK2ltHeiqAtjXeGHD9daBX9PFlAc/oCrPpBMX7Zv1gOjy +Ks6IgCtzZ3WiU1UgMo949djLTdBjUFVOYB+TCo8PS9G2Ia2NvTkpMCWT0xDi1oGqfSDLxWvb2jpw +WVYgLix0wZbwsqomXUOzUiv5W9naphy17ZJl1glYY9CxLtBZ0gHpgOiKtRWtRUCyOKshW5IC1+iN +rNUkhMGxgUttbXOxJbxswNq00FpkMyEwmUHGg7AaBT6vSq2vGwW5CS6k2ShwybRQQr86rmRts1hX +YIHSVDIRaugXH3Rmcs1GqsvVNEjaBjVHH5Zoqo2mRtvGmLQDahoVmNdiIyUJbh3UYh3QdifTlbo1 +5qN2kASvyqtZgmi7mnCRwWrM2ua7A95BQWzMWmGh2rhqHsTwbiFYmhjWYsjUUurFMHZyjHi1PZ9N +XnSgm/NF6kMWYaaZMk+iLmZPEZiHt+0MAvRrzNaBTkoWDbTtYq+1g7o4G5NTOguXlCtLfDVg0nVB +e2P2ug0SOCejIKeYtC0tR2sbxZ4gYK3RmVnchk/gvK5dvwqMZsqz76zAtebOMm4d6JZfFlVDxN7V +3JicRPECGG1jY0dBHoc8G2fzItzyi77Elk3rWAzIxpna20k7IHBp7DZa/RZdqNKVAEM29eqSUYDr +KqtTZCWI0UDAXBuyQvv4v2jb6p3tzupj+RUOuam3Ii4DAb2v4YBslRbbViW9ltY2q58KslxRamsz +WzxiIYuahTSLQVmz+WPqujG7bLmwyL4+3dV02ued+Ce0Tkd1JweMs6RdxOhBZK6G2DUV4Gb0pGoS +773sVuKnlmzcJgvCfLEsoYK7CZhM13RiD0Jwr8AMwvVvpzsFcSqyd4g39RuLriXzbWgIwVWznuOy +MTFb8CDRJMiE0zQtsp1lUgbinQXSui4psCTZoyLNYiwKJCnQUEOMuFNLwWSQMW8jjWYRtZ1Ir4ve +SYhlybiS6F/uAHdJiXdSYPV7Hm6mP7OoA7zYTWahkHAtQSOTdbEhFLI0ipiSXkgEsMoL0BhIZgQD +4dbqfqyhTWZiVeSrc4y8QobM9lcZJNi2O8Rk/iL1SL4Brw0vFAtudiTEiRMbEt0XcQKpp1L1eY7W +cZQAXpgTk6x42zfqIkoVQFTjFsXkCSWPHTeaOTaSpBVi24kFqpK3lSRElJIZ6zViXtS+SOCxPBub +eZO8CXWNbUCYOdlyCMhhRCY+ktXixQdPskIhO8W8PKKgBAkiBL4+Snt1ZuH5YlFaQNVbxov8RPrp ++XVNokFC83aJPux5tti9WxQc1UTk0L84tsSCEGz5VPEWGOjNxKp406WBfbLdvIg8WcxbDZzgFNVK +HbbtbZFYKoGDmQMwIpPONXnqRkER55OAJUadQFC7sgNM4IpVpRucX7NIRRLvF6TWoFEMNru2Dbpo +HMNc0hURNlZBIHaRTld+j6S2rCVvRkpoHdSSzMYrgf1UhEyiTAJnX01WWZibhdQIW8hZUmOqeKej +XXyzsFL2FsgRP+pn4hQ0wrKaeB6ZKA2PhBzMVSFX3+IYtOb1eYRFqwZdShGFu64WCAZVmweluxuY +hfcpSgdtL8PAVjVIrBqQgWb5OAmBCdBbCmGV96lqv3DCBKialfmi/stimhXxpdrMrIVY4BRsZg46 +cMJYt/lwi1l00A2YOOsgVGPNovvAyvlli7yFYNG0Ip4hgNhdXp/uantXr3dQMKV2Oq4ZD4gwJykX +TLnF8/FCVItn0UKx4CFTKEGuxXwF1xwT2ClFlg0DJSC4tAUKYBtCQK8WfVwkJlGlpkMpqOJEoS0C +jT/j6KPZ1VVuz5UOONythC1JOyhm2xOQfECnQM0oVD6lUVoHam4TeNV908EOsVBfi8BWvV9H7Lfk +WwchmsPVklm0sztzmjncq4N1TlEtWOLGxFRtnys6jbiu0ls0gsyLIOYuIruLGTVmJnTh3oVfXHsP +v1vkDGCNsTnyDjd2ZfG6XIvGAYgXnLYOmq1Gtp7TgQ0RlX/7waI10HUIvKjvZZFNKDZvoYp1aY52 +0HRjbbkzRA/UBtqFa6JtOb2jl4hXNsVNsSbyvcxPZovRHO0tsML1EgJcXbNjUlPCwxBe/zDs+aNk +t1+8+2qX2z475X3hnpz0jmKCZL5c9GdkUSZaJ7IjCPTzPbTwi7CzJrbjFNKe1Cy3vtrlb9wT2dqL +xIyTZFpuFbwWr0brEj1mHECOfoklm3hvANBlp8AWFE3/L2PvtqLdsmSHPcF+h3VjsAX/Is+HS6nk +C5syNoZuJIwQYnVvn6h9IasRfnvPiBhjZFZ9VWubpunV8c/KL2fOzMg4jBix7aB2jls84uPCFDnc +59neJ4SP+oDdugrcARN7LsPFSBuaEDbKI9yjctQ6wxQeJ95ia8Q4juVyasfSzbCOXOwmEVd0WVFX +mO67xs+NuENjiJX2b5/X3gJY9fzcXhUDPGZQ07i78u3ceuAsHs1CY73xPXoLv8hCg+5b+ursxHk9 +CkurM0acncdyna7KXbjCAWoRPMeoCFG0ZxtU/P0yY4zSCMDaoytzDVZvHd931tq4E/o8AzwWNsQt +49GR+CFSW+u3bzeYRZztH8yBDvX8WE2lY+M92q9sfB6/TQLgkcJ0irVZux9xWIe2SXqOIHmKaFZ8 +4RH3f0qRBox323R6HnGf2iTxyj5qi4CAKeveIIQRZcLNm9qeLUlnYsYMsmWguRARcH5k7hS5zCM9 +moCWx/+Lgy64l66OQ0i37VnImXjQnssR+BDbrS12gsXc6Z9Wfkm7fAdPql3p/JIbbzton7pQMwiw +hu+EXrQT1tDfP9qFL2sJ1BCuMnHS4Xu5cBYKF+JqLt4Z38vdpHe8WKoLYlypJvT7J7ZHyRS6lRbC +urbGZQqmBfTknT+HHfZ4Wg06ZGsfPN4TX9hMgUX40EpTK46D42Wg+DQj3qDFpL/b39z3L8tIjcvL +zMRz6PBtnrJwXv7kRH7/7DXqEX79kH9FAAT71ozkgjNp4hrr4LZzmH29My1pVjZityasq1+Wc3jX +z/KVzST945/H6TXxUkIfGZDHE+ccLHgUIYtufqaHgR7hUMjBum1kGWMI5z1Cx2TEsz1MxEfo9w3y +ziNrAE+CxbN2ut4hXgFVshfucf56F/wgKfdtT3bG8zx3z3HX2oPiBXXVRzjsgUoo/LVHS5UEB/E5 +HxO/9ph/nELj6n75PPhu7kaPRkMVn80cuCITfkXwzRw4OQYeQOGTjGru58pDRKiExx3iFXqQDjOM +bUSjvk6AG2pEXubEhD4gholnPrnFNbg8vSaIW8KXG/Gf4afmiKm9jssfrBaaGHFkN0GDIcWR3xMr +XO8QXAuT3YQxMONy3MB7DhxwV0DvEtdxiSn0iMdXYb6FGjcXjpsj8+ubfUFvcYVfXgwvPBqv9329 +sEkDzbSlzlyIT98UoHuEjxmlsFHHC/uzY1Ic9rYJ+xwvA3yeACbWLH0UN0iKYIzPrO3AOzziHGnt +d4hpOmTitB4ZQY7QGiFcJb5ajpDYG/5+rY5nceP2FBk1l+lDGAClcdBEDWW/VRPEvr/jAycZoVkn +wIeIO+jZkT2icj1FUsiF04L1bxxgNABTC1BA18TK8zYBe7QZtDBlygUusBcbgSoxfHDPeNaTqCGE +I2/CygFamkUDpFHwCh6LeP/+87zHd7O16gmXQzb/+YPilmG+eHDuXeLNp5G/8iEyhRa6/nbct/OD +acCGM0Pi7/yeZz7j6ioBvbM3iOCtj7D3b98Ne1TSQYZ5QpYq6Tl+VM27U/eUuhiOgw== + + + dfid7vlZt5uhU6CyH5OrYATPzMcUgCd4nde5lPuY0K1++3782RWj82zBfcvJ60bbSmYBcOT3SYF+ +XylCo68/R01Tw8L20+8peKoa3ICPuFMpVC6+RbNx9Vg8vlNT1EV00QDsPuLOOGOPELkvCzHP+YOm +wbTSQoR6jE6lFj7pRq4iHoR75emAnfX3M1An20BZ8YWeASrsjR5BsRAC9vkIjwU/eljjvgCPXuAM +ahxbywf0zVGLJa5jBU33cQHgKj9iIqlcL1MBT+QObK1LBN57LDBn0GvHl/GEwa/IlGxmSgiveoQz +V85VSzgjQBfDAlg5pg5EV9j6EbY18FqLEZsx4xL3SEMfgVu3nyoNGRViJcfQTCMmEX8/IuMRUgSt +h3lJEfi3VjeD8x/IMV3BBhNnGJLwrd4hHtiFQ/bEQDgi1gVIhmcFd+Lnch+FC3u+uCc6QkjDt8tA +NSHeNQmOb38Oe80mmAem1WP3x7RyxHEtg5Xa5uZKPAWOi4lxddmZWEuDDK5tIhyYcbZ84z1hWa01 +z4mDz2pvsLS7Ey73TkijHZkQdAFjH5m/dPwQLLdHSFzqsxArnAFPtU2s3uQOyMqQQK/HqI/l2xyz +YW+asd0tB9JwYv16hjAuWhtVW+i5zEMb2vLluIceoZ/z+K0cRvQjLINhsWY4kRgg0dfbiA/88twv +XKrNXDDPxAgID1X/D+bsxC+V5zDD/hiW6weyWYp4PIqjIb9yECt9hsmwbhR0N9CNEjRr8E7apd83 +CgdwqJOLmXJ4hHkw90XjoVvGnDmmNvTnvSy8l+voELaxcU9x91pNXQTVzMETet4K5zpTX7S7Rwqs +mStsRlfs+4dZaDpwS7c+4pGZQcVOF6xit4hAYwOmxgfNDOJmzbngGvHQIwaoE0JmBD2jv3gLdUIo +hlUfFCRQW+ZvuUkdMqqVGiZqXG7zvp0+X5ows0a6EO4OZ/qgeDN/N0vhinmCLjbSxuZOltnn7jIj +i/u49LK5v8L2MmHek/srkCSvM+BFXyKYHu83iJM1MW4Jw9xPnvFSJp8FyPTzk1natHhDHIixG23d +08wcYPU//xjXs73xaxbsXJvtb9++wLH9Or5cClwDbT+E2zytlWn7Eb+fVABgBuFiUstB+1QAtSpR +tLbsxM2YBbP/9lMjI/vjeogD0LRJhoigVqDBYjklBBxeXuG8G2LVHmPJVe9WJnOZ3WIG1E3Hsu1A +FnQlWVwYFQPf2aUQTwJDcAg7brmYwhhass/z4jZbcrV3JPE/IEY40uxP81ff+TQuEwtmxDYxdF5h +NhFX3suo/LmuWJGZpCkfT7nIUj2OrseI/Ghc5h+tNxP26zIdVJJ+M/FGRBTAFCpvxBqoYtwIhScA +VTwmPEZdiVnGuAg0DsvJDzzrULU/OW5ZFzXKQUPIgJf5o1CIVsyiShNBUobXPPLNUPs0rFhDFwUy +0z/rIo/bxrMp/NxuDnzGzgNm2AaFli3+cfnnJxyUWrhJJhy60ugtWBCdwTI3gLkCtKlyWDB42Qhq +eTwpLmCzSiLr6bCJfKyStSb2/kZ6wVeLjp4chhzOuQvHvMyavc4FvHl/5MroIlHHdqlsflk3m3R/ +LKp+IvvNLKtbr9Bpq41OIyTZunF7lkldyHSsmbsK02phuiBQ5V5EM2IJqnneZeDZ2gp+zAOGPGEH +6jP191/OHW5AM050ev3kfVA8CsK3XtoKoyNJWCN/bMJCldCPIz4vvXsNgDjM5wG+zMB0xb/6Fx/F +3PWNCNowTf8BcZ8JiKwGr8qEeQ1aKXEvdYNU9v3VIumFEaVddage4Yj8gTl7czMUCXC9zeDEvO3j +0N0cOVeFIiuOVaOh4jFDxvb8HvzlkQDqoHbSrR4JDyC6o+2walZYVTgFOIbdyl0azB8/gQxl5tkq +3zfMg2eyfdJ8GsDHP8LSeI17gJ4vhjySqbE5GPYssks964Gfgl9XzMnVG6BywB6dqX95tEYiFksA +L9Km2g4GcFUuuOesGJ4H5Nd85kKXx+IkUC7ADmIIGNztU1JkcGmfrUevoTNxR5M3bsuE6EsLQxr3 +6u4Y1cOy5wqeGLclhaxo3bf4KxgNidZ1ln52q4MvzMKYDq9o3dEIc2UAPfoyA+qRGv4DXgEYn2da +8NrMGIJ/ViM2w7NK46LK6zUXSd+hTTkoScs9Gaa2CQAd2O6/d2qYePRkDJjSeYTnm5t4wW8E2sUd +pIkXIKjfhJE/3sAH8AVSYkAEBezu4m241+nYVnQGn+0y2vkEqFWwSFWVjVcDi2CeN0Jql8HVr5J/ +20WIBRjwNDEr1RF17KpwNm0gD9d3hlIQEfn2GTQO4KAPF7Ky5iRBzMm3sySFhAWUkWpucIj8Tgp1 ++HjADCdVabMcEIrYWFXhynwpE3cFMMSi0E2mb/W06fD827/F1BCdtn+0I08lzlgJNgh/1I83vruU +laPfPm+Gl3H94viHv6T43dTC3w90ha0pq0aJL29xnkLYgUU/ut+EKAVtRnjMQswmhMiZoQl3QZ6Z +zt3rDGAG16kaxjuK+4jryhi5KZpczdnv63oaQ6CY6+id13H5g4Ubf+Wrdr0WGkwLYYR3iHuEbDxb +EaZNLcKa5Ij6fTsufjBNRbUtDDxY5jmFIDNxInPIpK9oYtxQJgxUpq0eLnQTDub13LN++/7nYN+U +KrgFCkQ/KK6EHyBeXUpcpC6bNUmI3GCNjUGI8AbgpCpRUYB3DiGwkq8TOJ+E4Iwc2Ct+ElxeJsa5 +dSEzYCpQKsqnWjiv4gb2gpe+OW6ES02IUs/sVuEP3+7beWEprbKjVPyD3zgfFGuYDfvmEa6cv6Ts +TDiYnUPmHANgwkXJcBN2vsVG4Pt1Bm+aWssb28oRD5wa7nwTj7gY6lYtSosQMIShau3gFG6r13Gx +Fu25XYJHcJXAt0Ze1QBlATnCF3uHGNfmKqpae4bYGNvw5nFBvY7LRG5icN32ofk7HxAjOLlq2JEQ +RqDJhIDnthQ3G3LqtIRbEuzXUjwdjxJM+GnQLxPgSS9Kg84gOPmAmIn9Kd4TE2JbTDGkuDDOHYRv +HKCERp2Rxnn//ufeNQ9gKpiU5DxSTsBQwbZIiMNGVnJGHCNZpVnwa3Tn54hZ5ACUQApsW4n8wue/ +f/l9LJBBs1fCJrKBPyjF+nSVheUDCOyKVhk2PHw/A1YN+gqPuA+WOTHcZUIhqB6PfP723QT45RpL +vS1ibg4oL8gTkhSczxyWjmeBOnUChqg285IG1k/Ys3KCGXGwH2v6MVwfrzM4U/syMlkCaKgVpbNM +WFWxAqiRURgEnM2DGeMU+TvIJJ5tKsffm7NgOOa7d4sbJakSJQd7yAfFPbEIAQF9E05CrjyLEkIc +fBPOdEo2diK+iyrTBxhMc4Mr5HUGXLUseKWRjRVeushGrEBdRgbhe9AmrIDYam0NHYIas/BLdxIJ +yWPbCZVzIGV4TrbV7NMTX0kAXJOuczTpxKhtc1AvOnRZUdmx4UZjR7ke3vytlWgtMZqQFG2yQeUX +p4NYaBHbx6zwJBVDiohrPKYr0X4JIPsaRmsIj5YciOmkJDOwBk8Yf94x9GEEgEYmFVbILMCKoN76 +oHFZxlGGJTJz9q6oorPPjRm0SCyGsABWaKZ4Op+QYNYexYDvVG+RcnUba2hiewCOm5BJTiVsjBCq +5M7mADxsDyQPx82lQjnpg2cmohzmG4GMH9XuhO0niLn/VifsdG/Y2C97/txLtTJwv0xt8j6ohUEs +V4u8VpjVsKehs5yDjEJuuyJQRApL6e37n7tMhcSclFMQfVC8GYLyg/9OMWIXNSyIEDKKVRmtfR32 +vPcepFjzK/9D4naL+d6ExC0FjFxYx6vw87g0TQzmplpK+2ofEjPoQz/LhXw9+38pnJ2vwkiSPzrb +66NHeA/6aQKcWY29E5al+aofEq9K4zScPRfu+dmMNeGUbdtkNLW44GGchm1jwlRpsWJ3vs7gXjTG +2S4D8hZjiIMirMKgfPfKL39+PQtMgaNsfvv252lJV9XHAYH1QfHm5cR4VPXNyMi+qYR/xLNO7BBi +qI9Pz44SCevXH+MsOu+WDf6Aj+/F7xQHltzEqNoyYR3I8S3E92sXTAp36NtP44bpthkwczggvdi8 +xYJYnLoyZB0F5iUWI4SPqcS/F67TngUJSVGKzwZdgh4i0fI6gWv/fDoz2j4BijTtgYhNa8J9Q9NA +GFUqHj/OIAjxZ49WgutwIKv1VGC/Htr4dInxISeUohleU6AhQwwetHoqLJYOoglVcWg9QvGN0sUF +RdhrRfXf+kJ30HImGYsW/XViDBHs8CNWUBuhFCDqo0kcIbIbo60RcxPLiHfUO6xgy0mnlBt2qbOD +VVZSH7QfP71VUufOxZlMfNmzomeURbiYFTXeBrj3xsBSyVjqWcY3vMIZlzaeMaAUElowMPoIxxTd +p6wGW4NMDhbkl+3RIh5CsiBtveuKhCfX/Pw9gxnloIRXAPziSQDCQBHJv/eYSzwqf9qHJTmN80G+ +//SFIQZ4dyn9V08hkXHHSVbE2qjqJPu8InNkWMemAINsQ1G/7qM3bbAv+4MbrAoN2pHsKQLrOKHb +lHBXcTRNzQvpOJMiKOST/UoI990GjZmJkMpLN3hYyyk1SaqcNqHqcAm4MTakRrPJv+UfGKDEd/Nq +ZJFieZ4VAywVtX6eAZEULZDMemfibQlI3qHAf0UubDGDCKfQ82NcnEP/8ypm3m72xaVkFqgSzuXr +qxKWJJq5gxN4mS0vkKYqoRlQgQ+KEfKawooaMSYqDqaworkp0DiDJOkNA+zaQJJCCyQ3ElWYcAdK +PbvLj5PpmD4NkHmKFX4401p0iV7fgHtnySFYERv4gHgGQMMZfhO5nBj3WQF5+ROltRRPXAFogDBR +v9Dxf53Bm1Yd1soCmwVXHVmKi+vtEfZECjry++TGhL+p+XvVa+E5JPQpt4swj2QPuRGHvkD8zgEY +595ih7Efi5iEU/mQJPXLG5xXSwHH8IGZEc8oG4G4n0lQNP/OvBgO34fU9fOYTQN8/v0rW/9yNlT3 +E0hbXqQq21nkyHPvVWIowCULv1cVnq4DAysMmKx1+dqemh+8MxC9tAz2VwZiK3wbPAK5j5OKAxaJ +Z/MdwwaxfhwYaJ4SjBcxBJhdLLElYuKayOVgia3G24kgvQ56Dxf2onw9iq3sSZkDzwArc/NksOla +xYumxdRnelafdE2HwtQAEoU8e8riZ6mHHfodS5hpubhVy5UhTd5SiMuXgGbS80ccoOgMr5IPuICw +MNguXNpnwSYNtqwasMlnUfX9RX0LI9XLBTZxisN4MxgJO8XnjaUhOC7FOfm7CdB6J9whBPwYiBD8 +WCNE1rVajJuiGDjylkwBJxZ+GhgIVLI9CchQ7m9mqEeirwi+ttKnxdAkPQUrUdqVwLguSqUUv+O1 +UizyIginBMoef50IvaJma/tCvB67ti0lbksEeuNZpDodIhUhcfupiJvtckqNfQAA+g== + + + TxS3LQYi6IOFENrGKVxYEmniSVZnxGraFPi66HS0FRiW9RlRZs8qYuxXCKuxWAFR7imwqqFEYX4I +6VyWINp4w9JmlIvU+Jy/UPrV8bmJNfKVKQIKdf19Ur1fAZKjbZIUeBwkkRQLhrF7X/MsTMW8qrIV +NtlGYFSGSdjYJ+QzHKYt0sReJUNtBYpmBfYmzME2r3oZGexN5AUO5IwiZX90wH/sYLGxbyhM96mi +sWdLml9257ywSgz/mhAo4BoVPxygBLuF4zBzVgouA6FQ5XdZDE3gTNIDfxdYCzE8JOKmGa/DdeVc +4ljxKZQI8q4hHIdgXCUPj5jY9BKhVGxQldtSodmbbbJun6pYSy5GMMrE+awYKKyKEC2+jAU/VeXf +tB5BkxgAcFYTQkvUKNv/5T7/1JJ7mJ0DpE4xU32tkyPIXheQlHZgyDVuGw6wM/HrjIQbZyCKxats +ktYFrK8BuuQAjqqOjwO3vPUrVjhQAOkD/HZCIfzza3PYYX1HMAT0C84GlxQMWTxivLG/C6dB3Fmj +QA+vnZqya65NIMF6AU+bwc+YxSLsswHjHzsGbLVNjRdsuaXoSlyzMS+Yhc00RsUbEObeDDjIdz2+ +7zPAoV0j1qXh1onfQvqzHZa8u/SiFcY7qKjiWfK2odIbQqDQAPxjgno1LpfDOt8hduBniDcz+3ty +G7EmpW6VnwF66x6qQQlUnUAegXru0Po7uIGbSpXtwcPquYXaO50J6lbOsB6eTLNCqbwSc6TV4iH7 +rlR5hxgRG9dIETOq84rV6bem8qn1DpNNBiFcAdOSMbHw1jxhdagUpATSI4SsQCsRneO4hA4erHEV +6sYrcxFjXQxWePaXZ6yumGXc2XHn24thEXJMNoTE+KXIEsXfDybijTuCeKeheG5WIbIJI9rh7RHS +GYBlfJaARZR4iKkvhRcWwpMLOrGoU5eR4mpj8LmWkyMKu6NaVIN80B56+RWck5EQMataG6HdBSog +T66dfsVGkvTXd1FqBq8PBUhPiKwOkrAbLwgq3usg1sPNsSv6DXIk/zL0z2oP5QLxxBRm4m2XkHK1 +eQ3Wwvn+57A9qHaue8kGTZkchtzfPbwcf9IvDa5MFl/JQK7eBsi0XjvcMFtDWa8qsHykCCTbCeki +/oQLYkLuGIPs8QJr+VrYxppm/zJcFxYPGRCmcrnuzBZBMxWEoZ/uMMt6yFR2fi9NF4DZ8jsQiJY1 +QVFJDgAh1qWp1cliUqrWq8qBzOZGaiwOFcI2XvM2HMBpj+PZrskyBZp1t9fKJlLO2MheKbUKkFmU +NjRC4cMc0sUATXcD1ljMwMggaHpt4A7LFj1kVamIhX4WL7ZTwHqRl1ZroYMzagSsjRD8QZL/GX5W +aD9GWqcKCEuEMN8wwLHHJswp4zQFWezxDIzWdZKq1U9bDHBr1YlyS2f508FBUt+Y+1Wu495EDADc +xCddbcJK14IS1tXa/ZFJSGreQOMdpHIu69+wuGcZNSrlro1F6r7cJQQHTlOK3qA6QdU7pODI2qc0 +sxTdo0VwiVLEB1qu4hF7NlKpBOTEuDlqycJ+nfmIj5GURIvqHD44DI28l7xHc3jQzMbtzto4boS8 +lJ4vh3lzq9StXJXHns4jvQTBCjYqQPGZCYJ01ecebEpJZM7zMzr5AkNVfCxs+A74g5dVYSntA3sW +nlhRbs0wRofzeTE0ZTOAiVJUfuc0o4cfOhOgRqcrX0xLearEGGnuX0HcKcIqx+T+cuLNJvCTB7lj +AMMg8Rsw2mNNobReDAWaEIV6+eJ/8IApj42DCN8hXovXhZN6U3wCE44ypJi+BSvdLDi7eaAKGh5Y +TLzQyKoKb9mPqWCWrGQWaB9VHkvlqKuyXNatHa1CZqa2r8Vna6dLzUK1fJ/8JaCWjTsFj2AHui7w +fL3XliC/ellZJxpuXn1eDEaz8uU4DNkuvwXIv9usMYD5NHR5mJTKtxeRA22dC/Go9I3i763wnctF +xFzOcdUfPZczIY3264XVljlHgVT8NVKu1rsxM9bCvkc5s2eEPVlF+ZsFc6xybXLWRkY9KeYUUDHe +9xygghihBsA9hKf8j5ngnCIPHkL120rserHR/AjCTifK7eR/j2dRtODuSsQe8n3uWfyU08UK7zdz +YJYsqdqho3bntOqi2009ff09thAne3aWYG2bCP1rt6SlC9RY6NRzaclmqZH1eYf4hGBYUJQWoYF+ +ugDdvANeJ1jziNm1rB64n3kgi1VsKNhMUwjNcr7CI2XMrrh3eaoUSEz+XIdHnNpS7BQYusEk91Uy +mob0RrnCmemQrBQyhvoAArCS6TqZb7QZoVSQN536J/mt9veNK64mcS+/xAnMQ1ew6NpYK7TGa9hD +KSbsiv5mJ6+JB1kTlAM8F8N2xU+yOjRG0zVCeAkBNw+AuF7vMsAB6ORbwKry2VloM1yj0j4pV2GZ +9UybMtFw8KwX3GBsbBHV11QQXa4ITurk7XJ3o+PRs1oVxC3Pg/Ra0R06/r5dJgtRK6cCiYXSEGZ1 +Klz9DMBYeT64xMaGHrsIutrVOAA1r/z7IZYr4q4cds2LVdDVqg+Tw6GLAapMdTR7h7ApPgmimJ8h +17xrwX3wy8GELPhXNMBgp4PWzYUw/RGw2TqxYxdI9Zh9pHwtomtKoCDDn0eKa6dw/mKqWdEA9kM1 +4CtcjXTR/xjcfzHvxaZHhrQGVs9QTJQhi+I5K+leuUCOGKhE3l7dqaaAl8zK76vs096gMms2aHtb +w7rDjH51Zj7xBDa4MoR7It2F6quqNmy6OhrY5khJxA/cMEBkuSyslVSvKIlHrt80LRK+C+tcaSIb +S0Q+e3OxSZn3ceYAvEBSpKXfsb1P10oWV5va6KTcrOCGsq6KOYuQNB0NQdKDdKCuIxItIZSKE8Xo +UntPG3WxIRsbhpjey6L8REGTCTdhbSdllPoFEkPFuP3WZidC3qojgs3xnOxmE6sZosoOJ7Xeva6D ++VTnPOnjXB2by0Kay0fIWEaKKkPclIeKxawNDjAFhwY2OS1RWyVFMf3+TnzwKKilSFVSR7Fk6S0i +egaI28wqiPKxQxSAcRfDYgxbmAHQeLwBxrQX2Ex1r+uqJ+X4/l0oBHsrdfVjTuQRoijbhZMGBG6e +z/t1qhACmVFeqSQzRmNAbKJBcIvUcVe2f10NHWy/LDaDssLFd16UAAXOOL+4ewoB24MWQIvBAM+Z +p6b1wDNZhJ6cVAXPOuwRAwyhLkjzfCkIRzfMLg1BlBKbCJg+xmeYYetSnf2ETxdOiZX0ppKDPcEh +GkNC9GKasYqcGDGQU7y+po4wW9vVugDPqH7+OQCBpzNgvyEEqZlXofW/U8iGi9V6V5ltogsMaK0R +MAPcgZjDEITLiiHQHGRcJd/nvnQib4ZDUrnIQHWiC2+2NQT6/K5iLcTgkeG4mC0azY6gEIUQmPlx +9TBK4sxwivNOk6FOFX8kmQyg7Vk9wCnaTCgX6qfcp2rjNSUbbAA0NASFkIyWzhpvkr6ZsLDijsV1 +CWVG8VPiTEtN7X478UK280WKTyI7+3tcbFdngCgHJ099nSnruhrYjF2GehdqtYsgOin16BVX+UyL +FbSHjzIpFsBnafd9KT2PH4N5YCVDXMQRi7y8NJQ9agd9Q6tkOud8qAbndjUQ/1o1NGQoQPa4rWFL +US/WkVRkjUL7qRrpFkVVITx9FK4+yj9WkOcwn20jrE3dzC4TTaSmaYhk2D7yKSBv0DMtGl2cYRPW +lmBEE0LTNAWK7LcmiayHSMlsGQsLwtSgeVyTJb+I+TX6jAdtYwofR6Qdb2VE/HN94jAAG2JsLrGa +XSZCU7LVPmNlKZXqvs4r9Ij6cwBaLiAm5dLU1jAEyctMuFkue5kTYJi3UsN8LA8Uf6wu5Jndu4lV +Zjx3U/CwfoXUzfWPWJePqsu4sdIR+dckAI9XjbUTIoAX58zENFFqhL699wcumyU8YLswA37v8xsy +3WLPts6aQho+k4kwPx6X4UQ43ikKTzP6mLkQ1twS9rFcUB97Lewhb0e9aDclshXIzF6h7WKmarOW +lKx2HakBttoXMtRlTeg3u6fUc2TMXpKOrIySZHEf2tYyrC/FMOm8kwzPbT7VHi28oxCC+MTbwGBq +W90xW2QmGYMCGsIJ5DUA4oDev6QyiljRprZHlocRO3g8pwzV/r7qzIBy2oWbNaSj6/d5ux8iTAsj +olFvVfDdhJWq85CT+wqQ5kJhZ+Uv1gn6pv07tfTR6Bavi9jqqiqsSVtlnSakSIT4l3GyifOxX6d3 +vkUdXq+zwQZB4KKX9Y2C3QOHsa21Gi4EYprSKVeo8U0UQ0TB7uGGsqUu5EbQR81EjC1v667PN1ul +3oVhkg9vOaCP/CgJa3rqgvKxrooQKo+QlmtVTM+iy2jQUCP+x5A1EeQ1anNCSJaZg5HJVZ2Myp38 +UD7WXgExGovaQ+1UFffmLmBuDe3LvAF9hRrxazwLE6KQSthkkfN0eglNYDCnchGX5PvmKurFdhhO +DvtiHuQztJOh4uI8pCAssYK8wQw3e5GMIGSj85ZtVZ92yhju0Unnl2egWIve1cTsJ4qELceqq4OI +ZQEL1QDxu5bZA0UCND8HOL2Y3I14R74MBNxeCz3HESdWqZ/2SJaJU/cBQhrLqcduimIW5Qk+GW0l +a380tRG0AWQXkKOn5ECmLLXA4QA0UqvYjU6GcVVxzXkrxSYlo46YSfQoB0pXTlF+VX2MCVFIViN7 +zIVkoV6T31uSUOKHEPfnkkmW5xbx0tkAmS0clEBP4sUoseuUJAV3TDlt6rMIlyyrjmqpTHp2Ozhy +t2wRERIoKmu1/p3oHF5u1ofTFbiohr8o4WOnlPVaFupkR5EzKFtO14g6cQI58BkLmUSmv8lSVaN5 +pcSyRxM3DbimY2ScKEurwyAuEVpnEr7iSJTIkIUwiSOJlrpn8Xv+qpWsC6oYY/xq4MQYKYCNpOT+ +JsMBGa3t5wZtL9Z32sQ2uZ4cVaH56iZzTj+CEdjRowXGgWKgHNzaBhyhsqmE3eUzkhvl+P8GKDqI +CvITna7CRc0N6PP8ckgGImx2/MmzaNLOe9ORBu8Qg3dzNVk+pV1WZUmUsXoGq8hhWaQPyEcIEa0/ +HD9FUF6flQAdXaUnVYi8Ig7lW9UMuWd3/rYMda6sqrGyASb7+biFDSE8wRLAuT+ZATT1iop9aMsm +t7NEup1L0DOveSYli9khBRX79JHL6WB+wcZKZW5+HfLv0hT+OATZpamGtMZUBLZptJ4aiADstybN +tIaCve+4wfBspZjf2+7gQe0Dx8r+PmqwF5hvtDcrlZIDxLAz1FvHFX+s6xpcllPoYy09peqK8oFl +XAtOS8k+TcRv10kwWaPQRWoymWplXGXvDvnnsOw6VCI2RdAWz36JCfNpeoNF9p5BsTatLTWtHjJN +S/gInEWRemdjQu/GTQ6yzU1LH6CGZuGfs9dYPa2Zp2yKKqrHR0grulw10dbhG+3pwQ== + + + dc3X3VKiBRSHBlxLtPkZdStTN1m98mRlXbvm9Oopi2W7bvXqW66rkxVDbF5nvHlO4XWUTUyJaYrT +J3xfsZWrips3VzsA6MRsozlTiiTVFGjVMHZQ11KTzOYqTp8igBZfgTOg53Wo8ItKjlZR7sPmelxt +YdPtdSu9DN69m9TCq4gGpBwHuJyGLVYIP0bnBk2qIa8Vwr7IaMC68nKFwmoilso2LboS1aSWpDlu +c7xplJEtOCv6BIjsZFWX2awCU227PvOl2qRNVRRCsLUKnLP7KIUEBV19tdRlGEW38QaHsmpFivCc +MGy4RJtKb7BUg18uwGdRxwonzRgEZtZA/K8ihtEyw5aDktArHOYEIAS4u8vmGS+wLO0wSdldr8vA +OOwSHabEBmXCdi4xJ2Tdo4upQv80Mp7W9cUc9f2OFS9w67M422x7ByhvZQHt7HRgH+YrMm7nA3XB +JWpLQuh8MzDKKiG2yIB51Eco48IW2XZsYQHWoh5v7Qb5boXWj5lV623VIeFnyN/c5Ns3EoY22Yqe +D+QMgGRlP09yjjKETPBziQhi/D0B5JlQXntX4TRMLAuDrqYJa5M6i/xVzTLc6o2ezix8u0yUmtVk +GO3k+CT3t0r3DOaMOFaJq/wdYrROsW2rGkyfLu8LhknrYTY8DDIGtVZHu+OM2BcDces5I8bQith8 +FjOHrSu4MvBfb1rusHLQ7vL9yzpm3a5VqAZTCWQUzVK0Oa5RrsNhH3Wgs9bhGARyUnw3xt1icDp+ +dgYjBEr7ieq0kqf7InKyFUMwpERDgl8BxE8MfBzgaz38Treh41B8tpz1CpJfUZOB6yarP5aVIzQZ +HkLS94svjuV7VnkwedtQL9bGAi27mQSsq039qqtAfBWlawvdifCcLuxDwGizUqQLGMTa2QbCOYsm +yzHoVeME6+87kzTu0LHy4UQViS61YplCP1OvNUQgXK8cr1fb0EWjEWtVKVewcXO2rM1HvEALuxho +GorH1KawGLwmikkNd3pv2GdAvh9HK4TndpnMtXtFhRxuAEetoiIxBZfgXtSq7wX+Yn5GV1FhDsVd +bJMaehSHvEX8BPO/CliABfVHEz8Z6iot9sQCli7LvEcEiMsF4iZP0SzWJtFD66rG9fVmVO2ENu2L +wyjtAcmPD0Yyw6bOTa/U1THAZBGnu46L9WyA815k2yZspDO9tvIk2s8icIV/jxKJ1c6xX4pMtIiz +8O/ZVxtIuhCikTEniwl85c6OcQm4QJsCFuqtybvF1yjE3xAGhxgQ5NXEMGolgFVZQJjgdV2xvtMD +7xngZM91Qx865EOQbTy/TaFQaZSWLgJJfoiWrqgcCweuAeqFV2sn1lYVrHP24PFFI3zHFByzZcSi +RpgzhP3csBki0n6X4zu2FBXLoamRiG13D9iBuHfLulPMVmUlbCaG3Wy3i9MYwUq7trgkmRTTSnU5 +kXTHbenmDz/riGbUfiV0klSzFXxWwvY75uoQp2PlNW6LJQ8CPaethrTRdP20Nz0Tg2uR5ZcLzkYW +Q5LVZOJwgPqYfz+jLZUTcg8WwaJUaZXDH76vD31gDjZuJ69p0UGcU2EZGF1Lqa9y0W5Y/edgTHaU +Q3fPCH+RD2h6QPEPpsxNOBnoOB01jC9fSVQcCytV3ZoVQLvVSucXdp+Hgvj3WQEJ7jUbALjEciki +ECN8XtYhaGdR7bzdk5NGlEOcef/ST1kq4/BCTVr5V/knKlzsx1BQbxo+yYw7Vv5Qbh5QWjUSSDwE +SOnYHkKYJakNZd0yGvMFFqzgAfJnfeKsxaaOTUGMHcKBFFw5CqcoLwpq6Tic6l9n+xg0Oq3ooi5x +iUBY+b6n6qL5TuOZm3yU6LXnbCGUagXxUX9qL3Z4M8E1AfM0fr8qP14EmWpV+up295o6b5oLxwlU +8VtlZaqadyicWMLDaNJ0klN4DCEkJiV55PgXKBioMZpKwJraRq2L/aSLYDgdAoShHFOOnFgMMJRr +S+HRHjrazt0xj5QXeA73mhwbvE5yZBcpRicYhv1CeFI3KAlyRg/GXhyD84a/z+pKvm/mjZO3Jdai +DZ3SrOBvU+U2qV3fNMCWop0k4OelfPJM37Hyhxhlc/4sfShbSnA6lQuw/nyNx9xjOBC9TY2OotA/ +JMWj8U4AjFmuJjPX5yzKLtgA6IdR1Fy0GRyU8aohs94G2Ix1kEyoneQCYP+xS3fmBx7nEq0sirwC +Ts3Khrm6CwCIVokKZv8HDoDuUveS12AKh1AT+Mqby3mNr0ug5mqXL2yzCoqJVa5WpvYGixiMvLQE +VXGCjXi5CZH6bdeVZewdg1ToBMq2TsJ7s+RoXHRBCNpFL2bifLJXfWp3MOlYleFoB3TeFMhvQ0q8 +XkWgdiZ3YvIZbWr96GRCf0goNC7z+2RY7fRWmq4e8uLpLYhKHHxNWzqSVf14nHOmKajBtGc7F2dV +krYdY7sqyuiUQPw4B4tp4qWsGtlh1gUxKfAhnBeKP3U4iRaL8NcpIDdhYRSe+kcUFUSN8AXobtSo +NQzhwg1bWRBhsqg0cX9xHoafLisDYWYb86SzgdppS5nGcmxPY6XSPbRFn2d8WeDJO10sjStqyyDa +jdRcszIP4ShvH7enK4PoV6E4zzI7SIhq79SwtNObNbM9OzMAbxigIyXewlT8FQ2cJhsAeKAlnqQb +Vq9ePkZJl7m52LSzZ/mBdtdS1oDcukN5PV9GaRcZ3JUUJHtfJu/EuiGbPV8ZyIrEt3fOov+x2Rcv +K0oBU5kDEKlclGw0IdDDJaxWLHahUeg2jmZQeDn6K77ziymMz07W6YpKMa1nQgXhPG3IL87s/6kl +6wdploVk70nqNwdUgQMcrc4Oi4d0NwlJagyEcAHTdX/Y3yMsj8YYWESE8E+p/iNMlf2KDvjX9uFU +cyQ0GO+oYYu7JpOPD7VoK9+9vLOwIVkpo9OIzK0Z7fjzBic/bntThPA8YCYUdTzjNB2FcbBUy6Eq +ZPowH77FqjhRCoLQX0EpC58p3Q0am1iGk6goelVm9ZRBdfUitVcQp1Rvl29AHEt3piqY8OKW7Kok +sECBvmJTRCRHMoGtGNGwz5aRNLyd/Dr2ugXn3sKjCXbiQQKaeHMA4mOsOyJISJMabXl/Rhqrh0jB +2gCizwmaFsezF68/u68vOTI348wzALOP6DkbQmKqsjjVrRGh9twpH++n6qeo2P+0V1yfGrgXKeWL +R3iSBtI9Ws22LnrPDJtar/jF1NnhYrM3Q+g2Hz21FHrOxHP2zaplvyrUiHBJz8Jti4+7L/gBIpmP +bE6m8xe/7RZYHHH4N/z9BWlA9MiEnR4eK7r7UqFbCeCzPk2h5UdyZJtsYwaVyMtrBWrw/Z6VFfrK +KtDfISYzMTIxFB8MmKY2hAa0IdhffAEbU+73HWQsZNoG2xYouuPR9n6n7YWOv05TObq6q+SzCJZs +RywqfE146Gb7Ba5boKAyYfvq8vR2RVFODY2pBMEnaGD0w0ucgZPoxy3JV+C1o/9UiDd/ibbv8TWM +NTjRT1cDGHsUvNf5aoXY1QBq5Xt7NlKLm+qodBFNLeIo0EHs4PqJJ0eidXLigNdpNvct31lvTFcf +UVoKFSpLYDup2kQjkZgOI7YVmEANY48T9WkXGFZo0ZETNZexGdeT4uI7MPl38I3xtowvWdqCwxYh +J1jnYL816IHwveqFEhHwwaQ4M4dQ9OLrbfeY7C7TrmrD08PUgbIaANxNLhzqdrrYzehwuX0eYM6z +DdCL10F5jd2AvXEGnq1nH9NjK/vcrfu4bJxCU5ighiMAIYLUNarZeOhoX9S77y9bGzRVuHrL2czg +/zGesVnUytgipAzGL5BpWMttIkZFvNKnTLaqPbHEen3A/aZgUbDaLjRKX8pEXj+/SfTlyw9+661r +9m6J2ffVFrUxB2eN5lW1xyW1TvGFGHB67CNdFWtpUA2NJMj5mcJId8kbqKy9JfxkPzCRSY0T+W+s +E7JHa5Xrop70uWphhBIa5uYQMUFC+3ES+E3k0qOE4x2/NMeZADdQi6s+nmXA71CSjawQUYuKXQ5w +EkWe9scA8Iq7LKtR1L+sX2GTcfodHqyW9bpvPMUVsPTh6U9mUs8AVaC7EwQYTYn2pvt/dFmtd3vi +MQQQ6aooH1O4KLusIhgzluCy/WrRM+ZVhOZXn2+v52ly54+A4VI8M4WZ49Ir7GImfoT0QC3+gp9a +8oi6qinGIumeVQ3wI35KTtLNuubUCAEbIpRZp3/bOCnPO+07ppq99uCPN+EWFAVwnhCCsc82hrJK +M4mSvamybFhmkoErHoMd3fxiCyj9MLaify1cjHcMy0R9E9JzpqtzL1ohzUT2HaZMOa2jChKQvTML +/NnkfM0iEFwLtE4MkAXLaAoMzKLEc5e3bqNu1qDVeg1ASFMXL4ENgPPdhQedztLHIhFlluzZwR0L +JTurABBNNXezXPXD5xxNO5+Fq4UcziyqDzFTqmFQWm/9otGYlYRLHqMLA3CeavgmqiETooyinSzo +rGoO2HU/zXZhLheK5WYjw7kNqpj57AJ4HkDAtMZ9TDkTBjgNJUDhbkwjz1OS24XOeYQHkkBg8Vwq +FALEOAZYZAW1HyuMrs+lWE4HZcfcqizrTK4+MubL+uXSzh0bOg7SpBqZp+jktHU3P7SoSBRZFTMm +VXCYBVByR7bX6+cwgLAWVbJTYjnkjXn0hAAOZvjN502cFakgV4qmqjGoKJgsntCo9cgtaEKpLYRO +zWPOBaX8gkGa4Ywm4+Pq7mivhdrToVS+L0Fs+RG3KxcggQrgwPU80tPBaHCw3eu0yRxiDPQoxSSb +AA7tyiT8tokJlOwgu4G3iGTKKoqFzUg+hpCKYF5oUkbx4vcBoGMeKH4K/r+7TxvUCac6fp1OFiMs +p3eImZDuYuDzNVCp7ca3PXWH/YrcuYtOlgLGbNaBBqqzsV3PYNEYF1eQW3pcw4TLz1RI49+TD833 +aWjOcdkwoe4a1zsUzzows0EugCUiLm/cyRyel2hzH3obo1iYodBIF1jBPgmU3FAQxSg54OqPK9S6 +1EXAuSoGtIGxJ6EJUSdS15g+kOMdSrVZw5FZQQRyeGSNtRlw5UFc4j69YYe6l5oQKYtxAaO9M2jB +37NixuinCuk2SIu6Re23xpVQdi4d/BR8OWO3AapgRJE8fh/4quntX/jXrAKaQsMaGbboQvj+TswW +tsqMSsYYIMsXHAwYGZEqIlYjXjqEbj6fExt/f9rajOhfZcIqM3aIwdu6T6CYa15tybfaTdtnA3TP +eeFJ5dJa3J5brMVG+yKk4D58NKD9CSEzjVMUIt7/kEtw8mm7Xh3tmHvblWxR9mNwcneVg7Guegxj +SgRXxwob5x1irvi+Ak5BaJdCdfNBkmuxI5n9EvD2K2wGrjUpoI7bY9x06lRIIkp7doiECpahCXGh +7QuSsPNFO8bMgm2MpD5nR3g6YB1f1ideMIA7GO8SawgUG2/dfzsp6+Q9Xxq5uexs/A== + + + gcMJcKmztMVXNHYg1Fwu5U/90tog0jpZBL+fyDsGUj+/W0hQxsyCndNMxqhTHLCcr4mEbECGeJ9j +tpCjO2XCKT63LF1InPcODyqEzCdugb9dr3OvHEoQM70avwzDSp7LJc0d026OqF33N4wBqsgpU6Q8 +cUdsdh4kPsEvDrKGne5xXhElLjB4IxZimqRI4zf0gPPmXEU+YbfyIcVruvym9hFZTexGRH+UdJEU +uRGlN0POxS0+7jgWSk9zp3gQvAnCFzvSacNiF11G6xYbnAnDWNjAQMYAg56uiyOFO42cUpx4CLDO +fu94fYV5f3KGeOe4+4OO8DPtp2BG7qu83X5sqPMc1PzsulLP5pj96q651O3HLP/Og+Bf7J3iwhZs +0P6zieppqWvJFI8kdSS9jCGFws6p86A0pq76qVYma10Zfx+Avb8mUknTC0N4wuFpVpX07DCG+Pft +NDVD9P4Rdli4arM3q6hRdkAH+Pe5kpuR8ZJZ5Tps3f82AbDtpqsM18aNI75Bz/EO9++oVFKrzxOc +WcpszGNh71NXMLOyCjsAUiE882qgqrMnpWMOT/dMYXzFBADgmUlp9K2Q+EyCRu6IQXMARme2CrZM +iOThFujKogWI+ECh/oHYQkVEeQumMna4gp/WZajNmK13polv4s0zEzegi0rnyyqOxF5zOy4E/nkd +5/bZDBhNpcYXKRdPeMo4BJHrHYPtLT+REI4R2Mm4rs1TfIeYSjlzz41O980eLaEiRg8GzSA5FbGv +PRvGgv1afJkhyJjLNgc9m1skp0PlvZc2Gp0FUG5k4u/H1b3ePSu+FunCthJs9lvaGigAG12YXXxg +ToBukvGZhs052kXIyoD8UOtRvCnjjiTRTwpaVeJLbP7oiWGBzyBB8M/CoLhFZIdoIOFrW+x2y1SA +cT6ynI4dEFQFjxMvDzdP3yEm/d9WkboFpRObvrghGcJeSWd6Ms0jsfPY2qr9HAeOfnox+gAJ1qVf +ihwAdL+uIu3JDqZK3H6x2H3fXKTSJBasFz0lCxH7Io7Xm+Fk5ljROWiBQYjpgqr26sIxbDUAAVw/ +nlzqGzxPpp2Iyh3ZyXeM6tZEiNuVjUUHezejAC2Yyvlt9bqztAp6Y6Xf1aDBkrQR4nNaXjw6mbd0 +zy5zzEre0XO67dHE08lLuR/SbHH9PjL2hkkXBZtng7PsrUVoRJu8vQcbZ/ag5403bXRGTKwLiTi+ +3i9dTLLg/unE7fP3Z3fXkwxOi33SSZLVuxyvfZEq+LDsG6tnm8pGzzXZTxPiHVcfU2srq9srkBVI +csBO4JisZLpNdnu00pL3qlMm/Po6lrjy2V3NbDs4ty1Di3zbviEjTRi2ffqvtssq0Of+pvHzX+En +sbZnRy3xB8XnkwEXZUIUZ59Ptg+vy76MIBMnTo2G3D45Kncovv39P56J5d/+rQ1iveJg0M64YT4g +JpxjKg5sgPdRFXUAQLmINmJegc1W2LHvEbO0rlkrhtk+K9Z291f+1NmOIYrNzvIOWxYXMnuIdmVa +bwfC0NQIWu94g3e+b+b2JSuf43vZaFpY0a5Y37zYwGxe8FcA8cGLobv3lLvTqmCCVrByKgG+LDg6 +gbdyuWKZ/cxbUfn41gVlRQqyn5mAaodrdV8VONaLD/H0LWRmK2zdsrb61lqNw6BJKR4bL6ig00aO +31Yus5otrV9ewPZ/wjYryuKs8Hj5dh0g3XX6OloORI19ieE+FELrc13Hl3Hfz97uTvHOCI19gWg3 +ndgF0MSdKMkF8+R4L45m7NiuTQ05A6TIZwFcSeIeXGrsaoNCpa0wxPj3TMQvZThsrrquWdHz+gJQ +KT0piQpCaL4Zu3QvhafbDqchhMgGtM1ONM4SrTKXfZn/riqIK00z40U2SoNtDlr6hY3xOjHM2OHQ +7AjmtYwfEEO9+sXZCUongH2zZbW3UeVl+KlE47QOVznHVF5nR7A6hJftJA4qE+soqTXpVKnojoAa +hDLpksoOh0qer6M4oi7yyws8GuI+yPx7dLC47CyD9esuRBmWQ/2H7sJyus7WTXuGtRFDjctSACXw +op2222G/tg8QCKQwvkIECJWLhFz//Pmuw50LrR/b0ObjfkB8nH/4JrkE337saDio1tKnkTH8UNfn +E6BcUbqG31L0gheTMXQW3hW+HDHA4fNcYpm09jeb+oyXv1GSgn1gR9jWBzBKzEZf8JS5GyNlptMD +Y/N0urHdUQ5NKeLR6zKNbV5ZfdbhzVqvHhGGA0D5urBvR7vlroTHDDfnA2LY8x5sJnuaM0BS03qE +NoT0ddHr7lf0owKwboY2iEk3ETRMMUtbN6iQUI9ZM6rCfMkURXA+scN1FeBnRQ8tvAMDMVcxr63f +yfd52LHWVbRszaTklZM0K1scJmNQQilMiMqPFe7bHxiALtkSt0AGjRFu0lAqubHTuH101QLkqhL8 +fYhEq1iZtojAcxU/6r5KJm0JC9sjnIyg/ZyaFpAy24SZsRGeqKrso4XxqVeyglmeFsLnqvQoTAeA +0dcGRZOofPSaTWswrkvW2LMGphmyvnhZbIba7v0y0OI6R60oNtGkYuN9b53G1D/F/+YNO5Y9gK8f +6+RENv8J9rE/OfBkUhTcx9WVgQSNHQ/dLewYlA0RUF8/TVcx2lLlq/2YQq0bZat5qK5oX2iQPNiN +yZUC65eNTbVoXDbOO2zZS1Tk+TASrSh2jXFn5AzXHQfI64oIsvQtn9ImS1BM/f2WqUij0iYweROi +KsZl8sIVFs5T5EX7UPIudW49jUKMd3Xx1GzdWj5XZmi8gPod4io3vAOfbxytgdn0NBKamG32Z9j5 +iuvmTQfB9jL7FG6G0Xc+5LdbjUDTZxpSbS7xVe+rge/YDN3lrabmyW8BPTxoD5DW1/o66tySRyxd +mbbMPLzToPLL6NQchrbF4mUj2h1UxrpYdPFbCB1lhnlqC8yIiP4jnmV05HS4eIQsgp+RoP72ooFN +dzoTW77WdMQHxRrZqZGjtryqeHce2oAi6vNxeKFODnFEAtDfrp7anHmIVbJqTcbpqptFko7WaxyA +BK2PMcR21lkcjT2qak2YoorXRz1hnpoFQxqRVI5n2QFgqNTRGLdAvzSvNvTG0wb9N4Jx7RdYw9gV +BP6EUfh1vqvbffH36GaCF2t8lpCQoUy2CbNgA4fk1maDJ1siCyERW/P0eEX+PITCVhnlYuP+aGSz +HSIOnyoksCflipTDGTtV3bTCWSe3YV90nxrgAD6HocBm4WQru9ssYZNfxS9C83z/8f/ns7cw9W9+ +LAOmsFTv4+/LKCx1elGLPqapYgAPDOLHGJQy4aSzSAfQhQvCUzBqZJQ4NVN3UFHzbjPHKmhNuwg8 +AJqJAU6GGZ+X5LLH9Ess+CxdmZ55qUWnUSUgzKvHJC5UNwzxGhEqPvuUQVSaCgPnlUEy4tuRZamC +nNQKGrRJUVFgPYcrTdJTBl/KFbjxXAwJfclxfTryGL8zEMbzMCSeisd55cZM3Oi7nA5j5YTXVpTJ +QggeiyViJadybsohkS/0UNGvQJ9gXo2Dioow/85LNx0u2CyKFBRs4V2jEeU6aepSFDu3sqitv2eg +fanfigk3QySDHI+GneOcLo7Horop78pJ4tqiGIkYyS2oSL/Hm+rEAFUws324UevVvC4jCVZO1x67 +CA+bLU26E+Bw+mWeHNZPXyS/xv+YdRiIz10XM5+JN8OrzHpa+2xsjZOdLE3kczuyNn/wNKEBYSL8 +rqiAxNN4ULadx9ldcxbTmvikrBrPM/tgpsMK34lC8bSM1qWrm/VpsmYnP0LXdORDdWBjmuGjpEI5 +lB9b/cEuOl/YVZgBqFR2AMM0g84Ub1+Jr3BihyIJHoK/R8qQE7j8Hdvb4gNW5Nwtf4rB/baTXDF7 +h8G8I0n5TFjZ0+/ixh7qOZmCAojjopbo5FgPsan3n4NCW4pm7mt77ithwlhrWerDnOLmiSdBL2A/ +JI41Y2ENl/oyao3FFS3Uk9qpFcCzjn/HAXZQVtkAPUIeh4nXhKSJs8KADPv5lJvXpNyrIezL4WxE +RMy7nQ+O62VYMQSttBR8Dy70UM0fNIfQItoi2jSn0PeAWDTMS83tP60MCgZ2keWEdGH8PQqVnfOW +bW0PitFob9V/ln3Zy2bVig3QtLKIRdkvyY+xlUUL9KJkQNn0EPdhzbVlGex9evL3JoZzUwLW/f6X +z4tYVadmNmVmD3XxO9lFU9Di+RTiG51mZX9iVpLWdAlZ1FTT1aw2q+OH2eDBZ+7P7vPJTxdb6DR7 +NFS1t3FPpFY9rexPgUXN7GlnuyMN2fubz7IHrhGNAjCRrx4HPgCT+1RqRiQrIRlnS7AfIdOauZUL +VYof/cwJoHbHtPLxQop6fJ6Is4kV7qDFYIsYnbV2IpzY6asLDkISXWFi/JLNKPnBe6OuF8Wv5QRw +mOkvJQJUPdSxDqlq3UQZufPFUUlmsw+nWaI2WPswLp4uS1BCWm1Et5fyPBXHItQcWXNPGnBfZDYX +LytCaSTerCd/BNhHbSqWWqIAqeqvbIbfvPhPyaQy1UXAWDLVn5GK8tVJpfc6RYyEyEV4r4ZHJoTW +cx1iRlPGzF+f4pMJJirU6N0m8+bMMRq1qYAixyEyIjbFgvtIh0ruhKMXOSmH+tOeEKhzXbLvLe23 +ulg4doXJjItPtsdJaDpFHwEgq4hjEaHzg10wikJ0N09Xh9v2bN1FoAf2fjv8Iltjthx0RsDaEIjd +EhtNMAUUidrMjqX70Fi0zFCEz3WQB66pI7FnA5X4nERnif6rXCed2KAGIgS87DgpbMR97CW2+I7K +ZVGwVqMd1ukr5ZQvS8cj6X/gzZYyOQMVry1r7255J61cYcXjIdkqZMWc1dfTxJXBVfbcNiG8niW6 +ehNuoj39Oua4xGMfT6Rlds9dS5Qs9nEmse/XVsiKYW4dQKfb5JslAJdbEsRqX2VWLalqdqtJ46cB +qAjbKY7ZVwTMmAYTs3xsb2JMg0XAZYS6WhKX0o5NpQEaISdKoVpcOguonjkqG6SscJs5QJtUK8yT +GLWpGuWyVY6dJw3gDmecxy1fealBQb2BywyQGAnjOn6HOHn3lZ5ynROnHLhj+ijUCILBKidqjLZT +z2K9LibPdYy9faV7T2WAvYK8V9Z0m04CRut4ZHWpz+4KWkPOoAb+/Np0dV2fnASbhtego+unlUqR +ZVYng1NRvQGfvHJQdp5ZV52Ys4kWJsHUjND5RBlO4fYyIUiLPgmZb0PMjuOSXnIeMs15lbiAxtEo +RpeCGDfb8Um6q6nGJDbUHfvDZ/r5ervhGEvFnzXMjQ+KD603rBAXHtK1I1QHq7Pu/ix50Wut+vus +QTvZ1Q6ZwCmPe52XwTn+1T/YvyWwkvuKnDmnot608/QdBqdgCMHiZ92MO+v0FH5JRSyeUyh968ic +VF/FluEvE4AlYUMoMG3k4JwYC1lnEP5yDhWhpYaMa8pqTjMvWkt7M1CZopXo+7e/Bg== + + + /FBSobRdg+Y4fUBc1dadXLMp02zx3EWUiqV0gYGvNqopmIsj/4KLOGUlWtL9HkDl73yRt6YUyOCw ++RGhslE7LRSnVgshahto3HMANDi1iaGUI517aUe++Ns1eNPioJ7TPD0LvHNx2HIel+c7xQF+dY9G +vdmzvL0cmvn9+7H5ReQdkpLog+JJSk/ajIZASGQ63oC2WevOwr4dp7jGni1sRcFiTcManMZrhR01 +v0wAy+HsQOxK4CvmM7vqNaMjZNRKNuHCStR8h5DofdQsfDssfi9v9SDtgUgJrILl58lxMcHvkNdF +vUE+D8t4dlJknF4jGaFyf2lWTGYPQ6KUNCHqlE/Xm5u8/XVi75oxsY5gmeKMT98F9uL2joSkKcyI +k1kmsbLDgbeA4A+mIkrCrWwmC3XrnTolO3CNDNPb9xPjjHuQWYXLLySnAT9CP3rUgGH63NlceZff +5Ze9joHBLcirabuL/gEx0Uvom6TeeYVU2IcN/XWQMzpBtiWO4d8Z/Qfxl0HOwoAucqNjDRcGhcgb +3MpcAri8Xl95luvLGBx8SSekWDvuE4QoTT+aYcQENyxsE6MUJ4v73yHpTPl+GRYnqTQl0Eqg/T8Q +aSVBdolaccawCYGodyvFpoq3cjG5vo7N75OF5S/RE+gDYgLkSyAlQ8gagavlUxYa5aYx/2kAdL3a +h939dQZcDysLF1TP6iS4HihgpDiE+/jw7DHaxXK6w+Ri6JrNcTfpX23Qydoi8vS9TuDvzmwIwH/N +jOyjp1DvNQGhoHpSvqgpBTAmUSmM5v48tSlyqx08Cx8Qk0gWRQTvepooOKosb2jHcAZAtJaw3SzO +8NgZ86UksNsRxoWw6QMlZZ153+0gD1F2dxOerTeeqjxaitm9pnw1gHKrdNn9x5RiQzFLER7Voz/5 +5L0JJj/Fw2WKCslmq55+X5b2gCWGSMo9y0WwRDqEowAeW7cYcdspKFSFzQW8ITyCquz/6WVQ1aQ3 +n8ZYVRbGJ8p+tBpf0VwMfROqGI1Vlvb6Anyzl4E/IKZvmFWSUk9DytNgoKhHUY5kJSdGAud8HM6q +2OOhYv3uzXgEiRarURYk5QDQcb1aUFlqDOHxGjv+/ftBoBVrv8gKzwF/xIzoZYGr6mFKzbTOar96 +e5zv2cW6lbRX66neyyIuff39P/RBambIxt1jfhB29FrsY1/LhRatQw22WHOwLkSfPTsFtoSx5V95 +CxykrfplAtwq4zZ9LSbDmCsDpldHEXCOxCW1E3tBzcVm7ld3t7sVZ2K3s6GQ7WFnfJ3BBWZKRMTb +4ePxPArFHFpCmZa0xNW07esQ3ChFRYo19MgHxIRYimHcmuc13ohqyFQIZ9pAP79pFg3uyGSSqBC7 +uk8LVtMHlWbdVL/pc0K3V+bzt1rANquISV5f4Bz9LwNzp4H0xMRHKQ1lwJhNNu0TMR0TLkXFK/td +bXX9cWYNiopaEL682F8RgWq6vi9o2r6Ke8n1a8JC4CSX4cfQGguFTom3CRfT0Zvn4mUCb9IafGN4 +ENQaCHLSbGJHNSqfEiCb2MM9lKhbU2ofgypv+3BiKalDBa5qH17VvdceRbWj/RIKjOudaHmZ7lWu +VEiJ6ikGVvScFoOw8fF0pPisq4kyyN7ChWoxQjdWZDbVoAPJwNcfY1nJ4TtL8cjHn/2cKYek3iqd +7SlOZxVCwF/H5edbce2sSM00vLY1yWHQGC6rRQBlLZIJxeJ/ojzp4rC0EKKIGhpK/F9jm9/+Plfi +8LGVSBl/QFwjjbqQoX7n05O8rwcA9joIv/YQB8F913mljZZJbocVlahbziFd9E4RJI33oN3792O/ +65XAer7BOMraRKDqdmMO2rp5dD7aslqMRCBh10Ph2tCfwKX1dLFo0a3excTvnbI+ezapcQicp43q +g7fvJ4u3GIfpr0Rd3gfEpxEN81tG5NnIL+51BRCqX1kRVHlk8RoVAe1GEUDzOE9Wz46ajHI1bBtZ +sGLAvaJ0/dCsFqUafAhGM7DmXjvPNtOnafDI6iVco6NkCC+y6X5VrpOh3BPJb5gA4ZElMiQhZKEX +ECAxKrMi5ar7MfFpw0t6y6TcVImU8q8gn+1sIX4CbFZnL6Z6MiB0sEQstCLdEB4S609s5szQZbY9 +6/tqg1POoOxCkyP6zL8fMnMZUeqHgzDTXuhbbVLM2Bynep9FCvlq9d0Fg/GGU1nzikiQn+FCCt+Z +qEBP21FbmMzeccypjiTMepK3YrsIuzNFH2IOQD6XfIh9M6/2lRQGuChp0RzrDceGLaljEd55xuQb +GZheUvViSGhkOU7pazpHzMj4+QoeO+KPtcSJEWc77kuErDyjEOtnE9DtaQy4asvngNB3ihdb4xJy +PZoshhwkhRAOeoKH3Gg0YS5zcC1DqIYS4rJoiizkSMX5ADMpGRe+Bwlcn42J6VYkCY28JdGfAdLt +4pXNEfvkqKQhKkJwjK0YVFYLSGN5KTyNp+jbeF5EKd8RXh1bgdAii2Amdc8ocdlwBnQaizqa2QBq +r+65OAhx9O8+BGOrir9GDcAv54QBQGABWBvC06ChESpn0iEGflRQGOEvuAVA3h5CKq8aJXEcgDXy +sMPIP3Pa1rP/m/ED58O+PslKkwp12lbV8jiA/BoELiSgGYtk4WhZME5T19PPaIDVOKarmgoTFzaq +9vQbdzij30UQdyN7AWzdSPArWaZZTQ23UyfnfJ7FHWp8L1Xc5hXUx5WQP2+9k3lMebnYfDFq1ba/ +PkS9ugSR4sGmNdnaV2ypo8gtKEHJQbaXXdl3R/veNnbitQ1P7NUYgPn2ehd+UF+qURujXHaVqX0Q +Cz5Guvq8rXn0bR1qNYdUvg9a7t/64TL+K44Ui4oiZPPxpwpk6KwXMIbOdDUcJdHFy6isbF/qQp3j +CvqAmJdUVuGJkcFk2ZOlkdKe3Hs5Ni9vRHKhgHeDN2IK8NLKSk4bS426PfRjKrBeK58O0K/ThdV3 +tS5JDrb/oBTW+Oml2bf2XxZu5+eL/afX2GoaiaozmzFu+6Rqn5d5vWm+0FuWpF0MT9rc4hbesEJl +SKi403X6+/eD0AbO7BK50aTngyZsFN8bRBKsCWYqEqAF5mAjWSpEbQ1hVM1u6KxxnbRK1VvLcsiL +f//l5980L5znDQWqeW0Pau126+CsCAbCQu/fD4K3ni024BJI4oNiJWVESN6u3ngkEZ6nmLpenM3z +BKWqgnYTM8UAmwN8mcE51H03XVODpzozsuAXXSX52mkkB1BHWArsnSrA/jz9u9B9lWqBkXKHCECa +ld/IoTYoJjVvUXZ7ZrF3FmVIZ1ZXLPAnxyTKlSElzaRRww/1m0QSw2jkFdI+9JlGoj5pY/opJDnf +3nyL03TNnl6JqgmV2kYQKEOZ1OL16imFKNqvYI/MtPUd1BrDTvFtl6DiiGfZWaME8VsIr7Rq4ekw +9kj1DUrkumxXN6OWQbLYBHYqN/1kE8X98cNsgHCf7a4F8MP4IFfmxT4Ibp+NmbyFHoZij1RTZ69B +oJh9y3LAELDm6qtNomNjSZTl5VY1Pxs/sVH+h7VuX2fTRGLBjh8L7qZTlzebGD6K8I9T0YZVlYb4 +7lxhtmDAqcrtzazypqqWcq/n7yAzhpxqJ4//oLiz5WAWfWAYuRTDkfCPWPjKMxOa8WXc84O0+euV +vbFvMLkner+IygH2dYTHvubx/fTI9X02i/+g3HtgylcR/2i5EKmvk4NqpasaW8DuEM66qSssVBXb +Q2HoQm510ojUC+tkbw1US1WbPBsgsRUnu6v5dc++OycmbwNsAuDYBcR9UvYCYt2FBzx5EosAfq8v +xstkigKzRL3FB8SMGMHhofYgsUa5gE2vg5zRvwzD0Xn87s9tYiEwSOc5lbMsweseQnb0uH2c7yYd +01gXMME7VXxAzGrqE+qaW8yLJS7HEF5d3OWVvY57fpA1xuUye+a6zO6u9ujfDRPicZqWg7rhEbLj +YhED5OvPvWn9vyw058ECuHLacazrwqEraD/X1Pd8nvf+9j2++ax/hdfFojAjXKET0ohv8vTPPD7e +yCxScnw0xeh57/FRhRW/Ds2fHOzjZvikY4INIUZwpUAYHEr7qLsxlDJDrdQbB2gLSQ42ELYfi+zf +PrfB6wxoHYJA5/mHHjCZD4gRbNpdeVDjh42WOLuLjM+CARFW2v1Qq4ylIrsm5nZrX4TirquL1Qzy +ARde8c1JIoSN7jcYAJVBjYmeoeZgu/HNONcO8dVrCJxTu52w1ox+wDGBQ7E7rnygHO6h0tbTQfen +jzPpTO2jZ21dohXJPtevsfRu1redNpjDebF2TIzlEha7CSrV7c0RJQvw6Qh9ym/ANxgRF8b3xpYZ +8Ym/3QTcHYf9d4Sn8sFXK5GVHaJF8+5OpfPZXbVgC8KLUVYZapua/h6hdvv788W/TIDKJCvHvaOg ++YN2sUBGvHitYZF4eRlLmOVip86qI51ZBfD7AsWbgTPFswroqs1BZIAGovjt24mdGaugZk75Ij/8 +Gq2brerKma/iKkLwvwx6LY4Y3D1jyl87MLB+vA6Si1xc69+8BMSDBKhksnMhiXr66Wj1ZQZvMmry +MYyN6eaDYgXzCVTyHj8FNwmjxRZqV+jPiZNpU5Au6Nwi1uNnEaMpMv6XGXBq++r96M7nB8TH1DwE +R153QnQ/S2i5LDEEWty8DEvO1HJRQFduiS0uyp3ULWmXm7sXdSUOaBCSXNSLn58FyYaPKqotxJZe +JvDHmdjngWNmld3iLRQBL2Gj6XiMAYdkiwaMtFZvGGCcEEcmIHfXmy8gt9MjhGrVqpA6m38gwnsV +8n23EH/9yz/85b/51//D+o///d/+6d/853/5f/6P/+U//Zf/8s//+W8h/Df//L//n3/7JP5v/+Fv +f/tPH//8T7+59LdH/Fv57/6SfvvXz//+u//6l395/k/+Lfn//Lv/9/l//sfnP/6vR/Rff2u//U+/ +/W//If32T/bk/+oz90nH9xz2GuE37rBMLonB5wzpc5qfvEr8r/72jP0//yV+Pv/2f2OUlcRTlq5f +6yyoRZnM8DYwJGlADPGel8U5/AuNSOvyyUBd+J9vVld4jOm7n49NPfZgEtSCaR1EwC5WgYXiCiZ+ +LESWFViQ8f37Qd4xuoHpyePmL/oBce2byNkIFo1t0MXMQF3oJRPWmjDAczQz3tsLiUA/4IGgd4jT +HBiCGUaTdklxGG0Kj+OMMN+K0NQ30+UqbZLn2eWTBt/Dqk8rK6RXYxVJmiwprQFDtSfR+mungxFz +cedXQc1LCEU1HxalCyc5MdkzyaSjUPmAkcSFAnRHTdo3L3De7PO4fLFaqTocA/Tpbf36wpL9NK/P +UlafWKiTbBKu4D8grmKecHPpHeLWyF6tcpqkiuzNwjQbtvC29xbYp8iHtyK+sVcULZJUsPTzdV6n +RgeJRjtL1smKEz7q+cAyvVqJY7NQM3n5J0lOgSp+HfdNK/Tcc0TjT6LXfv7BuZZUcQ== + + + WDQurNjvJOSyN5wsyT58LvZsIh/LqlriISqSoRX6Mq8z4YJfi9g25/u4YbwMWirchNL7LNqxJzej ++fRHfAMtXooAN/vGnmqsgEjjy++/SfU8egnYPL/oqHpYwl0CEPgOcWkkzfBkxLsUFektcDebcGYS +dwTm4ZtfO3V4B1zl3hQL8Wbmcj7HkYV4XfyapLU24eBO6ZnVqFaIV3jCHCLNQjw4887hUjnE4aJk +Ev51YmfGX36QM2a1SQrjmT/4aPJ8bWQIVeo/5p4/vYjOWGe/kb5ZyeEVdpOJGEvXsrItT3K5eHn6 ++/eDUOW0i21ybVXZGcETy9i7NI71BlLPg1mP+MsYZ/DH+OUiWjjoA+Ip7k52Z01drSbNwoyYnw2w +2JbELYn4ut0sTxZ3R4Q5WZvSU4dO2al4WAIM2KPl9G4KeIONmdmXi/2JXl+AH6XzH7hnPiBeTVwf +CIGkfhX5sxnQz1N7lpVLia14sgLmPmm6XybAmVkhwaG+JMjTxE0akmrWALqymJGVSmYfkRyiDFV0 +VqJEfVxm0hL6lS/l+TDu4BAD3svrxM6MR6c+dcvu489/8LmqOQwwmsl6olXScSF+bkIVvI4xg8rB +HyVNBqlvbNAiOq8z6Jd5nQkfZe9RAE6YnDinvZ+9dTo30/xxKfgsGWXICxKjYmqe8/l2BlfRLJoL +5QOJT0VAR+PiiUiVabiI35vtCMR3Mh+Siv6khbwGekN9EO5lz+5NYqAxTxn3PYE/tGY1M2/smldq +szZxDpEXw8TY3flUeBuMkb9HJJs9mQZ2iftdb9//3Pv5druRo2is8+1ensfTbZOHdjN/+DrIu9RC +2bTUPCRBtUCH0HkvcP7VaU7f2k46OYFO41DXFfJY+tF3KZHDZUvV5LUlnGeA3Nmeao7KGSQdUre+ +v32BN6ly9MCwHWdkQVTlHd/EOyBDafZSv54wQxfxQh5KviRnpIT6uLQul9cWDLr8ZQKc2bx7ESkb +ZuJUOfKKjEean3w/rLqxnhOTsESpYeLJ9ln3s5PU33PDeHSKif3y2V4mdnZJ7qTJdtoOruXe9PCY +MH+EYF3Z4KeFUO/mOGEu5i60r73+G59ZnMdsAfnzPkFVlv/Y4o5IbI4G7qzXF+C3sF6L5Ta7PigO +ipd9gkBpXG0oEblNI5oxhkykcSbeJ9wTMSAbdJBBjFne1wmc/dvXafdUzpofQ5qkayacspmBhDPh +ONSOVUs+Mo+xI7QoTKwk3oPCLxP4uzMbkx0hQLRnhlOlH8Zw8M+b4flfHiLuf5uZCNpBO/InR7M3 +3uxk6WiX5zpS6X/+asvK3ZhfUOQtLbLIWkonV54sdAuxuqA2eV5ZQYS8OE8W0DQeK+t4tA3R1AFt +/idHe5P1gvCtT0L2gE9qQWs3pzgIEthkw8qGRje4Z4KntjPHZI1DCdI0/jkprUqwMmHMgOddLIjJ +Ek8DF+FJstuzm8VWJAgxOh/KRM9h6c+OGgm/qd6+/wLvFEdmYR/gxCPslWk9Fge8ftmjjZM2iKMf +qQF2oW+6SHZnD2/yfU2khOzjipiPXEj2dTuFp3DBvpk2eQMQ3oRd5GL0537U0UmBp1XIHfD6Fu9S +cKVymCUrZpD/yawH4KUfISiJdxaIxPWTWDUzm/g84tTI7EnMaLJG6oU+W9etvfMxPYjCTlZNubAh +2/ERnn/gjgYhr71BYUOJtUjplhymxA+UtpyMzme95PhPjRTwZd03+TCQo3QIiGh+VvKJ4XQQ6LlM +fTFBLmbrstVAc++hv8+K6yl08Vk8QDvoQurBAW7qL0L2yzTxYAxonInlnmWA68XyUn9vVf+7WB7H +6Pot3ohjTL2sfmiQYMnFyj7QGhrXIZkrc3PdmzOfzdVak9IvWtlBF4StOn6eweMxcbJtnjc4wTxt +rp+W8Dx7L3ev33yYb7/td+rDyPv5DjJtvNJSR7esb1ZGOSsPz7As0wH09Ep4q1uRiAJCeVCGQkQX +kvnWZ0B3CVRb9iyPvmG8Krlgl2JPXyZwZuaRlLgO1SrIxLhkTrGERcs2mTZoSZl3d6qS2YAwFUWN +Pv09E1nluJg/vlrPneW73HiFrQedg+ZE6xJeQL2zbNTKkmAnQZC/V3RPUtHUy7+cDFgwDpmjrwe9 +PebaDaK/+OcAXnrMUjHEL8t6W2EdcTN/XXpuAP5uAE8Z8Vor8zXsApcYHe9LgB0o7sEgZjPhdd3k +fhd1/HqdxeXkLManHUH96uQkwV7NvpB2ujiyXgZ5l5021FJ3MH/j4iAKsEs3M51vNkXjre3RhPfv +ByGu3sBlcXh7lDsFTl00BLtHNuAd4meZIWZDGRMiH/AIO/D2L+MSGJ8V0O1R9vdBMTKwPfDa7xDT +hugR/IYQt2QXCuB13EPOslsXtTjyeMYYXpSoLDgrZdFDsTgj+nkYuyLVWzZU5hv+/rnT+b0Wg9g+ +7Ndm0Y8wqflTB2H467xYeWw1bBNmYWmELTQnuqD9x56YOfgSwoRETbMJJw1zlaeaNBFHRg7s5v3J +CQtDgZiTiXL37354ZfesgOWnNkhcytD1KQB6fYHzZsyI9oAR8c2YGzH8FfnnjSkV9klTjasxpa4G +oJITI3077qnC2JM7ZSsjZWWXawAp1K6iD/L1mTQgUImtD/dQS/LXUUnLNkhz+CnaYW2EamIJBbAl +2ZgnpyI86k/1WKh8MqmL0rg7COIOyOplchmQrzN40zk/9L8nl9PL5TgTxt+LXOQswjcTJkYks1py +2bjiGmcjERNWEeTnJeHnGXDV5pVk7KmTaM2xrnL00THNCD0VEkDFrbXP2knKjXXPWZRKO0lNGPGd +AhOeC/yTZbdni3Jamz82ZDAWRGZfX4E4n85aXtOjeRKC1Nmh0fVoeEEmnMRBus8OIciYe+B93jgA +QimdAQiTDT4Kv/f19y9AUOSQPKZKijjnDWPDAncEQjj6CfhmCnsln7xXoRERxEN7HPUN1joIt3BG +n2eAaHT2UheGbZjDy4ZqoJ1L8E/OFzLEPejv/v7t21Hf9WuPvoZ54iRm/DlG5qwmIvZ1/tSgARGa +rKaybkAQJGbisWF2FcSQTdgG068TB/llBlwIgORCj6p2z8STjAus/8tbHCb1bMuTiYbwjQNUDYDo +U/Ar8tlZRbr4eQZvWrVjyDvEXx+p6hygQjwbvTZxQh0BHRMq++/5cK7a7E3PLj57jhwL4l9ncKY2 +kqjWExNA2YvbaBgV7Z/n9lPXj82Rn29EFSHa1eytOgiYmWvrWUHSsGgvE+DMii7LdKHxsyMdv+Dl +bLtOQfO6ttoPi7aKyBFhJJnwQuFpA/9wNCbD2A0sPjarRm+RvIOvb/CHUKCMz7WYAlGgoA41cSsE +cT7nCVc433d6rdaAkH21HNo5IO1w9mZWLK3dKNIvEyDBTBFOvkcjhQ+JU6c4k6ypjAHQOQkJq2pm +TFh5vv3ZyWcreMVs1Hi1zurvWgTy6Bdi+nVeh90KrbPN5J1EpVTzAzOWYle1jqDH+Bg+qe8//8G2 +xMgyCMN5/TmniP4XNf02a7rQ2LYjHYbDUJCzicHvEY6cYYOjq/VjuuRQQSPAImE2eJtoWGwLivt5 +djYa+wT/dPXxZCEAC4XzzljpXlGrbOTUDbDuAv7bLoogN+v21gBgJPK50ujsByAzRK5olb+bvsWE +bjRKD812qGrOrciF+QI95BajrmGW3ZmQK7D2oUpBs3Y3AlSui1jjOPUFFtsuWNhTmWM1vHnDtGV3 +zyFEuRmsrLCwYzSwAZ3YhyX5sySg4LUsXnzPt2J8xIQIVHe1JjJh3lirQ5AxzNCc+F4FgbLhRf/Y +vioQOIxr/XeR5dm0Os8ridrt7xv3rpeu48k5MYHnXTlAVXVNjx7FJEDoZxuwPtqKKDqXZoM2w3gT +KPTcoSgQcBC6Oh0OA91U7DnH4oSwtsxRG29jE+fGnQyzz6p7EIbtIrAaTSHMHmBzzgAcyv4h9QoT +WTlbLzEzMPTVb84JrzCiwkBp7DhQjnZIPk4X5XYFUY1VZYcX2Q5LSLNMMA9uTuJUAWi0R4FVDGDa +i8rwsUJIm8FEZvfucr9Aj0G94TAO/j14TjaIId8hPkEIJyelmIm2FnWWpO5A9wargWFRSTc3CluU +EQ8n+aClfn0IE7PmyPFkpBpJSOEdVWkVKF27iZxKU/2z7JCI5GeSP9JjKWB8GTKfrzM9BYYfTiul +v4fZ0OU+jpOl6vKkHiFa9/llQC6usWRHduGInFhlcY9DW1vV1Gj4ZlsdVoyzBsGZIZN1oIenr0sF +fnNYDzuWTZ0uUWMTFWZfMsceN3qcaOdua0jejq30Y79SKMawA7D6CEKLGCD1wW0DrNlMl2sl5iEr +0Af2pgejDSvx6+iqSCPBz7kx2Sp8JkUU+9VtyOuWWWUmULpX4iMS2wVAmZkUFmb35CxjKPPwe/T+ +DwyAhrsWUoGnMm/VzITPLEow9wBusvQ67cQB4Ag6lUDis5WGFwNezSvzabgRVNCCi50vQJvBCQp+ +MNzwAr1qcyz+PhONLTbfL9AeTMTFwAyJF4iqzl3lSczCvopuj6LevyjyCnXAARinNdKofVgLSub+ +KqwWLapMaQLwzeP19kjYxrhVnmXTyZ/etQOjgm9vVpKwuoXYD5sCmGK8Ki8uTRdSAXIfWnf6SuNw +MctgvAAcFAXV0/Q3yzhRdeHMBLgA6mnvMWFSriD1DeDB9IPS+V0CaDG7IkPt8DnZo13Fmigjtd8/ +mhcNvuz3N6d/evVODw+TrRDOoHEzlCUFhZ1tDawTPrbz2scA1hh70CcJk9nIIeBMNoU9pqlzUn2e +JMv0Wks4yntj/a2Z2iLDSUT4rGZ8kfVEhsy8a1AP48w01MFiXBMIW6vrnkM1pJM1z4zO9Ytoay6B +w/qhp1gC/DVBA6c1tZl0qjJvmWmk23yWrVDnlvPTIuUXwtZ4uA+Zq4mR/W6Re47iNVOR/AwbHP1W +GLe4Y6gfnAMvS+e0U263YY21qIckGQLT152UIE44lb94daspfIBoWAzbLgdsiMnT2lkk3otgdfZe +Fh0jeAHir+9DayGunS4gXdbVr0uJoKPVlRjrV7tlE09OgL38bNSssDdu+2U/wJ3smUcOwBIsWBHv +EK88OUQhs8F6LuTW6VeCrnX5KeKSAbGwho4+2tO+YYA6NgZAa2Rv8lRvw8uExvhc+M07Se6snVKp ++mahUbwBNZ9tqEq1bk4yoC+SiWl1q9R9Uz+WqnYdYho2A9m0a6Qzg2NsC17qxaTcHyxz2N55+DaA +TZhly7Wgt4xQaJZ50lhZFmJ6aE1ra0nUxput900hE692crhxvVPo1t2++Pe5cl5VQrp9LaI1J0TL +e4W9dkneGtclou3esYO/VIVE9Bo/XheMmtnvCjZF1jfTpp09O6cuEbcUFhIMrlnfIfZw2wqkTlZ9 +Zya6eSHsZr/b2Gi2iHDGfjmzesiffae4ETw2ENbxWhfFr8Ex93NQm/smKwvkOWeivw== + + + eA9bxjkxSn1a3FvmcLLEpoEk0zuWsQElS8S8ZRBxRYda3I565ZsRtrv6tTREjptwCuO991EKRYH9 +nROfLYonemU2lZ36T+raW75Zb5Q51WVBGSF6kuDZwg5OjJOHYmVWSeh1K1ReTJg6NUHo9rwIJZiN +FDMFkF/LF/Dec4IXcaQ1PVsbV4Yl9H6PTHyEJNSFk091jMsKo7mjm3isN1pk+aUluO+i/rFnM7s5 +P+tFUhEQQ+2sln12Hc91nxFe3YeUnCQ3ds0ngt4Z+bSO8kzErCqL7uScc9Tmh+1grOnXGYNJ0tif +y3UPbZLUBOYAwmM2eRZZwVCz1Br7Fbuj/QdsyjmYBWzk7LJALgtuF322Zjwh3C+69GaTrZQClEMu +sKHm194ShOLeCPQm7tqESULgNkPITVfzsaHrFlEe6c+c4VLovUa6qudyWtzfDJkbZdZh5kMy3Hm0 +5r1DQ9jU7dxb+nIAqkADv/bLuyjq0sqqdedN0MNJ06VRck23XA3HxyiHSOucHcTZPOJOGCUDleZ2 +ZdYbXz6HUV2wZjkf8olB3U6Ff8X281U8444j//6iTzK1xcX1Lsnv8NVBJcvquV/BZgL42yloMVKa +1DUHQtpMXBZ3KdrxDXPGmW8kmnx0EvpsJLIVTyrqHiC33OJJdetpkrC2xLC6n4gQkp+kRiSQw4Ka +zmHUoRedp5h3A1svj6OZcxjNDLQx6JsjEiQuIFCAWXlcYhz05FeBYrRAcCUW9hDoWD28NGDvJzzM +siR0lgleVhYEpXHxg1eWmRH5btHtzIPOYgzn8aYC83bljJkf4FkieX5fVpHMS75l0pEetcb8cp/R +Aj7Uz2pNSYbnWtWWCRXYzVqkqppKEazKU3Pq/SxzIBwEg7B9XnYD4WyWuRhVWW9aaibWV3Q21Hek +VJbMiYNEMzHukYPe6+ZQb2EQIrzcq3J7Rp7C1kPdWCz4eTpp0ovC/Fl585/BHOAkvle8XLC3CvCx +CYE7z9GtgwN4KmsF0AnAj6y63izIdzf6bWmkRshFT4KHZ9F29qT85GHn7nbvsw7E2Tk4QFNzTOI7 +2r4KoQhSeYSnxEUYyGY9grfSprGX22aLatPhcM4f4anadReWAzDqcg5T8x7uwJXtwBi2Fa2PY61k +DNjfC3TCgHPz9neE4wLk25wRTUDCawDwfe5TaNTm3RcGEZpmPdhJEHVSa21etYeOO2K3ibR4mggJ +bsNoAQlKwyXSjktZfj+NnMdVLeFQ6Ri2C54vPg0TEqspus+mcl9TElsf7BF3gkY9yMz+E7zMLRDY +MAI6SW1QOobwmPGAJYW4IN9kOWz1XalizcgqhLFmGWvq2ca2FgwTGUkH08bWCGWrWBO8Zq1E/Uss +LTyydkNxPCgXAxRFb7J42Fq+HKqO4E9TPwq/8JhhbJlsn/5jVV3J5V+ok0sWr1m5UnkG7xu061gh +Ts/AAym/HC1IuE6OpAdBhEelshFDOznP01K33oQLZbfTCnvLnGp40SSw6mme25JAkCk80z8wAW+E +F6cDRqn9VlPJL3P5Wxk0QM04Ad+8OHWdLYsOWIJkb/VkgjOrwEPcREbAdmZbebW4l395ZxqmPNKV +b6xLUeFTaFvFS+j+METEp+YLK2JisaOgXqJOFSwXce1ZC50odt/oFx9/Py6TbaGFS23Klx6dZz3v +AKPJgY6LAapCtYaL6mxbRehbvhtclUZ7/FMvK2Isiq8VYQyjbVnDk53wzv3LKtFaFGVE7zfCIxi3 +y+IbMyhFITkQKXtrVr1DuWzkek6LXfaEV9ghlHppDC7VExu6XtjuObZJZmagJgGjc5QSx6/dF+Vj +vVU+u3nTokS0ikL+U9F4TRddEIu4yyZJrb0CjI2yddWnqyqqWI/dwU/WIsVdloyNpNcq6/KVmtzm +si5QIBX/I+ybDiq3oiGwj4e+rwG66pcWsM82amU1SwM7rQ0gAO5hii6nTs6u2kysdt2ql8T9+wr2 +5gDllCoO9X1dOs1o1f3L4d5LfcN3SmyPeUiYvCdfjDsvlocF8h8bYJAGiU10vgOR41l4UKeqvZyI +wCHc8f6a0lyCoZh4UEktWI0mVFk82fZNmEWionCRP8sV28hIlXlxtXG9pxonh4x/fnxx99tD2OSn +EKxuvUiL/r7wOJdx4ZLdEf6FVq+kMdno42ldehOBgaeKszShzFJQdMcATJqfzjrWFLie2AUVXWmC +4ybRb5ZDZZYF9iiG0ucR9/RXDFD1ujdrTfEWk9y1cIRLEQAiqc1gMTgpi7i8/vkNA+RMaipHdsS4 +WUsOkkoTJpb5GJlLDhcq72vTnUB+3mH8HD6WELIWIKma1lpxZ1bvX5BZC2+R6+fRvThOeYXbEV8C +0J9s3KJdOzwTU/8tEHzoU2YW5OaTzEinafxjiw4CKYfconxMVFRaxrzaRXnkUSaK0QDWbYE46NkC +8Ko2QTFtbldFfx1MPOebGsVZJ0N4GIiYFcp2FaqqspDMNZersNqDU+8YF92A96kitWcbDT/mg/Nh +eEKohOPWzTvWywPfIS5yydkdNxd2VXYLHtUJ3jeUN3qjrsjlMpXVdT6Lh+l8tKzcbwpa0vh7I8xj +0es6z7ZO1hnaaT4o9aIbhRyArcuT8EsulM81JDtl9zLpMtqafLIfXcidT5frO9Qyn+16NulZfXJg +/P0FROlRWASaPfrFjbAEY16sM2Ml0s/Y5lNS3Zuefc6VwPWD4HpmMlOwsMcAn8jcBmot0kWlVVF1 +n5M2fQ7MHgcYKuRlOiap1dU+nW4e4XOH3AyTPoA9KzvJYX8hLI010kQNJqMwVtZjiHHPggR0vIkE +TPsyYtm8LxvUm3aau9UcYE+609m8uPe/8IVpgCGQn52fhJZe7/xgSU3d7T/+wJ8vIIzMgIQ6SQLt +FNAkuqzQikdLdyxs4UEcW0o1X8vFAvhrHx8v0IDgUF2FnLJ4VmUPQq2XixyTcIGsriDOqFrPniOt +U1SZcV4zsSBNys9ioJt9I9F1yYYtHPboglOMaJ42lttAOQMxWpLv5UaC/V0PVs60dxOjORwk094i +VGCjLdPenXHb4+Dbbw3GeNGzJ8QMlBTd2rmpRuRwbZimn6pllt+UqxzqIhffVHoSl+jaHICVkPn/ +Y+9dlyM5jjTRJ+h36D8y06wtoIx7xPAX2RrNmXOgi4ma2Vk7dowGokERS6DBQaNFcZ7+hF8+jyhU +gV1FkUAVWLtGTbd3VmRmZISHXz7/fDr26cHsxOPn1TcTmkn6ilkQtI5wqFac6+xYSQakpi8uKS0+ +G5FJATmXS+gvwD4LzFoqTnOYMZRcUu2Vnh7WtZllyP4vC5AGdI4nfBsQ9btsQR1qaaHVJYPFIEgi +GAPAlYm2bcoEaeVWuCJ0AyFKR6z8vlixfhBwog5q6Xhw49GjakCAHiDY70fzYBjQXHyWwFQP3V8m +UIWWUOq1HjzvqH50ZaoHUjwAVakFdFpNaIZBllTOOoEAkpPVVVN+MIEbCn9EjLhxALcqCxtygpp9 +dIPu0oOeTczJJUHFgRfLL4ZHCFCQnoteACox5IEnS9owecpV5Nls1w+wwK1w5p5GKVrHALkButRU +n3tS7RgAtV4kNExzNePMO4GS1RkW7Z3V6EcrRqArF2DKzFTg3y+oc9FUXLfI+1wCKVIyrPclAJgz +wCqerC0ggYJuY6+sOvJhFRpKt7LW5c25Yf6DzsQLFE2EYJZ1w+P0toid9D6HX4KUhAehvqcWT0mn +G3FRP6gPFLeMB0ARUhpeWDAuHwIrqncb0B6c8ep5PACKQKPZiz4aYDUZgMUT8A54sH5QY4Bo8AJC +lKHrqR8aPRrHPrmH6hNE67lDzmEyJL4ZMSTW2H80aKCPYurWGbBIowYkCA0X49O0k2GHdk92KEOb +rmx54jT29+SeEgcCksokTigIAurVJyvyTmYAkDC5te4O/W7s2csX8+Aa8JT1AvAKoDSfzQRIluP0 +2TgVkzBLYNyWUYKCthU06qj0COblA6FAGK/sbYBkewRRP58m2g40FvYE1oXjzVsMM1YaNsNibZl8 +mhKdxSB0PltwiVwWxD/A1RLNxKRIRfJ5WmAPwzLRcqIUlnEJe1drgaeoirakmyJWECu0nIQLwOIA +M/g2wbKrNbChAN0CYJ+LFrFq0+ZBL2Xf0K+MxnU2LkiXk5S1IhpYB8hT9WpYJkSpU9ASXelRZzrg +2hSPDEA1L83rhwhaESnjFrEy6doFGOJFmx4H6+xJZ6uZYxQnNXuu6oyFxVJJUSjY9Urpl8bIaAuU +jgBuRMIhcJIX2k7DynQGoKlPq8ghhxneDtaEwG2xcAo1yMCrmOZ4uzPzP5npSyHsCsgkaosfq1N0 +hsuLFgqkARoS7lBqFNcuoJf2acTrvRUSOQevhsS6S+kc9AjjO7vXopAQEiaYQg0AGvp9RmVoN3fl +u0TjAYuG9Qt8dtiViI6FZDhdbbd3puJ+lEdYYwuGqNWsKa+rKBNcQ282sCMkXrBHUTgVskWbxokT +kjlGUbpoWYbEw/RCtU3IVp6djNU4EOq8mpawN8sG8qB9J4d5mE1XjUaQLMHGMb8qZKs1jJZup2xO +g4URNEUZii3DNME5QhG2Dd2KGRkmbhouSw5TWE0rx6nvXxe3bNVcDoHLQK2HcDKgIIyE0RSHQzoO +GLEo2KgL/f3gAwHAix7BMNCoQqI38NhfxXw7EjvTG5r7qkbwEZTHiOYqobPWqNvoVxbFsgZzwEKz +pDaRL0rYgrKB3hDcZnXExc6aKDbWmYoB5khS/g9xU+KHKGWrIEVZRhFQRfIW8ATa4tFIWAxh3zWI +1/yns2hEHPACJ2av3KuB2cUFVDSEFkb2mJFtcqkiWadMczSmPxIm4M3ZmcAAoY3GXJoBplGL6gh4 +do/Q2AzcRxAIkQrNQQe9Ik8sPENWMZaCVkd6tOyMixkSBNiCDNrIS2Qbvwd6xxvhLwmNbB/puEd5 +dIq2t/VWq0JCpYzz0lINdwKRFQfgMIPR4kzWTJfnFTgKHHQ0r3XReV00BriJnkfE4AUP4D6KftJ7 +vmR8rAd0PQAm9EVk2ghRZ4YxmOWm1li0PptcziBBrRgMIJwkhwHEBCCnaQAewqmZxFqPEYPU1clj +VZxfMVgjOCuojlx6pCqaGxiJcJzUI+gduYYCx4+3AUbJASwbutIKwgedZzQ+fC4WlTpWEi6oDeNN +r0L1xOfC/ZiMTyJJdBnAGZQMJEN/E5rGmcOj0YyYJmqsJUGhEXZnQTmFQZ2yEYUl6wEdS9+pqJ0e +NXpdrG3auYQ0A/wD3Ea2yo1+pRalMuQJv0bpYzIjjLBHVvwSE8BPo/pmnLOEcyqo2jA0T7VvkCVy +JEIEGJgCMdoAoMtNwgF3puJxTGkAkPFbVuuj3QQZFWamsJ1+sU1FvFGdwC4czAhRe451IWrhktQ4 +8gBpmdYRSuQIrVarluUzAESEmII8Gfk8bgWR1SJeUVrMN8ySeBchEjKJaXHx+xaX2Q== + + + hTvT56qm0PHBEqNo9HNnhb8mZ4yOdAAGey8EXJP1CEyLuGiyNhc8KsBqcUpqJ2fsDnr+gyIOZ0c0 +RA/fC6UzVc3m5GSrqQ2VbVhgk6MpzsSQZigd5ftd56jDANm48sJi1HUUULVN44pJwxJt1yqmdOYd +0fJH+rkZEaMh7jqvHoYdoZagCQW+FjXmiGWnYIylGhaQcQPp4fZgwoI5+NnO9aQFezzAcLRSND2Z +LKVBwgVMaciXE6Q1GBMD+mKRGL0xifchABU7sEV5PFi2FE6y854pSQSeMPC3saH1IwjAU7a8QZbY +7gljb0Gomac6gfX7GFI3F2gODVZ1YfFgCkCR/Dp7CtHSLEqtsqCrCSs7MCFy4ytMjwZQYhPmYdXV +hmAF6jhJAb1tX+MRw+FE27+g6LMpUfTaA4CnbzFtFYX+8kbFIyjrI7gCh+lnBISLYTKiFNvD8gk6 +bcNWp0EbHgw+4/oDgEIpTGgRKtq+eZAbUZZ1CIFFQuNQFlpjhgVwF0cRRaB+QbhLefiARCOH8DY9 +AD2YUuW4YCQpipTC03mPcSxoz33UrSykYXB08tBHtpyW4etBQM1CpKehjd2gVVXiPQyAwKazvAfz +RQJhg8l58PzTYuVu8ICNclT2RsUIWUpLEavbicgKAcZdglWJDxrs9WHpnv/j32HSWgSdAV6gi0QR +04g1sxAuPrs7Jz/kggBYEweamoRwrFAOs/4EE7GkHZGDkZbFoODjxJcKE8wkVLhtJP9J887VREYa +gNdkdMWbGCg3PpVySlEqwEENOWuH7SnLC1YNRaQR5BtxBiyrx1MRSzQzXB1yz4lIMGKoR7x+f+xn +wuMDFeesW49bJpgC5/gtlV6BBELVOAkN1gIKfLcGCUYy3BkALWjJpRtacMHpu/5co4kGLP8glCFG +oe8Q/UMvu0xoJSTLijXW6A4ZCFNHLzviKvDIoVlFLFHdx6KpFqDoiINf67uDpUrWnwsP3ARmXgVU +al0Am3kP3FXotcgQafMS7RGhzyguVBJsFRfDtTaDZqD6DPCLgRFd/a2VMVrHkWZBXSddqzY+/Hir +gSLhUky8Fc52Z4UahPeIVi2DNiDVIAXaf1gerZIyNnx/xGtx/bdcq7Xk608wWP6CAT3RPoYwUgkc +f+CyJWFDxSIjK1QYgGFjKiRgpDTuw73HJEZD6t6KaMD58PD+Y8bA9BrmpmjEi5M0xpCDEfM3sycp +HuJN+mCMQaKZ8gLicevdTSATg0hwBtKwJ+o4cSoQwCLnQJ5eigFSRq6yWLaBQEjGqY6YNj8DCDcV +gr/+XIMk8sHA0Dtd7VqBHtA+qAOgSyv0S/EgNdeGR7gWKVegTmlQq5mFP7fpzUwjOmTDOVyAJ0Md +apAqZGhElA6HKZ+zPgg+VDIzXynmwVAMajIvZetnECtVird8JmEr1FmZEDYUNUdiarFiJrpdQxVO +U0/UUY8KTBIHfzc+GOYjGoxOEyg3KkbNTbC+fSRsSKVxjwURwokJw+tz0ZJbig8423y3MXFIpmvY +8gbiBuYagNjd6HMUzdV2c7aAjQ7M0EhNGB/xoAeOxiq69gDgN6dSVARE+fy7UXGoyCWHZpk+wnAa +tqcgrLw+CCyH2lcGKLLY25PROcKunqFBsevkAoKOj9KbaZCX1QlgbnxYzMMiA7iAm3mF4BGa3iHz +sGTkaejBvCXGnIQmmb/dmetj6P8Hr/DG3u3ByHg3mGaLN5R8M+MQaUiaAzM5B1CLIfnwpJuGcklY +LcyBXOqGNxNy5jjBMRmzd6Pi6KzbOqUYQZsx+npUY7lbH+TMRi8ORx8HDjF6aaN7GnqW4vQNBido +caoM7vY1zzwjJmAPwDRbvxMczGoIjiynzg3EGhzJUiliETktzcmSTxIhvLMsPBcn7Ppy7liEZYr0 +Pbgduh8EaX3N/8B8Qeh+ALslMyYNzQ+Q1E+S6znbPAYGLxZpyRLkvlEx6o+ygSxTtohCRkaZqoeN +ipSrl948/vtiQNdBb7f+AD9Jr/r4o3vVRyNay3PH2SBF/kN89kCsJ8LZg0EeEdsg653smaUmA6HD +MPqbscijFR/STjM+N2CkpltE9ElWccCRAaUFAFGdIWXrNx/9TVzGKcLRYfQ3AXtOMk5vaiY1cnWK +u12KEMiIzjGOW+pEtjQkV2H5FuMAiNaQporxIIfTaA3UplCf01axbKgN1ilF2/uJ1Ii3A6xWRvvI +G2dEK6m+wMApRq5OhgPSo+gRRyEJS9kmV0ZAA7XbcfB2B2u7FIcjSPYPWOi6rVzHAKnYB06IyYwE +bVwsUAOTkBKu0cyHJSAGgcgoCcckaJLdRYHJywMsbuCMgzcWOmMXdEONqqOs5oDHiYLiHpel00WV +LFwaENeBuUEUkmyPiHSbRbLINsODjRfL4szo6aWmdZX8Rp3Tda4vDo/FsVglw/ALR38OEoaHNHRu +LC5BNOD3QYl3aMk6/B51jeNMpiqkNmi/6kB4wgWMxmVDcNKGeImBJgkGbfyKFRluEjv7BA4cLN4J +kW+V7KThLrnxrL5tQAglLgi7cz4AyM+UQfHI1JQYl9s61jldREGUgJUE4j/v5XipDzBwRMQDuAbz +UJmhZ/ywBunyU98JFA97cvwswQo2P++FInTcTYYNBpfWSTtRnObIDCUgOlFulKb2ilTVZqErs4S8 +xKTrnKkgSGgcXzKNurpkH8JpoMAzQAf2VVpQWhgrWOhG3pOrEAGXaN4Ad8XwTFPBI0q54oQgIGMu +GDTYKl85+i0y9WnJHE2GM23AoTCKbwGQRcm0qZrVyA+nAdDCJE7EJF3Mjyhbp1qVbHOgE3SoeKQo +BSKKIyDsud4cH0wPERJGbN2qfLy+TfB4ppbBAJxwkAGyQfvQFHwCV88hUYPikHQx3ltVEwQNDAPp +iofqJjumxVgQwiJLXUZtFbC+oSdZJZ5oTTR8qdGDmjCEzSBCQCiRU26njfbkIVygz8jKa+aVEIDO +Q/ktAADTALiVEoEFZ5D3eKqsmiQbutuA1QQ1bAMUICqGUXm2X7z1FOB88XgmGcALg69uDQMLBo/9 +wvjj/63XMsWmnjQ6LgUvoy3YqrJkPb+cFe11Mah81HnRa5VdYZw+YT5BGdyDAZoRbQICEaKUyukS +0Lp4xs8juQmjnsCCA1ehpPwE/2v+4RQSmxPwaN74GQOhNBo2jBNgRkhWfzSywYw1XDm/MED2IHjk +qjlAEJn3U8wALXKgmzVg2tBlMXDHH1gs1sA2JKlIXTnvGYJouQw1jwisWID1G+xkBEFMMDRBHx3y +RAvqlLYjFENsKibPMITB2K61xUYo0j5Vp0ZpOop1JYsSHQPU7gE45UzFDFMQMWCMxWxl7YQhwmbn +DHMkYdxWDGMDdCYBRIpl2o3/gouY9Vz1mNs6cegDNUPQvoipSfrBqgXqkxAk4PejlcKimBdCJtrR +7jQdHarxrCiMUwYgml1vkQCpBCahQ+7YGo80CUypEJFghhxiuhZrpUq0IgXw5SUaA4l3YZpEEaJY +hZK+CMqHNpVK2KehMh6j4B9kJ1HZ6JJ4TBiAw/YyiSAm6Xo+ICCTtcItjhLQmTmXaFysQwPIo0io +5YvJ8LxE4lJh8rAdjwFiNJSOmrmMAoQ5hzpgwsVFzDeDFQzcqICcTJF1oCsRUyASzmYt9oL13wrG +caTl0vJgWuBFwDg7K2BSRy9V0TLAwHp5CQLWGVlA1y7gbYc1SEKHnTCYRglulzEAWleQMFmLCSTe +KSSPM2TUMpM4AORi8KVgRjVhrQTcQRg8LWLVvhMA3DEhmDyY1m/Emd8cfXpp1IYdwugKA/x567ai +0HDibjJlzX6LCIfJM+hlSWwFEVqQFpVDnD8tWD4JLWdYNSPCJqkdmNUipzEZSXkaGNUkTXvrlLEl +mcEyinVxiNlcRsMbBkwfilJjkpC6/NbMpTg6nSar5Y50zjR9ehAUk9AYsIvpTXom07H28Jn6q2MA +NcWJpivBkp5Qr9laJibz+mkAY50HZXjUvjn6rGHQf2WHj2JrkIqFMlYA1EOeuroM3h8CFnoo5FJB +sEPi0DT8hhZIBFiMZZ4FES5uYAMxtUVqZsY+EiHosLL5GESX1qCP+30HjjGagRvTRJcGAoQ0iOiK +fNTVz1AmLT3AALHIPOuu17mhA9SWNqjGivUKo7ctdQzQGloZLcKCyQDJsTgl202ccx7tOUaTplin +0D04g2ObIo3wtAjzaDuujLhrm3xIpK8JyqRsDVlIc04E9JSB0mUdCcggSseT+FwiXMycA0piMYLS +NFHS0+8NuAqsNaGebOOBTZWQkA0rplp/jjTI67Xpz4mSFIZZd4uwJbwBlwEbaLEBHAg6eBI6NE6q +QdYsoxNxZTPIQiJyJDtWI4CMCDlmYxMh7kXvcKZZ8/nkDTyUZngjMwipOnZAbTKWWu/k7Pej0Rb8 +BAYnQgi6B8IgViBVmMUOA+Rmi8tN8EjmctGDCnhDHwJWrBLoUitiC/5UY5tJg7A8WW6SGDDNtkGu +NlEFdNLZGoRfBEOsMa8+QDJESzaWlZTMXZ8PyjT6WyShuhVhMRsGMF0CF2bTnSOQT6ramkQ5OefS +ShNPTRbzE8A+ZSDNeAJni14CETTqAuQqnPDEWFFsL2OSp6ddsGYR9CBwYzSFqHqHXsHA1kxfYPjI +arDTqE9LuWBAgl2RdqHUGk4jGXkigSDxEmzbJQyQowGmNBBB2RCrV+VMqGVDtHIxTz3AE1FbOuQn +teyO8iEVITEwfJDQzGk+OjFuNEdj4o7NzZqxJg/y2FKRxRseEPWXG/a0tVtgqtm1nVenyB6A9F3o +A8ygbD7++rUgyx2rmePJIgwN6tMaZVfjOUkTKC7VyfLEwUDPYDWRRUNddCsLOCooDs+LyeGGZPoE +dl6heJmfwDZkHL+P1joKlitxAC+ws2H6duGEsjMHhLr0OQQUihZakDBEO9oWcBO7GmD4JDtt2uQb +WmatSfvNashgEQYPFPe0GJvVAidjWOPmgQgHNzUESGjWAStQG8AZ8r6Mp23WLFjJeeixPJT1iMt1 +8ejtgO/VzCDX8gcRlsVsv2AgbHIOnZ3DFQ+Q7RTms1HvFGCQm+mdRriOld7orG1mHusZE48z1x62 +mp0/TeEIG/AyHHDJClNEFWgmoh8/u3YiRGQwS6iHB6BmiwUoBvjteZmCASD5yErPp4sbNmlerGV4 +kryb8HGPOOJYidlJUzl5sILOjughQw4nAkssxvHKSwbDIslGFTNNR5hsNPWLpn6PDHbXUf3Uv0Ut +EWL0TlZ5UCM6MIL1UnUffo/tifhT9hauG65t9uaCqPGMnzcLUNi8BgvRZ4OP51GLMFtCJFb7JFuf +FxJ6y757654Imz5LflEGYDgCZhu9/NRoZ2HUoC0RvVek3pmYXgaglY6PHcEq3zKCIZykUGGx6ECy +LoVZGsXq0jQK+9EFKGrCKxN/DSIZtrlIahE8+9bj0mzsJ5nPWPgvxl+TR2lyNgIeag== + + + T+hRLTQJh7s8bCbqWhgAU0BXC7rWexX6iE6GnPmS72o5MLrUzsqpFSIg5Mmg8NSzsFkoxlR0LmLd +273QYXFaGUZ4Ry0O07ANGtoWAmOfuS2ZyLhWTkY1ImwSV1zqRtvDsJg2ddqMtUogbJwyGCDlhnH1 +TM3VVMkoqqEGiTaxnBiWASjNYs4tCrGoGWJESYxthGZtlLL1XKErAxAgK8PC9s7CVHYi3RSD6UiN +x1Pbw2xRpmpd3KgIF+aV9QrzloPLoz+hn9927s5X1avJU2dO6mnR8HldtT56zXQEaqwLJQcdxjUE +PDfFgHMJ8hDq9qE1KtlQYTRAAMbHogFcjmBbVA1abq4HWJLXvBJVMyjNur4BBoCZmq1XJw2gUZ0s +7uDJSnu/LJVgGCBbTZ/NYrR8XT7VuCR1UrEXsPw9dfdzpWK+G37OX3n1BaKFW/NET02dWGzn8oF1 +pmKkJ8cmpZe1WFFWS5+e1SH0PyL3JcoWEnEDWybdLlt6TnUajYscULJmMgxrYiGX7L55/OcE6TC2 +GYfGNcORH/0GiuZz5A08WtSkZPpMncjC+TBsL2P8mdohZkTdC2EssDRtuVHxsNmWIYznH717UVha +kqFxRmCP+h4aTcA4FPkBijm3ov7p2iVgd6lXVdKkC0Y3sJKsoCmLZhMhliAyRUWb5OlywYnw2M+7 +eYJbaYa9jLZ0ef4C5ENAScPoLlx356ZnFSFI3bKETmWAbEnPbImLkixONgJ4NMA0hW4MADaXbGwq +1PyxLKZI8PtY4bCP/oQlmxGUrb1YyfPuVm+oEIkHjG4/empm6b+tNoz4u9STycEuKejehJamujDl +58Xq+TMDus5UalXYugWKlRtky51RR6gpSNhsSGAssiHPCnCxWdxGFUUoFquAhvrR4EOpFlrLxvhQ +qhxS46vhxq3B7kAfu+nGCHaV2Q4YMZmVn6NBbaXWnPolrOMowTWwmkfmgMQRmj6DuKTUyUpH9oP6 +c40y0mRvle1eIynDLTsBTkSHbhJar2aonmpJ+SwcjPh9XeCnDIRvadJwSLYOdkmVc1q/vLZ16n6l +t0JYa8tM/ciUf0ubc2DcxSMKFjQ8STezBQ27h8a1085ZqL6LQ8bmAV0OtQct9r7ZHgzdULOgXjAA +6DCyNaUslGAcB15SGeIDecpW0LDmAAwGZBKbZ4KYPN8rPLDyyqi6y6j/OpEOcGamAXNADU4rPrqm +tvjCoB8yz79HA+UsTehFGAOOFnhWdTFIlWxg/H4sOiTn6iL4Z9U/Gc3ukimFscBpAFsyiE9Kg1XY +DIoGqqN2J08sOHWZffaMppbUujWbc0uWHXq/DogdTDcauQJHbc/rBKFVJZKI44WuLYiUew0K1UHJ +lUR7iTAGQxzYEq/MFA+drxVh1VmnpWzp9kotNFMdn1F+7y0mNH0xP5k4HG0VIeJqK0tmhMqzMahX +L51XVHloz1NvybA8EVJVP30y68XqLdGcR0daQtHBax1hEh7ANJVCT2qwjpRjj1dljqnmWGAALqZR +26fiZnlEeRUIWEenTQ2o2BPk+CBMQNe60bNZG8dq+dEQygBhCqYC0EKdIw0erbynJHMIi43+8yRe +zHrTSjuarpAtnCKeN90pwXM2Kv5KTEH2eyXuqzOS0VpqklVvdsNochsM/pMlu6zCiENMYScsg5od +uTwa1uGg5aD8mYpB2Jyl9AliQGOzRLh0CM0ho0kncmuKmJc7DXqHzGV01uZzwQECv4pGbPBDxUSp +wQo2s8STMCjmBCd45cZmk9Wi97ZSitFVrEbDVmaD6NfRoCkLFlEHbeboGLUEXWvBBFPbdLNiQRrJ +v9co6UvZAYY3r9ECOtnwqVVxmqs7IE57ZUBTqNOqeYtxtF9FeF5P+xPt34pJzRY9416v4+TRrtBk +dNkcVgwKJsYseU78vrj6UMenKXkSnfVpxbbIUl6MAZaGkDeK2mo0qs0sECUVWoJhJESq+m0iViIl +ni7kf9TMJlm1CqyhhaL1Mh/Y5ZrMJB6gNuqgHfBlvSUYuLG2EfOMdrkThEHDfySMgDBMWigZGWUy +mv+aJpwY0Co1TxYUgxJkAFo8lr1XIgcSOnjWcB9qmghmp+biWajg9COIxVezRCNXF3K36xMmdpxm +ZTqmreFvmWP2yjpby3TqjAhoFyMTqWwrIvTOjrjqMMAIiSULidEAFesQKSm6NliBl/qrJGwWyrH+ +etQZvI4ok2Tv6Wlre6jKyxQFHx3E6AkSYldK4lpHtHFAAkjokOaP1huUOouPc0uDHrUYbHSAUelK +2wijGo27kCdbhwX9yrMtTpwFzfA5miuU31NQD4sAXD9tkb26YlRRmaARMY44NPezwMGHC9E+Jtk+ +pjLACLyLNQslahArpUDAgTvRjNbwGcJBDxbMNm+zBckKCm3Rh02Fek5ukmOIcA3vSB8DAxjhpYgC +GwSyo2yDG40Y3VHFqAO6jAQ12vHJYzmErUhswCn0nmxuqsVtKy3cURfVYPswvQAwvlkTFMS5YAQ5 +DEoXIVLOCh+XAbzVOunToqn5QJ4x9ckJ90Vn2KJcKz4l90o3E9q0IbduRx0Zx5POVDzWIQdOTGyQ +ZFQAMdGuYehHv/ZWQGffIhYtFSEHTNkoR+YmC6hMQstS5tdEHZYS0jNXI4o2qhWY0bCGnQIcl2rN +LagGiC1z06OaRKkkMGNYYaAdmKZx1GJwgb1RES8o+W/B8DHR6JvpCTQrRGhv8VCYLhJFduwV4/sC +cBkRqmHSBSN5996eKju7EEV+TK2AdYeWabQ6EkjRfMzW3X6xmnc7mLmOEuh2MFjTYnSAkIPnk1co +6hRHNR6JE8TTzUbNGMpR0Kvu4RNQDRRuBlwF1RF71IdxuYTqFP0EVqmExkVjaYnQG5tjVnB/0xb1 +8rENsUrXWo0g+7QqzNi34JiQ1jLWFAA0Yeg8JjfTE7hpX295rDgUZULd4OAMZP0LattB9sq9ojLo +zaETZyFWN3Xc8qA0mmymZodwNE1Xq2HzV4R8RIpwmDxVivN1bptuWzrZFMsahvtZhGNNP26DHeJM +cQwK/5rneYjeTNeK9hpgVq1JaGrlSnLAYQ2mhnIpAHzI+3A2QBu+trJfzoTj5Gkm6D+fwf7Irip2 +o43rZbXI5wmTr4uCjGCwzTrvPOTWqp9mV0+h6o21VythELBAmDxaGq46y9VQ4xAVLlOrnNGtjEI8 +igTS3icIxXBxMosVRFIGw3sAAINCeqnNc4iImrebARhCMcEF5WmoOqegYoKeHGULHBq1jiiKs+1C +7nwsQt0jFLA18pIBfKKQrwMlDUJXFL7WOrRgxG0UJ/cJsxUtaTm4OrRk/0TyMhHEv7k0S/hp+DsI +sNWSg2q7BrHUJaroDXESJIVKQm1QVoXVX7EGzVggwiDsLoOaL0hwA1leuKLBMJaUENY+HTQJHsN2 +pYthLXaWrek0vUWWsE2uc38ltfQoT71gi4wOnV3sjE4lJTmISWhtl/TApqx8zjpfQ60ziADMK0GJ +zwhu4PAAYYAg+oVoN1PdADygriZI3vJMxVl5POl9NYdPwgpeaPULsmbYRWg5pzxaagRjU8xp2jdo +wpyTFamFkeDIWtAqv1dPMkcL4/oBYwjSm1we1RICWXdmNTYfETJ5t95LYgQ5SKychczJhQHQPzZY +ipCBNw2ULxrTy94cgwDqNRUvmHGnTt8E/FkdwBjS2dCUAZzx/AbJ5z46KqGV8RUZ9SYDLFaUPni0 +u3AcLFgdjIrDvvMTD0axjwD7ICl+Q+dQsHZkMGIfmNWQRpGI8gYY3WhAtzYAAFKweHEQegQRoq19 +mFCMwVzZMIhjB7VBQHvnpF9D7m/OIYGoI7YHGLsJw12wikA9TxS10RpnWXduEjdsDrDOEUWtwvqC +nO4qLAUkUUauNeHQg0CjThjdjgjuWJtMKZxsK6OKikD3CXuGM38i9Eaqj5RwWqZ9lAz+RuMmjMuN +KE+U1Ni4x1Aq0iRJKAPUUXbA7ThVuoBBNcWxjI1VGalbbSwnA1QrOA2jVoVb0GAVgpc1zU9lZ1WM +07aPVhaEQuQgHRrkQmTggiRI8HvUw9P+l4OVhB5NzWDnTiVQYQpSEMO5B/cgeKlitBLBaHRxMU7f +oFhtK9VbJTQAs+qkaMjfMMp1yEyB4uVMtwwQ5l5GHhVjU48WjfPEYCQlEz8XSTWTECZGsjiSBkGy +bidcdQcPKJitT3yeGaaF7Xqq1CzYHegSGeYmQGy8nXB99OiGMvWQWKwOys8tfIAh9JbB86OU2UuR +Bw/gR3fXYCWVJFwwh147OBD/QUGjgon4KhincgCZK8nGMlQgq9fObTKoWc7caQs9GhWHSmQPDUsL +LoH3hijzU+EF9xozUjjNzfrF0CHeIPvURE69JT8BxV0zC9dbgQEJK9oCwYiiAaop02VqNIx+yV6C +EWcQRzAIcv4DYr9YawYwxTUjUaKqFYdnQPbATwa1U4gbi2HGEGOwEqAFK4MiapyCDomjzIL7oGIt +o8cuES9G9IlEKJZZKW0A67VO5J4BNheQGwuV40BJodf6RJqkOkIGCFMTI3jo66xD/2EEYX4KHvhB +EMamilyv/DqkyyIq0KPygLLnAiKIAZRhJ8HBzc/GlOQr6Nexo9efQJmSKkFBDBlNSvQG4kGxqwh1 +jv8aOFkfjYQJwJhlJFmLNc3JUi91shK/HUAuEmaACReDaNRRr54tEFUZjgLUeIOX/OAN8GrZ3Igs +FIo3EBekY+wh8oSPQE+Jmi0Kkad2PuvjKj8ZJ2QMt0SRyRsVF4PzloSUzOgowBVMJ5oo8hlCnBw1 +ml2XrQarRkPwZ8O5rT/AG3syOGWKS8GTwYoxFCTFAQzOG7RlVKWliHTtqMWTxBTSDEhijnbdmave +Nt4fD0Y9lQHo5S9wA7HDgynheqUSc2RMLbnnDMWYT8uAKIxMpmEynJR6VMH2REAUHtxen2sFrqI0 +hiTzBUngxTz+tphQjWYC0aSBSIYNQdEBA6skIJSaFFXIw8LlH1X+WVpxvNnwVKDF81N/jMGSnvzc +DqSiKz2JjVqBIwRnmwc5M+p6EHslsaFAXQ/VPuo44zJh0BS8GRcLW66Uwi5iRemuX0BzP4pWkc5b +fwD9RiFMdXVsmN9A3Iw7gmoV0F+tVkTuOOJztnmQs5+C0i/9aEo/KMKsFLq55gmHzuKzVTFxGhUg +99tmyfjpzOFHcRKh8avKwtn99TyR0XOGlzVgnmAeVOTPCjuPCpGa0GQ554mvlsTSUS1n62o3Uu9U +Z6DZTSr24OM/1zmomMVW7o6j8pbLwypreRmN4AmCJEnXQv4WYlQU/ZNmJrmZdVitoCZTUXkBfOHB +FFwQWT9hOl4zPQb9b3+UxYgPXeJjh2rucbg083ajYlBFqHGIyMWVErhO8ndl8ZTLWuZHpWp5rb5q +hmcmofJXcL6ENysVxVs5DsfKvQ4AnHWLAItSYf/gEV19eOlLsLomKCknJJ95EXTVjQ== + + + xtCVaC87IFIpLF54j1K1mFp0FOoWMHtexNBBBLxKJ+bUrOUmDaDCaidRQ/yIalJjHaH9RSASVG2r +2HvKwEq+OkUp2JMX0FpJqli2rtf0XhliFIuTn5FYPVCLFUWUsmtedFQOHSM9o0uNblYa0jMbhTr5 +NCo5FBePDxAAWk5J8IFMK0VurGSSqfmKNjqi/I4ce6nYFqTktNhsKQsNm2VzBHBHJbhK+ML5Uvbw +aL6dZmzJK+LYL1WJeoRT2QFhTUNxI8ov63w1ma9mZyy9rnT9QNgJAyxCg08LYaSH2SNgoddYOWhx +ZR2Zg7O+EvVwKoxUon8g7FgF63jJcIvrCLsRVrw6FYIjk1DlEkMgnJoVKxMCXJIWNYwKmSKGVhdG +a7zGsGu2bGqcWJEoti5zRtAX3cuFsR5ZhCgSylJrT4fQdDwSgt1X/X11AWj36ffK51O4OFyFwU0Q +eLWq6VrYJaSaOQZRNcxyIrUFUg1EGBkj7ueKAa8Phiwo34y9Ico3ZQdhyHxIVIIcA2BF4lh0gKoU +kfzB2LAjoZLKc8EBm/okJGfjAk8goQXKeakVyNUNrCg4OwYZbyKWMWQA6YksfVKBUBGhgpNp0BxQ +iqG+Mj1AGYUcS5TZKmhhSNVANevti08ohdGsTX1QOFQ5mV/TKFyyJqs1WuBzfRVfzOq4ijrOVF6E +aabZuFGpX6Y1hXJN3fJ1dHGmwk6hjq8acXyjA3RHQncAkDo5o56bkLneygoXKe7lDCCc0JyFxaK/ +68APFY/jvARxVHSe8qLn9mjHRwtQ4vxkZGQp6iNwu3BD0wMGIJKzkI9wrBwnvEe1BtXTau6BHlvt +jmAdugmfKp1UKAlgcXMCFEs7gTwa1DKiWUyEaN3PCfvccKXHOiW0t2gbmnfgzYg5fNFLQcrCmURO +kaL0FgNU79av1bAWj5rSDzyAM3sqWokaTYsUAtAL+AjDR3OpJBxQRMu8ZqK/rEjzalOfHAUGrcLM +yiIn+VY2QBUFPTiu6GZSOUeZIFhZHpmtnEZwsnILzyzWX1y0aqsiClmcQdWpGkNKD2krjaqtiv5W +xZpSFmMFLQNgSfpaEr+06bvSuNAlqPNCqc5RtqbUeDQ6ymwMH0kFATaDhSlRoojRub0423HOGNUp +j+kZU05rNFsCq8HUYFixpfayJG7rYNth+7qpWhtEBTTxqsaLcEzI5tZgEukMncJsXNx1rnqixS+N +sSnAodFwWmbidDPAIGHUVU00W4/9qPpm1T/pxkSmE0q8mQLiLerRt7Dtnpt1WCG6LgmR9GUsZ0EX +KlQNkbckoJ0uBmCSesdIYpQ41BZtE5LAD0BBbuPlcBEt3+NA+zm6L++WWK3/nSvyJfqzUsBRG/5S +pFMi5pQZ0mbpTFHMdgQ3scwq0/UjuRpdKj5hD5Mr7rXPgqVF08TX28zKU2inDNDEUhGDTgv8iKw2 +8kclIgvFQ1P7h8JmftKyIBkgA6hOvAjBguMKlqOkpWZjPH3PqKZfI6QSpkCZRVIzqDjNVvQ6AEP8 +5Mp+UCRVueSqyTcoAoUTjaU62zEXqV7LHtyJ8IrHpipzdFdcCuJ1WTv5nnC0WInDSIsgAmxl3EV7 +DckADRB4qpzWVUDRYvkKtJ+V+mypqEYqYUIRLhFB7OLMYVgW4BipBl9iVLSQtdM3H2VJtHZmjPui +WtsJ9DhzbCKozmyiynOz6oOsTHpveIBF0LJyGIiFRttOwy3EmRG45dSGvbiyY8W+IHpNyfTGIANL +OKXgC6Lx8AnTmWaJR3OT4jjIV1ndRTdVSBHLqZTKUU9oazLehMY+NAM4U49C6XEX6tz+1cHAJapQ +/VLECyn6lskz5XSj5spOHmAZLB3R+IrpT0bDmYTglB5V4kzr7z9aJGoBd1FKD3Sg0orJ4q3LGelQ +r4sClBwuoUiVcCXO9kBF2qk4SQ3KhlM9VOxhOT8k66fgwUScheyRVrs6hp4pw7JcWwtyYdoAi/En +1lbF8uW5SOzvhHNserzRMdMEDkNXis7O2mKVtcDmaxPYmfOgjPZJsog8QDXEgy9gbeaNoT1vIiI+ +jNRQ1u0Eh462u1U1Ej91geWYk3LPRpuuZTBZe6xiYtiyWELw4DVh8jIxEZifmhcs0aeh605D12s6 +C2rQKWiwfal1sxbddPWqrjGlyDWY4SNa8HKP0Okw0BgJNU9OxfrgVIR3dHX6jJLZOBdA0HQLAJM7 +aCdT5XIW0ErWml9iqi/Yx9ZdwGfU50YvXNknM5s2JbhB6RtQVUHUo/CRmIqabaw40B3BukbRoBob +fkw7bNQkG3XOhv35yFbetOUfUQ5k+bIeoY73moKLVhxHQy7iO8eAWne2JiyOHcXeZWsCSJLQhCOT +hTiIOFPOmyDWKThCaX0JukhLawMWyLQSqkYzbTQXTs5cP/PjCs41KwOhvD6bdbyFNANDNM0FB8sg +xwhl3sNKjhGYrRAOmYYJQgRXDln+lGDkHRC0obQa+Rnc3FpZlAfBCJFwCy8PE+TYEwTQr+VqHjHt +yyYqdzQI7NZMEXuu68Zqbc/J8pEizeKs3IfI/yWnTiQq2kiTrBYx8r2E2i5UC2XJwhYngDO9l0xh +SYY391rW14VRSggemFMcoJFgHG0s2cPk22iAjaEKvISpGtkSil7xSixGSQRpcmGKo9JndGXwYLCu +iyxHGcBqk8lnQka+SoUK+zRNaYRcRpqHGAlIUV+oTYyzrBhrFXV6kRqeMorsnZMgAU/MsMqpXY1U +ebLY2wCLx7VKNrp+mq7YImqMrFtt6H+4wcLbaAtuths325gbrdFHLdeNVu66PfyI7bzZzt5okT9i +vW+09Df6BI/4Dxt9jY1eySMezAZnZ6NX9IgDtdHXesQr2+jBFZDP0fmCfofGqUcHicZLvNUVRW2q +Ki9gxz6dCmrne48yABL6AHtq06m58YDdeBQ/cmxvOuE3mgKPmA0bTYyNxshGu2WjibPZGHrEcNpo +ZG0yxx4x3TabeRsNwkeMx42G5j9svm40ih8xoDfZ2huN8kcM+A22/kan4DEHYqOzsckr2aByH1XP +GxX5I0p/kfNWYnHKRcpthxnjwwxNMupjPvRGf3ujZ77Bix+nhtcQ+fr5egMjd/0sfuTU3njCb7QG +NtoNj9gYm8yRR+yWTTbORntos+X0iJW10SLbaLs9YudttAk3Wo+bLc1NRulm63WTmbvRHt5kOT9i +ZW+0yDfa7o/Z+Rt9go3ew2ZHI6GXHvdB0R4Mbfo9CsUJ2y6pC0bcGhGt5aLprtpLnK+VM4fMCuVP +tu4WMUw1dYzBZpgqgQYy8OLqUxF7uBMTj4AGntdw0gY1vAIIPiC/Z8bk0V5Bj/1qSb6orYrkGxpp +BHenYLeQLJ+a0XGiCmVDTsaCFQPS5kz46CcEtNyMaRyj+joKmiDdjD4Y9FoRF5axBro5iw2rFVfU +4kR3YbQANy0ioeIlhRmh70KA9UmZXLh1DhE7qklD87KGSu+qoC4c+4pWI0AcoMoReCVK2Wh9wWOG +/kanYKP7sMHVmBSm6Evm4eIUD+kdSlAA6KYqnEwKPceJVEkggL4ZsSzh56T9HQnBzUE5FEk9Ua8t +pEjVaA2DRLgE0IdzZHBBMsaSVJEsZAcGWG0EjmtPJHcp1By05MqUCnFLVMiLIlRyRo0/tbLQ7D8t +GaHc4T4S+LlD7pKY9qMRC7clKlwBnRcYfJETFGhRbZ88+iMTaAk9JSogMoQjUJuRDDVBfBJ0k8A5 +stUKaIMI3LpYWUDfdPxFmykARuoLetBNvNnUo0dZHN3cu0iZgBbjTqWgSuXCPCJBsEK1aLWNRASh +XGykrWX7VW6yoDIlPqVS0bHVudm7Hq5o3BaNGpJME9CJL+B7pEOsopscNWSQL8tkuBktJVJOmv9N +KEaiM6QqNoQD6jIAMyToibFkbTxg/XvJ8whKz98AxSVvwlupnNXXRKVtkFWgNOWkxZ2MypzNPAch +j7R05jqSLFJbRYWKhSouVXLlhnxcmJlBSgYRZZho9iLK1Hwx62p9G6/s9RHff6DUAOTcoAAfUZUb +tOpmBbxJUz+i1B85ADYeFRuPlY1H0MbDavPBtvkQ3HRabj5YNx/Cjx7XG4/2RdY1iwWRTkIBVLIw +mm1QeU2wEN4YPZjsAeplhvYlEYVvszAhpgOhTEElpuH44NqGnj9k0ilUhnaAQJtDmWpoSGdKl1rq +dKdEgPTtpC1ZGKSDj+yWjRtr0xZ8ZLtu3toblcAjCuMR5bJRDW1SWRvV22ZF+IjS3KRfNyniR5Q2 +tfKTGrc6EmX0lWTX12pPFTI8YqreCDBPuNcjkAXgFe3+gNZs9AGYswvdLtUWqtU0BLfmrBlPGxGW +2GQLbbSbNltYG6yxod7cQDBzqTebIlztCASzUlX7kWkkqJ0Y8/RwzmijNJFALVKNYZ2mTSoPA4Un +BRpTUHbOCjcbC0Ri9QT4NX6vEVcypoxGp2oiVh5X9QMNIUuIhEFtrCr9XHnc1tJgTdJvGLS/gjyY +VoIFb8BSEmbeBRS1GQU2uYvZzyY/EFRjCbQXgdDIwbDdSQZIAp1npcEcgkE9JW7ELRahVn9QC6tq +zNratpcUmPWF62eL2plpEK0QwMZz5R3tQ8V3dDuqSB0YAZTIeOInoMNFairz4Gii2JOEwbgAvULo +pGcSnVLOGggkHNLFGR8IEdqLX1niUFtJygh1I4OshhRnE0ycs8gv1VIIZps+0qgYVscUWHx4ZWiG +ax30Akq6YjM/eaOVt9Ei3Gg7PmJnbrJJN1qvj1i6G63izfbzZlN7o1W+yXx/1NJf9wo2+g+P+Rob +/ZJ1/2WzoyOUnbqJES0EfouFXruKrGunFR2m/tj6IhOM5yMLcsPSfWSZb9wSmzbPIxtt86bcuH03 +b/WNamGzAnlE2WxUTBtV2CPqrgBiSJ2DB6eeMiOGbLgx2rQSGaTDM5VxEASpFKIDSUsMGNobFNyC +znXVWgZQ91FjOyFwb+b5ok1eA+peujGhtSHAdNN7VYHMELjemHAooif26zJwogXlnmTBLAGVmmrj +UBe9aNU4BUdcWqxfCgkbrkVLKjq/xUojoUuDK5A0HYkxVagYcHaIj7qPpIFv/Bbmu2ZaRKgxzOSN +BadmdDlMAVV5Io4S0mBxxlRpYWsK1hmIznf9ebMAJNFC6itFI4Kgn0cEFhE74QJPcR6UheeNLsGs +1SBJbirCpfACSPl0MKkqtwNRakw0sDp11Zow1GDz2aTqSYQagczLxLZD6GV1tJZhdHjLNyxWdk28 +x+pSLVOZePVTxYVCshmO6wAXM9yuEhJmNyhaKHSevSZJlQmPksWaIx3t2wr34OYLm3BbvlFNqwnG +omX4J+wPa51nGc2pqPeLWoZOXlmUGHULZTeL6arrA4VXlQpFVGPQI9ALgxYOiyj9BUlFa1grMzZf +izpQDERXekHpj05H+G0xsowccHzSPtDu9pmyKosa51OjH2JXkD4oi9Wh0UwKMwgd4A== + + + SVsNMQQwiDAYMR+JhTKF6qI0Z0ipryhv2oyMmzS3EkORA+Xs96lWfQDj+BnMsou1haB3dVLGrixq +eAMGJMq14OghmhG9k6YRKbGuoOUmWG/5uQccgQxadCrSVK1YSmg25UDECM5VuIhN8Oi1Wl07Qf4j +GyC1iR78gSdQThWZAe/wDUG+QBvIBkA3Tyf6Aa+g1gaVT2nRPz1tBiMSJz5O2HNFc8YwUUHn0RM1 +GKkD10SBiqzoGcTqQERcfHChP3eSbyNajqrdjxZjpAviy4kQzWXilHbm+4Pz0WnGhLxsY68DGTll +dSuoEQfNEnfOc/qsKFYmxMHSlJUCbQqp+YvQJnS9UqwbHmV9QW6Aqt/EyDJ0kskNXDqbzOXNpvUm +I3yTwf4TFPaWf6ywV71SF3DAN6VJGhIKQlGLqlG8uy7hX82VvM6KUrkmgn1t2gIoSk3SW52Ou2I0 +EYpMqHkwYkaKeunvOab4Rgfo1qtey0nPM4xbUbeFs5eKUKWtRR3c9hJryFPAqI2sx8ozjd8ivbH2 +TqAOIMCHnNJBsqM3Kk5LipP4bE3MoTeIi7TAoRJRha2w1qhAR6BFwdrt8BwVJItJGbZuVNz/rIMY +7+HatSJstYbp0WBvYkWoFYTAgXYQxRAQc6HXeOaPXL2IkZ2C9a+qXAkKW6yZhdetv3ldWlRD+FjJ +xwtq91TiPNQVCxhapSiiAFBm0hxS19H8hPGZKoghadxqhcRu4eAinkEsRz1QcTNYmV0Jh2lcFYqR +PU/7LOTQn/kJLcP4A3nE/DFhOs1vMP1+7RNfD0+v71JB3JvSWJ3iIGW3N2ufbuX7L0toawt5bZAz +u63j27qVmxJQULmkF8l936jYZ6GLW4xTnpr4OOGEdJIsEKGCWrieGq4mjauMjM66JRPXZQRvkcbQ +qPmMPDDJRiO8WewHhWaWBUCEs4oToQyosuw6SUxggCKrmMqOvUfzlu72uZUHIIPWSKrGA6xcygkY +sH2iNYPe7aRIj5XiHtzLGaX8/FzTtfoO6POSfNKrmWjq4e0WiZPKq4EEeRF0ysYPeWEUJjqTWTvg +4QsXz+/Hpo8EjbjtVFFwBsiXiArUZ0VYLWYHFu5OqY4AQ+5EqFSglPdSR2asGwrpWKleg4OvUnQS +UhL5nKam5vTKDlWQoxVXQxFgVnYDTJquiKwUautXO00NUEclOX+YUbK61xun7M1H9i7XGGZFiXLG +CZMMxJcOJEItaFu9pXaTzzNb3PiqjD7VwNbGTzffalBIl4puQ2DB1KcVCrc8SIKnV4iD/X26VzTP +jCZN3FXyEdLoOKXfM06c+DRAQanpdO2GWV+bwzcrquvhMzLxr02zK1okDJ+G+4iFeXGsztLqSw4p +Pzrak4Fu4FHxWItMwxvWpfh+K0tx7T1ESz/Qzcrurz6JA6tBknrHVZ1AoQghtXWSM1WhNpdRhf1G +B0g5tklln0iaOcQHiq1oa6aHupUKQyEGRLVkYzFzlrorHK4La08wrtVXOMO40enV1nORo0D6tF6z +f4U4TJo+weiyPT3YCIMwVYBXdQm63vW5hbqMoEwnQgsKRd+oOBaBwy1CIX+2+i2oEzYRQKH5ZmtR +c4tAMRcydRcdwjo6cuAZ5CjW3Gpl3JXb6Zcjz2700aOIVE0PRrapp0cz7otF2j7gcXG34mpYe4tZ +zM+2/hB8t7PV1Uqp2YoGB0QGEGtdE9vTkRgdBechAqEeN34QNbg9hY2rBkg4+iUoT0MqM8OMckYS +qYrXqElQHjvCRrVF4wODAni6thoOgMBVLsa1AfAEeiUGwLXVwjkro45iMGaKHhfK74kjZhKe6aDK +GUCWXwW7pFYx1IH8JFC7lABwmDcPyJgXNwJiEaYAFg2XrHYQV+YJpOsdOm0ROYZy+3jqAgdH0YBo +C4xHitYDp71AHRPnyLIMEskWq5a2I89FRQRi4FCsNTbUsShkgZnrgRhwlOM2LJ1LKG/R/TePSq/I +ARZcKQNQUUvSmzHYToRaCoKbnTD+ui5ehaMDlNNkjLxZQtlJsTlEZ8tJWKaejM56oJE3pW1rurBZ +gANryJH91TTMN2hxXARKhpwssjLOVKyOCTe2sfoKdV+xafTK1nQA7vKDcdUpJq4lbQzlkgToJNan +/AJUoCFIBC5GRqx4Eo9DydEk6YmiFMQuG2O/nif4MsEh/IbGlm4QUY9jZkXYDC7sqN1ffuCEjO/N +HWQkWO0ydDNZ+8UIRqliqiolq+IYnKbvRaYE9H6xpo5BmPff6OpGpDAIKc+Z7gXwX3rBakCshiFF +AGklQqxYcAyiN1wQgwTkuAvRy8VPnYinAdSVkZ3rotPXAFUHVSiIU6nvi50/LuUPevZq9eJhRnhv +LPbT7IxGifPsDk1FxkHS2g9TSTjZT1CO0R6uLx+tF5eKoSrL6mp8OAScpvUjRK0AYvNX52Z2mqjF +vPKbDWt6Rch266pwdpoIKZRbXDVKKdGxZD9Zgyec5mgNNTB8JbIfNcJU5XHPdNz+cm563rVx1cyn +ehRlbpkdjVyB0eLEBbIy2iQKl4oQRXIrv9cusWb+yqVaGUEy1R/Tk04W+Mq8KMUTEQBKZJJs5yat +kShbLc1fVueVGMlA6cNNl0SoTWXgEm38smpOkDGjXyxJOdqNhrqLOlDJ6G8o/q1vRpQKwI+q7ZmV +ywuhcq+UNkW6rYlQe3xSNivh92rnMt2LAdoaaF5yMYxSoi/rlSURdZqJPC0pzWhShYFgvwZtqUuG +RuOy9VSd6pNysFqsMhWdZKb5TiLmpqxnKs4S0ON2FGghQcj0RQtMrNeCMycyCYZr43yPD6HRX8oV +VqDRKVnZhPFHxWcq1qA2lRQhn6QkkSzMHijCRVL0RZnbMT1OVl4JhjIhtB1rthLs4Fu5EQMD3jx4 +Wvn9+lNpPnWspJU74aH8BFKYHsoLrcXZ6loo3kqFmKOP3RuqH9LUJyWca1JUyOh2mkZd0yJNUE44 +R6P2CxUVafkWlYRqmtbNGFdC3nGikcCN2tWLEKZarDSYt5jREAVoxWonJjFBeeBqJOtBWUa7sekZ +BptUogxz0VRxS3mMq442NaPP1qBCQ6fkL2odISX4BaZbhDlOkK9Bpl9InrRxcIqI4VIUQ8Pj01M1 +5jHBxKitREHOIkQkKcM+10tFVqUNLMWjrKcMUVsKnREVb1Dk7Uw/WD9Eg1zNQJ4TzXOxc1gG3IgY +XcSG4p7kANxMS0bFMu5YNE1WoAi1npeE6iJMwiqgwgdqDWKsUCcdZOZprPD1VoWqrSgYYnH76XnJ +zfFrj1utd9M0QhFQ0Oo0aCd74POynFplwLjHoMVomKdnldWBn3erWH8+POFphCwAopWzYV5047Xy +3K5mKBptVopZbA4FlYzzg1LhryLlh1raPA2RuLZ6Vftok6+Hqkq7r2JYoP8SB8VFSuTZRXckl71C +zL23ZP+q+c1Z6qC1AzDU19W46vdx0HFnwCXZQasvzT3wXBkrysjxwfOVqrVn9kZmS9jEjPYHbBJf +vFrZhFM7nJRE+bBNDcxaF6p7xT2gDJYfjXg5Cp/qihagDqCLqmJmvlcW8gHITto9vkrHdw8kpWpo +4iFXr2+ss5Zn5WCLuo39qwYAqM1thTg02R4g43HytEGVmxocZ+bHltW0/m0+FvmedqEu95s1Mcd3 +8NzQJo+KeZCzzWP/cDKLGu/YWc6Rvps1MbqIJKpUwBlvNZcOzSdKkLTXm/UB0CbIw7qcjASCtClX +xmxkJC8pxPnoXxnUaf5k/Q100xCTs54vaubcqFj7TxC/JgGGz1Ss2CuIT7gWJhvyCtMQySKQ4u8w +1dlqHTAf3oh2Rer+LB9pwE8jtyr1Kw8sYoXeFO0cfiLwZem2ND+VQ5CxaC9wgSQ70+PJdi3BKMUn +ghaVW2lFLYUajcqR+uwIom1lSZFYAscUV9Z2KAygLqqGk9KcUh2HGK0YF1PTV8h8O4yrvvv8vAmJ +uvl5SQdkN10p42aww63o/JiRy5oMI6IPX6DzYRhNS0Etqze6FDSTTnX4Dl1uSSw+MlW4a5dbGkK0 +YhndTNZX3uDd16ALdV+w+GsIaCJHqU7t+BEYAd4eCAPCPpTmLOgmQSULjd1WiHUAJV1eLDMZPKh1 +KT9o8NZAa7b5ycQSin+KV4izv8DFDbT6YJowd84J81dorQjlqYz/mmhUdP8Q8FemjLDd+jWbqXEq +/FBLvwnjqAxgTJZ1gIRJ6IuSg1rVLhd18JVe2r3JAGRqgRzU+EqqQC4F5QjOmAbGlBoEFX6x+gpV +mzKeqViVAOFAdTHQLMhiqKOpTFis5EgHeKNTiwhkMIqg4NC8iXmyvcrAehqE7Re/VwB3DSh5WpGh +geSKMBVQ2RAvgmTP8bory6COerxpIQZhj7E1J52EaGYpAomuEFihhPkDCCBwZ62gYt0nK0Iw9K8I ++eO80QGijyoOprZp6yjdMq3L16sP5qwV9PrO+9gpHWgnFeVs5ja2N9gSqbppnWGnLELygKvPNg/y +k/TIqP9ojwymhGBW2cbUN24Sn62Kq6qRAaFbl4yfErLuz2Zv/D/9T9+prxalwyERilOY9ebV569+ +9cVvPr27/+3Vxf3V7bvzu+9f/3MX/fpEUmTF/dPr33x+f3f17q+vf/3ZZ59eXHy4+fPt/Tld+0+v +/2e/8pP+H3wKQacyizp/qZ9m8FWUoJN3ocSVpPIpXpthjNc6hXGhgxlq1RANRy8nsiqKNgdjZcma +hjIkcnpScFjinNXybVPbUtosor7YPEdFEaFyEDBW25Ry6das0fK4ReDeLGTsNf+8MLIb8CFFJBPb ++AJEDlyJPNqqOMlLAWO7jMdSPDjXBpjbkRYcmuj1VVAnEyMSWNTARi+kwnuJJlDXHoWJU6m31Bg1 +6zaiO1zRS1kcTjkqkigTUYbM1YXOPqM9bT8QgsDvuBFWMcWp0KtkEAkqofHoGp5HvL8gJ01I4GIJ +B8zoaJlNGS1DQo/e7z7btQnRr9CgPLiTXkUN7oDTJwtZhgIsBSWetJaFcinWKxpJ7iUjNUEZUPL+ +ePqohZtbFCOODihLQEtIrmoR0PISkEehZKf1baDMUUX3erD6Bu0ALgk1DZrGKqlAHiARvvNCncYp +qwg0tbNWAMOXpUC/tIqpUUoKENEGpD8MAJ1D6p1J+iXKVUb5AXX1zKjVKogS0VEZtCRkgbnOLQYi +Ot4olXbVvJNswYKaEHpadXAoMyXrqMbRW0bzlNw0XWC9AUuINIlWZFFHwILMNIjYadcl8JUP/Cbt ++4AyAUS4m5eSPRYWBeRyv8mEggJjJCW9tSBfjvnj/NeiCdRF+49yIjLrYhlpWYLyCXaertXtyo1c +5IQeBfLN2ghV7T2oA4gERbnc+N4p3ECJnrmZfcICpp6vPPWUt7L1i57eA7rMTfW0bqyZpVin/vS8 +b5oiE9BNkzlAouZ+oUCRhpW8WEAfecrIeVR5oM8pQxOtdkR7RNAbFCThRrt2elsBQQ== + + + TAhSOgus+gUpQ57oqFniERujv0QkAm2qaawM3I8yTVHSupmQ3DdZv416bGiiF5lEms/i9FqnkAkC +TRsYaLRmZ0C2U0wV1jqBwpuBYLU0vXFvMs2bOsvdtAUTTqcQKsUaXA66VmsnqiWPaDYsYieJe6Sl +lb6ChNYUFWQE/EWDppQ5zYQBkELnyASWTECLTquArJI2E6G1HOZaf/TejoYP71OkY1qpIl2I4Nvo +50DSBRZDG7fSw9FbWo6FWR9Kyfl+91PZVJuMnJ9ucPIxnaJduNUx6g9wMhH1wIKFBsAP4fXUqMKu +TihS+2mebaPtGsukRJhPUQpRFhRgkZLO/E02mM1/++nsXPIkk8G2K9DujqIyCWAHjTwtCeC7qqym +P9WDPO68JBJ+8Yfbd3/qY9z3YU5ORMw+zfwPr/7wLf2LW+SfPv+Pf/3d1XUf5tVv7I/90X7zn78/ ++8Pt20v648ozP/oPn7z+9d9vrt/1fzrpj3V39eWH+8v39Oz9te/OH1xx8fXV9du7S343//o3//bu +fvwb/c/9999e0r/92i3Lr/rU/Pu7q4suxgzNl/7t/PqDXPvd1dv7r3/4YnLm6Nr+KHr1/9znN/r6 +8uqvX99v/Uq4/Mnfafs3+n7rl/n+Gd7j9sv/c3lx/9nth3dv+6N9dvv3bV/rK943/dL791u/4Mpv +nvxVP/23Lz69/vbr8y/ctu949XbSUY+8E12zx6vvI99zepG/4//+8OPui5q8/3D35Yfry3cXl9tO +hfx0y9nAfZ76w3ZLe9v3+fL8/eXv7i7/60OfhO2VzINfPfkb+m1f792Hmz9e3J//7XJ7/TL/5Mlf +7N3t5/dX9xcfOY7H+73nq/9ydb3DC6785snfkLbctm93d/n+w/X25zgu30YDPfLo7gcefbMWnw6z +y7/M6uSHH/YH5v2JP8jVu20/x+23l3fn97d3W3+Q8YO9XmZX7z6iT+aTmq598rf5/PbD3cXlv96d +f/v11cX2r7XDWz3jrnlze/Pt7fur+202zc/xAGxPfvTev/nt5VevPzl6e/v3Rkdv7+jt/dzeXjx6 +exte5MC8va/uzrthf/2H26v3L8zf2zoYcZju3ta77+juHd29o7t3dPeO7t7R3XvB7l58ce7eDm90 +KO7eiX8pDl/3gj67/Nvl9edfn7+9/e4FZL52+TQv1huSQ4bd25/tiHniV/ry+sNHrJWfwNjcV9/n +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 +ZeO2jw/P+Ya5yNG4BO+SB/T8YscNHOpVLyUDxuOt45NzxrG2YFwxm33oAoVPmya9quzxK9b2ael2 +I1q9v1Hx/a3j5yfTWl+gsNX6AmWbWl+gdFvrVd/ok4PTWzt75y+oUubo+MnhwXmrKRU7GS/bp+uP +pUcnY7+YHWTlHDkZNw66npxb5GD+dIvil84tRGadcfs5OX9OUrlx6zs4X9eeI21bp0sXx4VyJ8+2 +dubH83N6iQrNT+lmUO8FK28QR3J/qKXSql1kvNJMrGJctVWljhd3Yr4zryr5dLHkmnK6x54uXXtX +lxN73Pkl93bPWZD49rZ92Bgd2fBOcLr3UWpG99sLXXVXX674jEMJ3LYOnp5TVyp28nz3aDwzHJxz +caJix+N8Pz6ZH3I+uHNL0kXJrGnT9v3u8DHhUJrWudbGfnBYrZGz3QNJ83uyW3Uttb5iZKegE3qn +gFHImoHfrt0meSuhHn3/4cbHH+fhgzltb6T1jXeHD573793/67vdzi8f/pb/+m756Bd/qz+EOznk ++E3c/+Y3N/967zB9Gbqd5rGPvp1vHB+/+87j9988+vR3v/19OXk3f/SbL2/dO/ym/+Lu8Z++6a69 +/sE3975+dO+d99/Zdr9+Px0Mr23c+EN/En7xhzfe++Lx7e72G5/4/jd/eOvt8N6j0zsfPCkfPv/o +55+9s/XBk+7rd+1X/8Y7n8Vnr90IH73z2s3bv/rstTfeff6b116fu9+/9uazvz289joJ7t0Km2X8 +wztHr+sLnp2Gd49u/OZorPLv9rXKW5/d0T/99XfvcVtu3T4Z/j7+6eHRUpGxfSf53sEjf718/Ytr +r4/95LgF92uljv908jSPb85nb7z74Wu/7E/8ySdQmz8MX7798yfjXz/cG5/9+gO0efPk+Pjtk2+O +//z2g/vd7f7hda4rv3R8i7z2Q/en/qtnm2+ufOmfn975aO1Lo//b7dfWvfTx8V9uv/Hl+Jbpa/Wl +n9658fPPj/Y2V7305Od/iXfWvfSjd/+QDr5YeCm9hV/b3/jqjbe373+y6qXHZ3996/qvX//Na39d +9dLuXvfeb9a8NP78F/ntJ4Vn8oq29l//qbv36M4fVrb0Z/eO3nr9/u4nn6186Yc/P9xceKl+L/za +X/1us/9kXQd/fvynbf87eumNpe798GdfhteH01+Nj/WHS2P61i/G0dfXPvjVrxZGtX+UPtzjl44f +0uO705f++fjPXzz+bM1L3/p2+Hzn6e360muvN6/9y81Hn659abr95OGvVr/0N6/dOD55642T1S99 +kP4yvkXn71JbT3717tduzUuHZzd+dWf+4eqX9jf+/MZv3t5vWjq+pR3VreHnf49nn6x6aXfv93+4 +s+al8eevD3l4b81Lv/52nMn3Dh89WtnWn334i3d+uTl/9vnKl374h/zFuu796Jc3X7v1TF5690/P +741zrO3gn904+dVv3+QO/vXSSz/6dn/4+6+PuvGl6WjxpZsff/pnfenXN68vtPTa62m4deub+tpJ +W7+5023u/yGtfunHPzvLm19v55Uvvb83/6i+dByX6Wt/f+vvR2+ueekf3+gebv79bPVLfx/+snnv +3nuvrXrpOC6PPt79eG1bH34SH/113Us/6L7o/lJWv3Tz5s8f7Xz767f5pddeX2zrF39552TtS7+4 +Pv/2aN1LP+m+vPnenVUvvfb6+Nq7b3z523y8sbKDv3nz0V/WvvRvP3u0eWfNS/8Uuz9v/fUNfinN +sYW2fvr57vO3Xv/0zZUv/ctfvvp27UsP5+9df7rqpddep9d+0v317uYHqzv43ufuZ1+d/uHjVS89 +Pv705s/1pY/DjYWP5o3y67uBX3rtdbf1s9MPp6vSW8dnYaOjl7659NL771z/+1/ufvXb8aXvHC+8 +9I23Dr9+U1/6vPy6vnRck+m1rz/5489kK/d3vnYfTxeIz7q7n/7xQ3rpzeU99dObvzgIbz8YX7px +uti9d+/+7Ra/lMbl+t03F5bCX+28oatS+MVbG7+fLoXzN97Jn/6RXnp7+aXx9Z+98/VHH40v/d1r +9aXjW/gk5e/cfyZtfe+tP9xa6OC/Hb5z97m89L3PNzen3TsO7N+eHfKeOh6hHmy0v/rT/df8WweP +9XSx/PvZL18LO/tHq3/tb4wfzbvDfN2vx+Nk+GS3/jpdLfuvH3R3f3P/rvy+dBb45p1u87fB86/L +C/w373Wbn73Xr/qVZ/I373ebO7+P657e6P4/bd+5HTXSrX0FvgcbMNg4qapUCmQwNslDjsOAAcMw +A2OCgXXO+fNd+1fP3hW21FK32t2sd72z8NNSqeJOtcMfS8+qvl93snsHtx72/bqfPdr+/NPP2Ojv +L9ezR09PLvX9upk9vvLHSt+vNnuy9H0z/driL0vZ0a+l0v8+SqluZk+fLF3kX9vHLH95O3v6ceNy +1680Yy/3smen6qt9b9/NnhU7232/3s/+PFm+6vv1U/bq+Z9nw4yN/P5Xmb369Pd636919vrJedP3 +65Vsv9iv06+tPbZ/pDbP3rE9b79dUfUb/UfPr+9OqmunX+/2zti7R+rOgxO3e94++Kruftb/9vz6 +flW9+HTndPev9vWXx+cv/Pyzb8b0j/tLZ1Zv36Vf9ZlLKzebv15d2rx55RL/2qZ8+ud/Sxfy25/S +r27GtjfOPpQa2Mr7x2vXvv64y2SP9bN8/SGo0jW37z5c61I9vXJ5WS1f2fp5Znv38eXyBemS1//c +ubC5ADTb3b62ebC9fW3rzprU394s/4f+GP6e+PJJc4ZUQaJy0HNeJsq39Uf15Uy2dfH5L5yMl444 +/n0hrf4fJ7f+vfhu1Z2iEzs/qgfn7jcI7tEJfebi/Q1mI9BzBJWXH7X/QM/52voo1oU+m794Tp/t +/OiJ3fdbvR8lPafno060dXrOWymPybHmL96M+eiNjVp89P3p0yfTR0n6jx819FHSkvwEQ/o/Hz56 +47/GBJ9YkR/NH51KH3X6oNrs/ShJ/0IeM62xQvr/q/uj+YuXvR9103uoWx9dWJYT7KT/3o9C+n/f +99EP/R+t7j543pDHmmMlmaLno9VNyBT7fR990FrTheWtf0+eW/cdoH/5nX5uZPW7nzs/4DmW+vYG +tZiv3ufnmFrovaJpEGoc3N1fTtM+83I7WkjePrxGMhwTlzC36cRfUetP1Hr8z0uprLvZxqR+k6fp +zdoXNPAw9uEBdvL901/Rve1kH0sWouy2XV6m/2BBn0kh2H/gXuzNdeh+u/RIy/a0sHypvvHkvgNO +L/v/vH0uJGZvLgsH1z388rraefXjhhhu7LKTnnaW/X/W//jKcxN0sUCO0wjcHtxuTKCc+Wtb/3y4 +voz/uA15Obs1vkv0CPOXnk6t76zzf/x8qi5L4ANM+a/xU76wnGbej5D06s7x3V+aPD76z8PW+jU0 +PlpBJyf/0bWCcv32f50NnWedpmt8X+MSm2CHmbyCPeM7vzZgfy40JmtMY+uzbPYwFt7uN158m8/O +yv5WJ16kecfZP/7Mx+9NODkLAyYrm2GyvjUtV282v7aIj/vy+rfGB+K+m5L0QOZ3w7ghmhDGfkF6 +Vk/TvuyeuxfrP8f3xvMX+o+fOzKcdszdzl9Pl/rIdvepZMWm41Q6VN3Zm3FoGydbQ4vr0pjq7MP9 +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 +vbKHcHXW9Tuu9+B0df3GC4asJc1e12+cYPjuB3x651HX79LYqn6kWcyhrt/4GxuSxudQ12/shRmi +a+dS1+/S2Kp+zbuk49f167N09mVuOV5dv/4uwS2/t9rv9EVfP4zcMxLW8lNqdpk5w4QkptnfT85t +tU27Dmsf5qaPIjXb53jfClts7KdvLRuWW5z720kfbK7Lm7UvchIoTCCGQL098WXbz2dozL+2/2H7 +6OjSw3+vbP28cPuqqp490mcunbhOjyCaCrE8j++/PVpa/mvt9BJMQUtnXt/8Z2nz4qera+cvfa/X +Lpx/+GLt8b+fv2Y7O5+2sp1PG+ey3TsPrme7X//dy248qDeyvVt397O9w78/Zvf++/BP9ugPU2eP +b/37NHvy45+/s6fZT5zKp68v/sqebTxdyf5cf7KavXp34l72+vXzv7P9h+Zn9sY8P5O9+WPlwdHR +0c7W0Y+/vp4/+qW+PD36tV+t/DhTnoZA8PAnIjvPbPz7/ua9m3frv688ffXnx6Wzp5ef3z9Vnf/P +SX3L9x/duH36n8/LJ07UW3dXTv53sHwrr0/fe/fp+fULZ0Mo4NKv9W/53Te0JBz2dnX38ePl7NSH +9w67/7WTgvh12XPU0vXixw8ElO4tbVx7kYsSkL6O4LlrPZN1LnfT8et79ubC69Wjo7sba70jxVfy +1edrF8yZK9nutTvXst2/D25nN+7dPfxx8nXxDrGrS/57l77vrF2s7r7Mtnb3lxCT+CDbeVruU5m/ +bOveh/XWaUrHJ8S9yo22cpjsrWJoifvEmcBqnF5avXA3X9rYOvMUEbfXl05dr7aW1levXAF2e2nt +wYm7C8sIvL2Lny4vbVw175fW/3h+c+ns95NurG+/V35P7/7CfbteA908pc5uq/Pb/77dUhjV/pXz +e0tHtDi7O/qPyv3r0Te1/vHjJfevp9+9nT/b+nxik942p+rDn1m2srlFf4Iorvh/ffpw1r1zc5XL +df595vsa/lzzf55b2cCfG/7Pvdw34KjAz52Dz99rfMXeyq4eft37cfXOs2evHBX4WfuOXipX0w9y +BJcurokf3p7avhh+2N5IP+hrfz65TD/gK5dubaWfnOz18Wp4556KP7x2C7b8X7Z14+LZhMkv39he +Fz+IL9+4tUm8cv2sY2V/rbl2Tq7qVz8+/XI/PVT0p7n8ZMn9ef9KanufRESH7a7jkbNOxv5wjagJ +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 + + + uHltJ9t8PEoAIoXxBOCMN19frc6QETUM4/5Xfxaff2YLN13gkskaMTAn7p+ORusf3vznjj3put7m +avNVWkunBlzBn+fWAr+4uR5X4y/3xlOs0M1NurtGHNUmcTdIfq83EcV0c6vnxtNRhrD5Tou94c7s +CkKiv0N8fxPPMbNmKEHxuN4h/kLoE9JS7mxKKvDx4lbgg3tZZt/dudxBDwq3+T7eY6Jw6cVXopGr +nOWv4RE10XY5wWYFMtpls0oWq1a+zrnarJLFqnnPN1+bVbJYiSjuudusksWKb61+j80qKb5eG/8t +NqtksYq2y99gs0oWq3ZO2HnarFKv3R77bTartAyei/0Wm1VqgDLQ/SabVaPK1G+zWQ23w85is0rb +UFri5m2zShYrGstvslmtRYuVt/X/FpvVWrRYNWdsnjYrqSWQ5fo32aySlkA31r/JZpW0BJb5f4/N +KmkJDbvSnG1WDRvZb7NZJS2BZuw32ayS/LOw/PtsVklLcNL4b7NZJS0hRKf8DptVslhRHtXfZLNa +ixYrOpW/yWaVLFb+Lvm32KySxYp2cpfN6vzCMkxT+ztf3kuz1MLyskMeffj56xsesPvXPnz898ve +2//7cLSgFvl/mfsf/lvWi0pXi9pa94cFuvduYYWeXVSri3uOvO1vXT36ef3fg5//fv3y9uj/Fs8B +ev7H3pNb1xfPLfKz++7Z84srrjfZvnva/bQKW9i+6+H+QrZ41f3/+f+4/zxcyPzn7yxkvhvup/9z +f9x2//i0aBf/ZzFf/GPx5ats8T3eerigdLGpK60XlVGbRmdm8XBB5e6fVa0Xtao2i8zYRWX1plZ5 +vmiU2swLnS+qKtvM60Itmtpu1ibTiwcL2v1YFIVdzKt6M9M2X9Qm3yyMqRZNWW3qXJWLOrebtlYO +cR+p0YB7zxabdV6YRZPlm7mp7KIuqs2yqAr3j9K1lDmkrDfrLKsXta43Te0+crBgssI9bt2QTb1Z +qtI1autNVVpMuftwpQv3Yb2ZVa4nZb5ZF0WF1yqzWRmzqGuzmeuqdEMw7iPautFVGMBi7vpWVeik +Nptu9Wr3llXaNV27p10HKlvXi4V7ujZubY2uNlWWL7pXN8vcTQUeyYyby4OFRwu/Fs7+cnN9byHz +++Kz2yf/s6CNa69W9aIbwaYbZuEmXhvXEVspwnLjuo8JVLWbbyDWFkCsm9JCJ8RNoCk388z1TTzl +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 + + + diff --git a/content/posts/2024/11/23/langchain4j-musings/index.md b/content/posts/2024/11/23/langchain4j-musings/index.md index 2e9282e7e..4422015f6 100644 --- a/content/posts/2024/11/23/langchain4j-musings/index.md +++ b/content/posts/2024/11/23/langchain4j-musings/index.md @@ -20,7 +20,7 @@ frozen: false I'm coming relatively late to the LLM party, but I rarely come very early in the hype cycle. -![Gartner hype cycle](https://upload.wikimedia.org/wikipedia/commons/9/94/Gartner_Hype_Cycle.svg) +![Gartner hype cycle](Gartner_Hype_Cycle-2428adb1.svg) For example, I never bought into blockchain, the solution still searching for problems to solve, nor in microservices, the latest in the cargo cult IT trends. Despite my late arrival at the LLM party, I have been a regular user of LLMs. I use OpenAI for non-controversial questions outside my cone of knowledge, *e.g*., linguistics or legal; I use GitHub Copilot in my IDE to improve my code. diff --git a/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/GlassFish-commits-1024x437-1.jpg b/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/GlassFish-commits-1024x437-1.jpg new file mode 100644 index 000000000..17cacf8c5 Binary files /dev/null and b/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/GlassFish-commits-1024x437-1.jpg differ diff --git a/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/GlassFish-commits-1024x437-1.png b/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/GlassFish-commits-1024x437-1.png deleted file mode 100644 index 3c5581001..000000000 Binary files a/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/GlassFish-commits-1024x437-1.png and /dev/null differ diff --git a/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/GlassFish-commits-1024x437-4062f14c.jpg b/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/GlassFish-commits-1024x437-4062f14c.jpg new file mode 100644 index 000000000..17cacf8c5 Binary files /dev/null and b/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/GlassFish-commits-1024x437-4062f14c.jpg differ diff --git a/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/Screenshot-from-2024-09-06-16-08-30-1024-2625f222.png b/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/Screenshot-from-2024-09-06-16-08-30-1024-2625f222.png new file mode 100644 index 000000000..5d7c9fa30 Binary files /dev/null and b/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/Screenshot-from-2024-09-06-16-08-30-1024-2625f222.png differ diff --git a/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/index.md b/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/index.md index cca8a7041..15b469630 100644 --- a/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/index.md +++ b/content/posts/2024/11/26/glassfish-is-rolling-forward-whats-new/index.md @@ -6,7 +6,7 @@ description: "The Evolution Continues. GlassFish, which used to be a popular ap canonical: "https://omnifish.ee/2024/09/12/glassfish-is-rolling-forward-whats-new/" authors: - "ondro-mihalyi" -image: "GlassFish-commits-1024x437-1.png" +image: "GlassFish-commits-1024x437-1.jpg" categories: - "Cloud" - "Jakarta EE" @@ -35,7 +35,7 @@ For those dabbling in microservices, GlassFish now natively supports **MicroProf [Get started with GlassFish with this guide](https://omnifish.ee/developer-resources/) -![](https://omnifish.ee/wp-content/uploads/2024/09/Screenshot-from-2024-09-06-16-08-30-1024x393.png) +![](Screenshot-from-2024-09-06-16-08-30-1024-2625f222.png) **A Developer's Best Friend** @@ -69,7 +69,7 @@ Thanks to OmniFish, GlassFish isn't just an application server alone. Our contri * [Arquillian containers for GlassFish](https://omnifish.ee/developers/glassfish-server/arquillian-containers/) * [IDE plugins for GlassFish](https://omnifish.ee/developers/glassfish-server/ide-plugins-for-glassfish/) -![](https://omnifish.ee/wp-content/uploads/2024/09/GlassFish-commits-1024x437.png) 3 of the 4 top GlassFish contributors from OmniFish +![](GlassFish-commits-1024x437-4062f14c.jpg) 3 of the 4 top GlassFish contributors from OmniFish **Commercial support gets you covered** diff --git a/content/posts/2024/11/30/javafx-links-of-november-2024/index.md b/content/posts/2024/11/30/javafx-links-of-november-2024/index.md index ad08b0021..a0b6d6c61 100644 --- a/content/posts/2024/11/30/javafx-links-of-november-2024/index.md +++ b/content/posts/2024/11/30/javafx-links-of-november-2024/index.md @@ -6,7 +6,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of November 202 canonical: "https://webtechie.be/post/2024-11-29-javafx-links-of-november-2024/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2024/11/30/javafx-links-of-november-2024/jfxcentral.jpg b/content/posts/2024/11/30/javafx-links-of-november-2024/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2024/11/30/javafx-links-of-november-2024/jfxcentral.jpg differ diff --git a/content/posts/2024/11/30/javafx-links-of-november-2024/jfxcentral.png b/content/posts/2024/11/30/javafx-links-of-november-2024/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2024/11/30/javafx-links-of-november-2024/jfxcentral.png and /dev/null differ diff --git a/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/1466uy16dzgwwxoahnna-f2bf456a.png b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/1466uy16dzgwwxoahnna-f2bf456a.png new file mode 100644 index 000000000..31aec2f5c Binary files /dev/null and b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/1466uy16dzgwwxoahnna-f2bf456a.png differ diff --git a/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/28jrdvvty36tn97l0r6q-9465f79c.png b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/28jrdvvty36tn97l0r6q-9465f79c.png new file mode 100644 index 000000000..2c6071375 Binary files /dev/null and b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/28jrdvvty36tn97l0r6q-9465f79c.png differ diff --git a/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/alfl1l1zy3zxzs8pfjih-875417ba.png b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/alfl1l1zy3zxzs8pfjih-875417ba.png new file mode 100644 index 000000000..52ded4a30 Binary files /dev/null and b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/alfl1l1zy3zxzs8pfjih-875417ba.png differ diff --git a/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/h2lr6p4dj2t67lyqt37y-3cd9872b.png b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/h2lr6p4dj2t67lyqt37y-3cd9872b.png new file mode 100644 index 000000000..bc6fc6825 Binary files /dev/null and b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/h2lr6p4dj2t67lyqt37y-3cd9872b.png differ diff --git a/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/index.md b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/index.md index a61c55e00..55d9eaed8 100644 --- a/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/index.md +++ b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/index.md @@ -58,7 +58,7 @@ One of the hidden gems of the browser console is its support for log levels, whi While log and debug can be indistinguishable, these levels allow for a more organized and filtered debugging experience. Browsers enable filtering the output based on these levels, mirroring the capabilities of server-side logging systems and allowing you to focus on relevant messages. -![Log Levels](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jma0r3v5y0pfqbiipmdd.png) +![Log Levels](jma0r3v5y0pfqbiipmdd-3418d796.png) ## **Customizing Console Output with CSS** @@ -73,7 +73,7 @@ console.customLog("Dazzle") This approach is helpful when you need to make specific logs stand out or organize output visually. You can use multiple `%c` substitutions to apply various styles to different parts of a log message. -![CSS Styling](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h2lr6p4dj2t67lyqt37y.png) +![CSS Styling](h2lr6p4dj2t67lyqt37y-3cd9872b.png) ## **Stack Tracing with console.trace()** @@ -89,7 +89,7 @@ console.assert(x > 0, 'x must be greater than zero'); In the browser, a failed assertion appears as an error, similar to console.error. An added benefit is that assertions can be stripped from production builds, removing any performance impact. This makes assertions a great tool for enforcing design contracts during development without compromising production efficiency. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/py7ikkhsp14yr95g3ptp.png) +![Image description](py7ikkhsp14yr95g3ptp-d49764c6.png) ## **Printing Tables for Clearer Data Visualization** @@ -101,7 +101,7 @@ console.table(["Simple Array", "With a few elements", "in line"]) This method is especially handy when debugging arrays of objects, presenting a clear, tabular view of the data and making complex data structures much easier to understand. -![Tables](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n5ki2d0rsggehjtq2ans.png) +![Tables](n5ki2d0rsggehjtq2ans-6c392bf3.jpg) ## **Copying Objects to the Clipboard** @@ -111,7 +111,7 @@ Debugging often involves inspecting objects, and the `copy(object)` method allow The `console.dir()` method provides a more detailed view of objects, showing their properties as you'd see in a debugger. This is particularly helpful for inspecting DOM elements or exploring API responses. Meanwhile, `console.dirxml()` allows you to view objects as XML, which can be useful when debugging HTML structures. -![Console Dir](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pkdbguve69cnlocorjqm.png) +![Console Dir](pkdbguve69cnlocorjqm-f5c5d36e.jpg) ## **Counting Function Calls** @@ -125,7 +125,7 @@ function myFunction() { You can reset the counter using `console.countReset()`. This simple tool can help you catch performance issues or confirm the correct execution flow. -![Count Function Calls](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jehd0jyc638vmmw8e6sn.png) +![Count Function Calls](jehd0jyc638vmmw8e6sn-c6112032.png) ## **Organizing Logs with Groups** @@ -140,21 +140,21 @@ console.groupEnd(); Grouping makes it easier to navigate complex logs and keeps your console clean. -![Grouping](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1466uy16dzgwwxoahnna.png) +![Grouping](1466uy16dzgwwxoahnna-f2bf456a.png) ## **Chrome-Specific Debugging Features** **Monitoring Functions** : Chrome's `monitor()` method logs every call to a function, showing the arguments and enabling a method-tracing experience. -![Monitoring](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/28jrdvvty36tn97l0r6q.png) +![Monitoring](28jrdvvty36tn97l0r6q-9465f79c.png) **Monitoring Events** : Using `monitorEvents()`, you can log events on an element. This is useful for debugging UI interactions. For example, `monitorEvents(window, 'mouseout')` logs only `mouseout` events. -![Monitoring Events](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u6neqp6pwwrfntkb2o3q.png) +![Monitoring Events](u6neqp6pwwrfntkb2o3q-56179a9c.jpg) **Querying Object Instances** : `queryObjects(Constructor)` lists all objects created with a specific constructor, giving you insights into memory usage and object instantiation. -![Query Object Instance](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/alfl1l1zy3zxzs8pfjih.png) +![Query Object Instance](alfl1l1zy3zxzs8pfjih-875417ba.png) ## **Final Word** diff --git a/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/jehd0jyc638vmmw8e6sn-c6112032.png b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/jehd0jyc638vmmw8e6sn-c6112032.png new file mode 100644 index 000000000..d85fb6db4 Binary files /dev/null and b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/jehd0jyc638vmmw8e6sn-c6112032.png differ diff --git a/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/jma0r3v5y0pfqbiipmdd-3418d796.png b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/jma0r3v5y0pfqbiipmdd-3418d796.png new file mode 100644 index 000000000..14851a91d Binary files /dev/null and b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/jma0r3v5y0pfqbiipmdd-3418d796.png differ diff --git a/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/n5ki2d0rsggehjtq2ans-6c392bf3.jpg b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/n5ki2d0rsggehjtq2ans-6c392bf3.jpg new file mode 100644 index 000000000..c32859f0f Binary files /dev/null and b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/n5ki2d0rsggehjtq2ans-6c392bf3.jpg differ diff --git a/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/pkdbguve69cnlocorjqm-f5c5d36e.jpg b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/pkdbguve69cnlocorjqm-f5c5d36e.jpg new file mode 100644 index 000000000..94f62acbf Binary files /dev/null and b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/pkdbguve69cnlocorjqm-f5c5d36e.jpg differ diff --git a/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/py7ikkhsp14yr95g3ptp-d49764c6.png b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/py7ikkhsp14yr95g3ptp-d49764c6.png new file mode 100644 index 000000000..f47f3a2a2 Binary files /dev/null and b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/py7ikkhsp14yr95g3ptp-d49764c6.png differ diff --git a/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/u6neqp6pwwrfntkb2o3q-56179a9c.jpg b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/u6neqp6pwwrfntkb2o3q-56179a9c.jpg new file mode 100644 index 000000000..ee6c0a079 Binary files /dev/null and b/content/posts/2024/12/03/front-end-debugging-part-2-console-log-to-the-max/u6neqp6pwwrfntkb2o3q-56179a9c.jpg differ diff --git a/content/posts/2024/12/04/prevent-ldap-injection-in-java-with-springboot/index.md b/content/posts/2024/12/04/prevent-ldap-injection-in-java-with-springboot/index.md index cbf5663bf..6ab29bb5b 100644 --- a/content/posts/2024/12/04/prevent-ldap-injection-in-java-with-springboot/index.md +++ b/content/posts/2024/12/04/prevent-ldap-injection-in-java-with-springboot/index.md @@ -228,7 +228,7 @@ Entries in LDAP ### 🍃 Spring Boot part * **I created a Spring Boot** application using Spring Initializer, **including** dependencies for**Web, LDAP, and Thymeleaf** . - [![Spring Boot dependencies](https://uploads.strikinglycdn.com/files/6d011c45-5775-4276-9d55-af400cd5a7ef/ladp-3.png?t=1733143487&id=4207982 "Spring Boot dependencies")](https://uploads.strikinglycdn.com/files/6d011c45-5775-4276-9d55-af400cd5a7ef/ladp-3.png?t=1733143487&id=4207982 "Spring Boot dependencies") + [![Spring Boot dependencies](ladp-3-bd4812f5.png "Spring Boot dependencies")](ladp-3-bd4812f5.png "Spring Boot dependencies") This **lets me input the filter** and distinguished names (DN)**in the** Thymeleaf **form** . The form **then directs to a Spring Boot endpoint** , **which initiates the search** **in the** Open **LDAP** server. diff --git a/content/posts/2024/12/04/prevent-ldap-injection-in-java-with-springboot/ladp-3-bd4812f5.png b/content/posts/2024/12/04/prevent-ldap-injection-in-java-with-springboot/ladp-3-bd4812f5.png new file mode 100644 index 000000000..e5a040b7e Binary files /dev/null and b/content/posts/2024/12/04/prevent-ldap-injection-in-java-with-springboot/ladp-3-bd4812f5.png differ diff --git a/content/posts/2024/12/10/speed-up-your-spring-batch-with-native-image-and-graalvm/index.md b/content/posts/2024/12/10/speed-up-your-spring-batch-with-native-image-and-graalvm/index.md index cfdf9af30..a8b5402fa 100644 --- a/content/posts/2024/12/10/speed-up-your-spring-batch-with-native-image-and-graalvm/index.md +++ b/content/posts/2024/12/10/speed-up-your-spring-batch-with-native-image-and-graalvm/index.md @@ -5,7 +5,7 @@ lastmod: "2025-04-02T06:55:24+00:00" description: "Learn how to speed up your Spring Batch jobs using GraalVM Native Image! Discover how to compile batch apps into native executables and more!" authors: - "vincent-vauban" -image: "speedup-batch.png" +image: "speedup-batch.jpg" categories: - "Cloud" - "Java" diff --git a/content/posts/2024/12/10/speed-up-your-spring-batch-with-native-image-and-graalvm/speedup-batch.jpg b/content/posts/2024/12/10/speed-up-your-spring-batch-with-native-image-and-graalvm/speedup-batch.jpg new file mode 100644 index 000000000..001fbf336 Binary files /dev/null and b/content/posts/2024/12/10/speed-up-your-spring-batch-with-native-image-and-graalvm/speedup-batch.jpg differ diff --git a/content/posts/2024/12/10/speed-up-your-spring-batch-with-native-image-and-graalvm/speedup-batch.png b/content/posts/2024/12/10/speed-up-your-spring-batch-with-native-image-and-graalvm/speedup-batch.png deleted file mode 100644 index b44d72ff6..000000000 Binary files a/content/posts/2024/12/10/speed-up-your-spring-batch-with-native-image-and-graalvm/speedup-batch.png and /dev/null differ diff --git a/content/posts/2024/12/18/duplicate-finder-for-text-requirements/duplicates-map-diagram-dark-eba399a0.png b/content/posts/2024/12/18/duplicate-finder-for-text-requirements/duplicates-map-diagram-dark-eba399a0.png new file mode 100644 index 000000000..ce5e7598c Binary files /dev/null and b/content/posts/2024/12/18/duplicate-finder-for-text-requirements/duplicates-map-diagram-dark-eba399a0.png differ diff --git a/content/posts/2024/12/18/duplicate-finder-for-text-requirements/index.md b/content/posts/2024/12/18/duplicate-finder-for-text-requirements/index.md index 05b2c80c4..7c67014a9 100644 --- a/content/posts/2024/12/18/duplicate-finder-for-text-requirements/index.md +++ b/content/posts/2024/12/18/duplicate-finder-for-text-requirements/index.md @@ -108,7 +108,7 @@ Here's the meaning of the parameters that the interface accepts: * `fileExtensions` – file extension mask for filtering out irrelevant files When the function completes, it will return a [map](https://en.wikipedia.org/wiki/Associative_array), where the keys are `Chunk` objects, and the associated values are lists of their duplicates. -![Diagram illustrating the structure of the duplicate finder's output in the program](https://flounder.dev/img/duplicate-finder-tests/duplicates-map-diagram-dark.png) +![Diagram illustrating the structure of the duplicate finder's output in the program](duplicates-map-diagram-dark-eba399a0.png) Actually, the definition above is unnecessarily verbose. Introducing an interface just for a single function and a few callers is too much. Kotlin has an elegant way of handling this with first-class functions: diff --git a/content/posts/2024/12/30/javafx-links-of-december-2024/index.md b/content/posts/2024/12/30/javafx-links-of-december-2024/index.md index bbf76f6bb..a9b81b3f0 100644 --- a/content/posts/2024/12/30/javafx-links-of-december-2024/index.md +++ b/content/posts/2024/12/30/javafx-links-of-december-2024/index.md @@ -6,7 +6,7 @@ description: "Here is the last overview of the JavaFX LinksOfTheMonth for 2024. canonical: "https://webtechie.be/post/2024-12-20-javafx-links-of-december-2024/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2024/12/30/javafx-links-of-december-2024/jfxcentral.jpg b/content/posts/2024/12/30/javafx-links-of-december-2024/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2024/12/30/javafx-links-of-december-2024/jfxcentral.jpg differ diff --git a/content/posts/2024/12/30/javafx-links-of-december-2024/jfxcentral.png b/content/posts/2024/12/30/javafx-links-of-december-2024/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2024/12/30/javafx-links-of-december-2024/jfxcentral.png and /dev/null differ diff --git a/content/posts/2024/12/31/more-free-shells-for-your-java-ide/index.md b/content/posts/2024/12/31/more-free-shells-for-your-java-ide/index.md index 4c3221917..1a68bb4ac 100644 --- a/content/posts/2024/12/31/more-free-shells-for-your-java-ide/index.md +++ b/content/posts/2024/12/31/more-free-shells-for-your-java-ide/index.md @@ -137,7 +137,7 @@ Here is what you get as extra for the terminal shells (Command line, Powershell, * Shell in an external window always on top (Shift + F12) and translucent (Shift + Ctrl + F12 and Shift + Alt + Mouse wheel) * Plus all the [other features](https://www.antcommander.com/#features) of Ant Commander Pro -[![Applet Runner running Ant Commander Pro file manager](shell-ant-commander-pro-intellij-1024x576.png)](shell-ant-commander-pro-intellij.png) *Applet Runner running Ant Commander Pro file manager* +[![Applet Runner running Ant Commander Pro file manager](shell-ant-commander-pro-intellij-1024x576.jpg)](shell-ant-commander-pro-intellij.png) *Applet Runner running Ant Commander Pro file manager* ## Conclusion diff --git a/content/posts/2024/12/31/more-free-shells-for-your-java-ide/shell-ant-commander-pro-intellij-1024x576.jpg b/content/posts/2024/12/31/more-free-shells-for-your-java-ide/shell-ant-commander-pro-intellij-1024x576.jpg new file mode 100644 index 000000000..912cac5f3 Binary files /dev/null and b/content/posts/2024/12/31/more-free-shells-for-your-java-ide/shell-ant-commander-pro-intellij-1024x576.jpg differ diff --git a/content/posts/2024/12/31/more-free-shells-for-your-java-ide/shell-ant-commander-pro-intellij-1024x576.png b/content/posts/2024/12/31/more-free-shells-for-your-java-ide/shell-ant-commander-pro-intellij-1024x576.png deleted file mode 100644 index fabb0ed85..000000000 Binary files a/content/posts/2024/12/31/more-free-shells-for-your-java-ide/shell-ant-commander-pro-intellij-1024x576.png and /dev/null differ diff --git a/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/1-7cDKq5yh5RD0ygvb3mVwfQ-384353f7.webp b/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/1-7cDKq5yh5RD0ygvb3mVwfQ-384353f7.webp new file mode 100644 index 000000000..203f2769d Binary files /dev/null and b/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/1-7cDKq5yh5RD0ygvb3mVwfQ-384353f7.webp differ diff --git a/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/1-UioRG8-qID51i0rEOPVh-w-e4514700.webp b/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/1-UioRG8-qID51i0rEOPVh-w-e4514700.webp new file mode 100644 index 000000000..a16d4eb88 Binary files /dev/null and b/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/1-UioRG8-qID51i0rEOPVh-w-e4514700.webp differ diff --git a/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/1-VsdNn5KGd1A0rIfbczGy8Q-648478b9.gif b/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/1-VsdNn5KGd1A0rIfbczGy8Q-648478b9.gif new file mode 100644 index 000000000..f204cee4b Binary files /dev/null and b/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/1-VsdNn5KGd1A0rIfbczGy8Q-648478b9.gif differ diff --git a/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/1-YKz05kbmkzQdws-DUsvhdw-73bec35b.png b/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/1-YKz05kbmkzQdws-DUsvhdw-73bec35b.png new file mode 100644 index 000000000..6e76d23d9 Binary files /dev/null and b/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/1-YKz05kbmkzQdws-DUsvhdw-73bec35b.png differ diff --git a/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/1-tmaCfNHgzaAJNop4Aa2afA-bed82bc8.webp b/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/1-tmaCfNHgzaAJNop4Aa2afA-bed82bc8.webp new file mode 100644 index 000000000..e1d5ab231 Binary files /dev/null and b/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/1-tmaCfNHgzaAJNop4Aa2afA-bed82bc8.webp differ diff --git a/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/Redis_Video_RateLimiterImplementations_Part1_YoutubeThumbnail.jpg b/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/Redis_Video_RateLimiterImplementations_Part1_YoutubeThumbnail.jpg new file mode 100644 index 000000000..a4f868b5c Binary files /dev/null and b/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/Redis_Video_RateLimiterImplementations_Part1_YoutubeThumbnail.jpg differ diff --git a/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/Redis_Video_RateLimiterImplementations_Part1_YoutubeThumbnail.png b/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/Redis_Video_RateLimiterImplementations_Part1_YoutubeThumbnail.png deleted file mode 100644 index f7faa5ffd..000000000 Binary files a/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/Redis_Video_RateLimiterImplementations_Part1_YoutubeThumbnail.png and /dev/null differ diff --git a/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/index.md b/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/index.md index 21c8861e8..a106fdb43 100644 --- a/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/index.md +++ b/content/posts/2025/01/13/rate-limiting-with-redis-an-essential-guide/index.md @@ -6,7 +6,7 @@ description: "Discover the essentials of rate limiting with Redis. Learn about p canonical: "https://raphaeldelio.com/2024/12/23/rate-limiting-with-redis-an-essential-guide/" authors: - "raphael-delio" -image: "Redis_Video_RateLimiterImplementations_Part1_YoutubeThumbnail.png" +image: "Redis_Video_RateLimiterImplementations_Part1_YoutubeThumbnail.jpg" categories: - "Databases" - "nosql" @@ -18,7 +18,7 @@ related_posts: frozen: false --- -[This article is also available on YouTube!](https://www.youtube.com/watch?v=YV4ePyW3DO8) Rate limiting — it's something you've likely encountered, even if you haven't directly implemented one. For example, have you ever been greeted by a "429 Too Many Requests" error? That's a rate limiter in action, protecting a resource from overload. Or maybe you've used a service with explicit request quotas based on your payment tier — same concept, just more transparent. ![ChatGPT warning user that they have reached the limit of messages they can send in 24 hours.](https://cdn-images-1.medium.com/max/3412/1*YKz05kbmkzQdws-DUsvhdw.png) Rate limiting isn't just about setting limits; it serves a variety of purposes. Take Figma, for instance. Their rate limiter, built with Redis, saved them from a spam attack where bad actors sent massive document invitations to random email addresses. Without it, Figma could have faced skyrocketing email delivery costs and damaged reputation. Or look at Stripe: as their platform grew, they realized they couldn't just throw more infrastructure at the problem. They needed a smarter solution to prevent resource monopolization by misconfigured scripts or bad actors. These stories show just how versatile rate limiting is. It prevents abuse, ensures fair access, manages load, cuts costs, and even protects against downtime. But here's the kicker: the hard part isn't knowing *why* you need a rate limiter. The real challenge is building one that's both efficient and tailored to your needs. +[This article is also available on YouTube!](https://www.youtube.com/watch?v=YV4ePyW3DO8) Rate limiting — it's something you've likely encountered, even if you haven't directly implemented one. For example, have you ever been greeted by a "429 Too Many Requests" error? That's a rate limiter in action, protecting a resource from overload. Or maybe you've used a service with explicit request quotas based on your payment tier — same concept, just more transparent. ![ChatGPT warning user that they have reached the limit of messages they can send in 24 hours.](1-YKz05kbmkzQdws-DUsvhdw-73bec35b.png) Rate limiting isn't just about setting limits; it serves a variety of purposes. Take Figma, for instance. Their rate limiter, built with Redis, saved them from a spam attack where bad actors sent massive document invitations to random email addresses. Without it, Figma could have faced skyrocketing email delivery costs and damaged reputation. Or look at Stripe: as their platform grew, they realized they couldn't just throw more infrastructure at the problem. They needed a smarter solution to prevent resource monopolization by misconfigured scripts or bad actors. These stories show just how versatile rate limiting is. It prevents abuse, ensures fair access, manages load, cuts costs, and even protects against downtime. But here's the kicker: the hard part isn't knowing *why* you need a rate limiter. The real challenge is building one that's both efficient and tailored to your needs. ## **Why Redis for Rate Limiting?** @@ -30,19 +30,19 @@ Choosing the right rate-limiting algorithm can be challenging. Here's a breakdow ### **Leaky Bucket** -**How It Works** : Imagine a bucket with a small hole at the bottom. Requests (water) are added to the bucket and processed at a steady "drip" rate, preventing sudden floods. ![](https://cdn-images-1.medium.com/max/2160/1*UioRG8-qID51i0rEOPVh-w.gif) **Use Cases:** Ideal for smoothing traffic flow, such as in streaming services or payment processing, where a predictable output is critical. **Example:** A video streaming platform regulates API calls to its content delivery network, ensuring consistent playback quality. **Drawback:** Not suitable for handling sudden bursts, like flash sales or promotional campaigns. +**How It Works** : Imagine a bucket with a small hole at the bottom. Requests (water) are added to the bucket and processed at a steady "drip" rate, preventing sudden floods. ![](1-UioRG8-qID51i0rEOPVh-w-e4514700.webp) **Use Cases:** Ideal for smoothing traffic flow, such as in streaming services or payment processing, where a predictable output is critical. **Example:** A video streaming platform regulates API calls to its content delivery network, ensuring consistent playback quality. **Drawback:** Not suitable for handling sudden bursts, like flash sales or promotional campaigns. ### **Token Bucket** -**How It Works:** Tokens are generated at a fixed rate and stored in a bucket. Each request consumes a token, allowing for short bursts as long as tokens are available. ![](https://cdn-images-1.medium.com/max/2160/1*7cDKq5yh5RD0ygvb3mVwfQ.gif) **Use Cases:** Perfect for APIs that need to handle occasional traffic spikes while enforcing overall limits, such as login attempts or search queries. **Example:** An e-commerce site allows bursts of up to 20 requests per second during checkout but limits the overall rate to 100 requests per minute. **Drawback Example:** Requires periodic token replenishment, which can introduce minor overhead in distributed systems. +**How It Works:** Tokens are generated at a fixed rate and stored in a bucket. Each request consumes a token, allowing for short bursts as long as tokens are available. ![](1-7cDKq5yh5RD0ygvb3mVwfQ-384353f7.webp) **Use Cases:** Perfect for APIs that need to handle occasional traffic spikes while enforcing overall limits, such as login attempts or search queries. **Example:** An e-commerce site allows bursts of up to 20 requests per second during checkout but limits the overall rate to 100 requests per minute. **Drawback Example:** Requires periodic token replenishment, which can introduce minor overhead in distributed systems. ### Fixed Window Counter -**How It Works:** Tracks the number of requests in fixed intervals (e.g., 1 minute). Once the limit is reached, all subsequent requests in that window are denied. ![](https://cdn-images-1.medium.com/max/2160/1*VsdNn5KGd1A0rIfbczGy8Q.gif) **Use Cases:** Simple APIs with predictable traffic and low precision needs, like throttling a hobbyist developer's free-tier usage. **Example:** A public weather API allows 100 requests per user per minute, with any extra requests returning a "429 Too Many Requests" response. **Drawback:** Users can game the system by stacking requests at the boundary of two time windows (e.g., 100 at 59 seconds and 100 at 1 second of the next window). +**How It Works:** Tracks the number of requests in fixed intervals (e.g., 1 minute). Once the limit is reached, all subsequent requests in that window are denied. ![](1-VsdNn5KGd1A0rIfbczGy8Q-648478b9.gif) **Use Cases:** Simple APIs with predictable traffic and low precision needs, like throttling a hobbyist developer's free-tier usage. **Example:** A public weather API allows 100 requests per user per minute, with any extra requests returning a "429 Too Many Requests" response. **Drawback:** Users can game the system by stacking requests at the boundary of two time windows (e.g., 100 at 59 seconds and 100 at 1 second of the next window). ### **Sliding Window Log** -**How It Works:** Maintains a log of timestamps for each request and calculates limits based on a rolling time window. ![](https://cdn-images-1.medium.com/max/2160/1*tmaCfNHgzaAJNop4Aa2afA.gif) **Use Cases:** Critical systems requiring high accuracy, such as financial transaction APIs or fraud detection mechanisms. **Example:** A banking API limits withdrawals to 10 per hour, with each new request evaluated against the timestamps of the last 10 requests. **Drawback:** High memory usage and computational cost when scaling to millions of users or frequent requests. +**How It Works:** Maintains a log of timestamps for each request and calculates limits based on a rolling time window. ![](1-tmaCfNHgzaAJNop4Aa2afA-bed82bc8.webp) **Use Cases:** Critical systems requiring high accuracy, such as financial transaction APIs or fraud detection mechanisms. **Example:** A banking API limits withdrawals to 10 per hour, with each new request evaluated against the timestamps of the last 10 requests. **Drawback:** High memory usage and computational cost when scaling to millions of users or frequent requests. ### **Sliding Window Counter** diff --git a/content/posts/2025/01/16/reflections-on-2024-a-remarkable-year-for-omnifish-glassfish-piranha-and-jakarta-ee/Runnable-GlassFish-Embedded-1-1024x399-1.jpg b/content/posts/2025/01/16/reflections-on-2024-a-remarkable-year-for-omnifish-glassfish-piranha-and-jakarta-ee/Runnable-GlassFish-Embedded-1-1024x399-1.jpg new file mode 100644 index 000000000..d9872ca80 Binary files /dev/null and b/content/posts/2025/01/16/reflections-on-2024-a-remarkable-year-for-omnifish-glassfish-piranha-and-jakarta-ee/Runnable-GlassFish-Embedded-1-1024x399-1.jpg differ diff --git a/content/posts/2025/01/16/reflections-on-2024-a-remarkable-year-for-omnifish-glassfish-piranha-and-jakarta-ee/Runnable-GlassFish-Embedded-1-1024x399-1.png b/content/posts/2025/01/16/reflections-on-2024-a-remarkable-year-for-omnifish-glassfish-piranha-and-jakarta-ee/Runnable-GlassFish-Embedded-1-1024x399-1.png deleted file mode 100644 index 10426ed08..000000000 Binary files a/content/posts/2025/01/16/reflections-on-2024-a-remarkable-year-for-omnifish-glassfish-piranha-and-jakarta-ee/Runnable-GlassFish-Embedded-1-1024x399-1.png and /dev/null differ diff --git a/content/posts/2025/01/16/reflections-on-2024-a-remarkable-year-for-omnifish-glassfish-piranha-and-jakarta-ee/index.md b/content/posts/2025/01/16/reflections-on-2024-a-remarkable-year-for-omnifish-glassfish-piranha-and-jakarta-ee/index.md index a6b081a02..9e3685d87 100644 --- a/content/posts/2025/01/16/reflections-on-2024-a-remarkable-year-for-omnifish-glassfish-piranha-and-jakarta-ee/index.md +++ b/content/posts/2025/01/16/reflections-on-2024-a-remarkable-year-for-omnifish-glassfish-piranha-and-jakarta-ee/index.md @@ -51,7 +51,7 @@ As the most active contributor to the GlassFish project, we've continued to lead {{< img src="GlassFish-Admin-Command-Logger.png" class="size-full is-resized" width="874" height="275" style="width:836px;height:auto" >}} -![](Runnable-GlassFish-Embedded-1-1024x399-1.png) +![](Runnable-GlassFish-Embedded-1-1024x399-1.jpg) * **Progress on GlassFish 8:** * Released eight milestones, closely tracking Jakarta EE 11 developments. diff --git a/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/Figure_1-2-2000x1500-3124717d.png b/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/Figure_1-2-2000x1500-3124717d.png new file mode 100644 index 000000000..3de29e241 Binary files /dev/null and b/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/Figure_1-2-2000x1500-3124717d.png differ diff --git a/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/Figure_1-621d6cb9.png b/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/Figure_1-621d6cb9.png new file mode 100644 index 000000000..53d2b1b79 Binary files /dev/null and b/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/Figure_1-621d6cb9.png differ diff --git a/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/IMG_3764-2-2000x2000-8b34ade4.jpeg b/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/IMG_3764-2-2000x2000-8b34ade4.jpeg new file mode 100644 index 000000000..b2d6ffdf2 Binary files /dev/null and b/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/IMG_3764-2-2000x2000-8b34ade4.jpeg differ diff --git a/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/image-91b0acc7.jpg b/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/image-91b0acc7.jpg new file mode 100644 index 000000000..8e378bcd6 Binary files /dev/null and b/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/image-91b0acc7.jpg differ diff --git a/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/index.md b/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/index.md index ec8423956..817f7a3bf 100644 --- a/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/index.md +++ b/content/posts/2025/01/18/the-slow-death-of-the-onjcmd-debugger-feature/index.md @@ -5,7 +5,7 @@ lastmod: "2025-01-20T08:14:47+00:00" description: "Learn about the rise and fall of the onjcmd Java debugger feature, from its inception to its eventual removal." authors: - "johannes-bechberger" -image: "https://mostlynerdless.de/wp-content/uploads/2024/02/Figure_1-2-2000x1500.png" +image: "Figure_1-2-2000x1500-3124717d.png" categories: - "Debugging" - "Java" @@ -28,7 +28,7 @@ To quote my own article: > A similar feature [long existed](https://mail.openjdk.org/pipermail/serviceability-dev/2019-May/028227.html) [in the SAPJVM](https://help.sap.com/docs/btp/sap-business-technology-platform/debug-application-running-on-sap-jvm). In 2019 [Christoph Langer](https://www.linkedin.com/in/christoph-langer-764280208) from SAP decided to [add it to the OpenJDK](https://bugs.openjdk.org/browse/JDK-8223456), where it was implemented in JDK 12 and has been there ever since. The alternative to using this feature is to start the debugging session at the beginning and only connect to the JDWP agent when you want to start debugging. But this was, for a time, significantly slower than using the onjcmd feature ([source](https://mostlynerdless.de/blog/2024/02/09/is-jdwps-onjcmd-feature-worth-using/)): -![This image has an empty alt attribute; its file name is Figure_1-2-2000x1500.png](https://mostlynerdless.de/wp-content/uploads/2024/02/Figure_1-2-2000x1500.png) +![This image has an empty alt attribute; its file name is Figure_1-2-2000x1500.png](Figure_1-2-2000x1500-3124717d.png) After the feature had been merged, it was decided that it needed a [CSR](https://wiki.openjdk.java.net/display/csr/CSR+FAQs) because it was user-facing. But the feature wasn't it without its opponents, and the CSR was only accepted because the feature had already been merged: > After consultation with others including [Alan Bateman](https://bugs.openjdk.org/secure/ViewProfile.jspa?name=alanb) and [Mark Reinhold](https://bugs.openjdk.org/secure/ViewProfile.jspa?name=mr), I've concluded there is lack of technical consensus on this appropriateness of the feature in its current state to the platform. @@ -64,7 +64,7 @@ This is probably one of the major reasons nobody wrote about it: nobody outside So this feature was a hidden gem for a while, but as discussed in my article [Is JDWP's onjcmd feature worth using?](https://mostlynerdless.de/blog/2024/02/09/is-jdwps-onjcmd-feature-worth-using/), this feature is not worth using anymore: > Between JDK 11.0.3 and JDK 21, there have been improvements to the OpenJDK, some of which drastically improved the performance of the JVM in debugging mode. Most notable is the fix for [JDK-8227269](https://bugs.openjdk.org/browse/JDK-8227269) by Roman Kennke. \[...\] -> ![This image has an empty alt attribute; its file name is Figure_1.png](https://mostlynerdless.de/wp-content/uploads/2024/02/Figure_1.png) +> ![This image has an empty alt attribute; its file name is Figure_1.png](Figure_1-621d6cb9.png) > > This clearly shows the significant impact of the change. 11.0.3 came out on Apr 18, 2019, and 11.0.9 on Jul 15, 2020, so the onjcmd improved on-demand debugging for almost a year. @@ -78,7 +78,7 @@ So, the feature has been hidden and has offered no benefits since mid-2020. It's > > Remove the onjcmd option from the JDWP agent and eliminate the corresponding VM.start_java_debugging command in the JVM. This will clean up the agent code and remove obsolete functionality that is no longer needed or used. For such CSRs, one also needs to state the compatibility risks. As explained before, there are possibly none outside of SAP. Together with my related [PR](https://github.com/openjdk/jdk/pull/21387), this will remove the feature from the OpenJDK, and JDK 24 will most probably be the first JDK since JDK 12 without the onjcmd debugger feature. RIP. -![This image has an empty alt attribute; its file name is image.png](https://mostlynerdless.de/wp-content/uploads/2024/10/image.png) +![This image has an empty alt attribute; its file name is image.png](image-91b0acc7.jpg) ## Conclusion @@ -89,4 +89,4 @@ But what do you think? Do you have a use for onjcmd and will miss it? Whatever y *This article is part of my work in the [SapMachine](https://sapmachine.io/) team at [SAP](https://sap.com/), making profiling and debugging easier for everyone. Thank you to Christopher Langer and Cris Plummer for the help with the CSR, and the PR.* *The article first appeared in October 2024 on my [personal blog](https://mostlynerdless.de).* P.S: Stuart Marks, aka Dr. Deprecator, likes the removal of unused features. I managed to meet him at Devoxx Belgium this week: -![This image has an empty alt attribute; its file name is IMG_3764-2-2000x2000.jpeg](https://mostlynerdless.de/wp-content/uploads/2024/10/IMG_3764-2-2000x2000.jpeg) +![This image has an empty alt attribute; its file name is IMG_3764-2-2000x2000.jpeg](IMG_3764-2-2000x2000-8b34ade4.jpeg) diff --git a/content/posts/2025/01/20/fixed-window-counter-rate-limiter-redis-java/1-VsdNn5KGd1A0rIfbczGy8Q-648478b9.gif b/content/posts/2025/01/20/fixed-window-counter-rate-limiter-redis-java/1-VsdNn5KGd1A0rIfbczGy8Q-648478b9.gif new file mode 100644 index 000000000..f204cee4b Binary files /dev/null and b/content/posts/2025/01/20/fixed-window-counter-rate-limiter-redis-java/1-VsdNn5KGd1A0rIfbczGy8Q-648478b9.gif differ diff --git a/content/posts/2025/01/20/fixed-window-counter-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part2_YoutubeThumbnail.jpg b/content/posts/2025/01/20/fixed-window-counter-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part2_YoutubeThumbnail.jpg new file mode 100644 index 000000000..4c3003bb3 Binary files /dev/null and b/content/posts/2025/01/20/fixed-window-counter-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part2_YoutubeThumbnail.jpg differ diff --git a/content/posts/2025/01/20/fixed-window-counter-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part2_YoutubeThumbnail.png b/content/posts/2025/01/20/fixed-window-counter-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part2_YoutubeThumbnail.png deleted file mode 100644 index 0c2ca09e7..000000000 Binary files a/content/posts/2025/01/20/fixed-window-counter-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part2_YoutubeThumbnail.png and /dev/null differ diff --git a/content/posts/2025/01/20/fixed-window-counter-rate-limiter-redis-java/index.md b/content/posts/2025/01/20/fixed-window-counter-rate-limiter-redis-java/index.md index af711a206..800df730d 100644 --- a/content/posts/2025/01/20/fixed-window-counter-rate-limiter-redis-java/index.md +++ b/content/posts/2025/01/20/fixed-window-counter-rate-limiter-redis-java/index.md @@ -6,7 +6,7 @@ description: "Learn how to implement a Fixed Window Rate Limiter with Redis and canonical: "https://raphaeldelio.com/2024/12/30/fixed-window-counter-rate-limiter-redis-java/" authors: - "raphael-delio" -image: "Redis_Video_RateLimiterImplementations_Part2_YoutubeThumbnail.png" +image: "Redis_Video_RateLimiterImplementations_Part2_YoutubeThumbnail.jpg" categories: - "Databases" - "Java" @@ -24,7 +24,7 @@ The **Fixed Window Counter** is the simplest and most straightforward rate-limit ## **How It Works** -![](https://cdn-images-1.medium.com/max/2160/1*VsdNn5KGd1A0rIfbczGy8Q.gif) +![](1-VsdNn5KGd1A0rIfbczGy8Q-648478b9.gif) ### **1. Define a Window Interval** diff --git a/content/posts/2025/01/22/challenge-yourself-with-application-observability-code-challenges/index.md b/content/posts/2025/01/22/challenge-yourself-with-application-observability-code-challenges/index.md index 59fd1b26f..6269ad74e 100644 --- a/content/posts/2025/01/22/challenge-yourself-with-application-observability-code-challenges/index.md +++ b/content/posts/2025/01/22/challenge-yourself-with-application-observability-code-challenges/index.md @@ -124,7 +124,7 @@ The setup looks like this: ![Setup](full_setup.png) After running one of the scripts you can get more details in a Grafana dashboard like this: -![K6 dashboard](k6_highload_dashboard.png) +![K6 dashboard](k6_highload_dashboard.jpg) In this screenshot you can see that the application is **reaching a limit for some reason** , more load does not give more requests per second and **with more load the response times increase** a lot. diff --git a/content/posts/2025/01/22/challenge-yourself-with-application-observability-code-challenges/k6_highload_dashboard.jpg b/content/posts/2025/01/22/challenge-yourself-with-application-observability-code-challenges/k6_highload_dashboard.jpg new file mode 100644 index 000000000..fde42fce2 Binary files /dev/null and b/content/posts/2025/01/22/challenge-yourself-with-application-observability-code-challenges/k6_highload_dashboard.jpg differ diff --git a/content/posts/2025/01/22/challenge-yourself-with-application-observability-code-challenges/k6_highload_dashboard.png b/content/posts/2025/01/22/challenge-yourself-with-application-observability-code-challenges/k6_highload_dashboard.png deleted file mode 100644 index c8be28f56..000000000 Binary files a/content/posts/2025/01/22/challenge-yourself-with-application-observability-code-challenges/k6_highload_dashboard.png and /dev/null differ diff --git a/content/posts/2025/01/24/receiving-mails-in-java-with-imap-or-pop3/index.md b/content/posts/2025/01/24/receiving-mails-in-java-with-imap-or-pop3/index.md index 709536000..57bca1fc5 100644 --- a/content/posts/2025/01/24/receiving-mails-in-java-with-imap-or-pop3/index.md +++ b/content/posts/2025/01/24/receiving-mails-in-java-with-imap-or-pop3/index.md @@ -6,7 +6,7 @@ description: "There is a lot of documentation for sending mails, but gathering i canonical: "https://jensknipper.de/blog/receiving-emails-in-java/" authors: - "jens-knipper" -image: "mailusage.png" +image: "mailusage.jpg" categories: - "Java" related_posts: diff --git a/content/posts/2025/01/24/receiving-mails-in-java-with-imap-or-pop3/mailusage.jpg b/content/posts/2025/01/24/receiving-mails-in-java-with-imap-or-pop3/mailusage.jpg new file mode 100644 index 000000000..697f0e74e Binary files /dev/null and b/content/posts/2025/01/24/receiving-mails-in-java-with-imap-or-pop3/mailusage.jpg differ diff --git a/content/posts/2025/01/24/receiving-mails-in-java-with-imap-or-pop3/mailusage.png b/content/posts/2025/01/24/receiving-mails-in-java-with-imap-or-pop3/mailusage.png deleted file mode 100644 index 51d91a27c..000000000 Binary files a/content/posts/2025/01/24/receiving-mails-in-java-with-imap-or-pop3/mailusage.png and /dev/null differ diff --git a/content/posts/2025/01/28/token-bucket-rate-limiter-redis-java/1-7cDKq5yh5RD0ygvb3mVwfQ-384353f7.webp b/content/posts/2025/01/28/token-bucket-rate-limiter-redis-java/1-7cDKq5yh5RD0ygvb3mVwfQ-384353f7.webp new file mode 100644 index 000000000..203f2769d Binary files /dev/null and b/content/posts/2025/01/28/token-bucket-rate-limiter-redis-java/1-7cDKq5yh5RD0ygvb3mVwfQ-384353f7.webp differ diff --git a/content/posts/2025/01/28/token-bucket-rate-limiter-redis-java/index.md b/content/posts/2025/01/28/token-bucket-rate-limiter-redis-java/index.md index 5a4420807..b2c7d5780 100644 --- a/content/posts/2025/01/28/token-bucket-rate-limiter-redis-java/index.md +++ b/content/posts/2025/01/28/token-bucket-rate-limiter-redis-java/index.md @@ -32,7 +32,7 @@ The bucket has a maximum capacity, so it can handle bursts of traffic as long as ## How It Works -![](https://cdn-images-1.medium.com/max/2160/1*7cDKq5yh5RD0ygvb3mVwfQ.gif) +![](1-7cDKq5yh5RD0ygvb3mVwfQ-384353f7.webp) ### 1. **Define a Token Refill Rate** diff --git a/content/posts/2025/01/29/project-loom-structured-concurrency-java/index.md b/content/posts/2025/01/29/project-loom-structured-concurrency-java/index.md index 2a7e63be0..8614b3ade 100644 --- a/content/posts/2025/01/29/project-loom-structured-concurrency-java/index.md +++ b/content/posts/2025/01/29/project-loom-structured-concurrency-java/index.md @@ -5,7 +5,7 @@ lastmod: "2025-01-29T12:12:40+00:00" description: "Learn about structured concurrency, a paradigm that simplifies concurrent programming by bringing order and predictability to task management." authors: - "mahendra1413" -image: "sc.png" +image: "sc.jpg" categories: - "Java" - "Java Core" diff --git a/content/posts/2025/01/29/project-loom-structured-concurrency-java/sc.jpg b/content/posts/2025/01/29/project-loom-structured-concurrency-java/sc.jpg new file mode 100644 index 000000000..93faf4ff4 Binary files /dev/null and b/content/posts/2025/01/29/project-loom-structured-concurrency-java/sc.jpg differ diff --git a/content/posts/2025/01/29/project-loom-structured-concurrency-java/sc.png b/content/posts/2025/01/29/project-loom-structured-concurrency-java/sc.png deleted file mode 100644 index 70795078e..000000000 Binary files a/content/posts/2025/01/29/project-loom-structured-concurrency-java/sc.png and /dev/null differ diff --git a/content/posts/2025/01/30/a-solution-to-the-problem-of-cluster-wide-crds/idea.jpg b/content/posts/2025/01/30/a-solution-to-the-problem-of-cluster-wide-crds/idea.jpg new file mode 100644 index 000000000..a88f4d9b6 Binary files /dev/null and b/content/posts/2025/01/30/a-solution-to-the-problem-of-cluster-wide-crds/idea.jpg differ diff --git a/content/posts/2025/01/30/a-solution-to-the-problem-of-cluster-wide-crds/idea.png b/content/posts/2025/01/30/a-solution-to-the-problem-of-cluster-wide-crds/idea.png deleted file mode 100644 index 9269e2d6b..000000000 Binary files a/content/posts/2025/01/30/a-solution-to-the-problem-of-cluster-wide-crds/idea.png and /dev/null differ diff --git a/content/posts/2025/01/30/a-solution-to-the-problem-of-cluster-wide-crds/index.md b/content/posts/2025/01/30/a-solution-to-the-problem-of-cluster-wide-crds/index.md index 4a510bca5..174556661 100644 --- a/content/posts/2025/01/30/a-solution-to-the-problem-of-cluster-wide-crds/index.md +++ b/content/posts/2025/01/30/a-solution-to-the-problem-of-cluster-wide-crds/index.md @@ -6,7 +6,7 @@ description: "The problem of some Kubernetes objects: they are cluster-wide and canonical: "https://www.loft.sh/blog/solution-clusterwide-crds" authors: - "nicolas-frankel" -image: "idea.png" +image: "idea.jpg" categories: - "Cloud" - "Use Cases" diff --git a/content/posts/2025/01/30/my-first-steps-with-playwright/index.md b/content/posts/2025/01/30/my-first-steps-with-playwright/index.md index ae0522cf1..ce2e01799 100644 --- a/content/posts/2025/01/30/my-first-steps-with-playwright/index.md +++ b/content/posts/2025/01/30/my-first-steps-with-playwright/index.md @@ -43,7 +43,7 @@ I like to approach development incrementally. Here's an excerpt of the API: -![Extract from the API model](playwright_api-1024x530.png) +![Extract from the API model](playwright_api-1024x530.jpg) It translates into the following code: diff --git a/content/posts/2025/01/30/my-first-steps-with-playwright/playwright_api-1024x530.jpg b/content/posts/2025/01/30/my-first-steps-with-playwright/playwright_api-1024x530.jpg new file mode 100644 index 000000000..266b13648 Binary files /dev/null and b/content/posts/2025/01/30/my-first-steps-with-playwright/playwright_api-1024x530.jpg differ diff --git a/content/posts/2025/01/30/my-first-steps-with-playwright/playwright_api-1024x530.png b/content/posts/2025/01/30/my-first-steps-with-playwright/playwright_api-1024x530.png deleted file mode 100644 index a81336d52..000000000 Binary files a/content/posts/2025/01/30/my-first-steps-with-playwright/playwright_api-1024x530.png and /dev/null differ diff --git a/content/posts/2025/02/01/javafx-links-of-january-2025/index.md b/content/posts/2025/02/01/javafx-links-of-january-2025/index.md index 0a43cbc2b..051bf227c 100644 --- a/content/posts/2025/02/01/javafx-links-of-january-2025/index.md +++ b/content/posts/2025/02/01/javafx-links-of-january-2025/index.md @@ -6,7 +6,7 @@ description: "Here is the first overview of the JavaFX LinksOfTheMonth for 2025. canonical: "https://webtechie.be/post/2025-01-31-javafx-links-of-january-2025/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2025/02/01/javafx-links-of-january-2025/jfxcentral.jpg b/content/posts/2025/02/01/javafx-links-of-january-2025/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2025/02/01/javafx-links-of-january-2025/jfxcentral.jpg differ diff --git a/content/posts/2025/02/01/javafx-links-of-january-2025/jfxcentral.png b/content/posts/2025/02/01/javafx-links-of-january-2025/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2025/02/01/javafx-links-of-january-2025/jfxcentral.png and /dev/null differ diff --git a/content/posts/2025/02/03/join-the-celebration-of-30-years-of-java/duke30-1024x247.jpg b/content/posts/2025/02/03/join-the-celebration-of-30-years-of-java/duke30-1024x247.jpg new file mode 100644 index 000000000..7e232072c Binary files /dev/null and b/content/posts/2025/02/03/join-the-celebration-of-30-years-of-java/duke30-1024x247.jpg differ diff --git a/content/posts/2025/02/03/join-the-celebration-of-30-years-of-java/duke30-1024x247.png b/content/posts/2025/02/03/join-the-celebration-of-30-years-of-java/duke30-1024x247.png deleted file mode 100644 index ef88c89fc..000000000 Binary files a/content/posts/2025/02/03/join-the-celebration-of-30-years-of-java/duke30-1024x247.png and /dev/null differ diff --git a/content/posts/2025/02/03/join-the-celebration-of-30-years-of-java/index.md b/content/posts/2025/02/03/join-the-celebration-of-30-years-of-java/index.md index 8d2856e22..e4772ac06 100644 --- a/content/posts/2025/02/03/join-the-celebration-of-30-years-of-java/index.md +++ b/content/posts/2025/02/03/join-the-celebration-of-30-years-of-java/index.md @@ -29,4 +29,4 @@ Recordings for the event will be done during the upcoming Devnexus. [Register for this unique and free celebration here!](https://www.azul.com/duke-turns-30-celebrating-java/#register) Also... you can hold a watch party with your JUG, organization, or group of friends, and get free pizza, [sign up for that here](https://docs.google.com/forms/d/1NOQyRDSyEaGeOnERzbpu8lXLAPZqmP2v0GZp-TTHIR0). -[![](duke30-1024x247.png)](https://www.azul.com/duke-turns-30-celebrating-java) +[![](duke30-1024x247.jpg)](https://www.azul.com/duke-turns-30-celebrating-java) diff --git a/content/posts/2025/02/04/sliding-window-log-rate-limiter-redis-java/1-tmaCfNHgzaAJNop4Aa2afA-bed82bc8.webp b/content/posts/2025/02/04/sliding-window-log-rate-limiter-redis-java/1-tmaCfNHgzaAJNop4Aa2afA-bed82bc8.webp new file mode 100644 index 000000000..e1d5ab231 Binary files /dev/null and b/content/posts/2025/02/04/sliding-window-log-rate-limiter-redis-java/1-tmaCfNHgzaAJNop4Aa2afA-bed82bc8.webp differ diff --git a/content/posts/2025/02/04/sliding-window-log-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part4_YoutubeThumbnail.jpg b/content/posts/2025/02/04/sliding-window-log-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part4_YoutubeThumbnail.jpg new file mode 100644 index 000000000..4459a760e Binary files /dev/null and b/content/posts/2025/02/04/sliding-window-log-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part4_YoutubeThumbnail.jpg differ diff --git a/content/posts/2025/02/04/sliding-window-log-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part4_YoutubeThumbnail.png b/content/posts/2025/02/04/sliding-window-log-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part4_YoutubeThumbnail.png deleted file mode 100644 index 076d06413..000000000 Binary files a/content/posts/2025/02/04/sliding-window-log-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part4_YoutubeThumbnail.png and /dev/null differ diff --git a/content/posts/2025/02/04/sliding-window-log-rate-limiter-redis-java/index.md b/content/posts/2025/02/04/sliding-window-log-rate-limiter-redis-java/index.md index faf40f9a5..f238028d9 100644 --- a/content/posts/2025/02/04/sliding-window-log-rate-limiter-redis-java/index.md +++ b/content/posts/2025/02/04/sliding-window-log-rate-limiter-redis-java/index.md @@ -6,7 +6,7 @@ description: "Build a sliding window log rate limiter with Redis and Java. Track canonical: "https://raphaeldelio.com/2025/01/22/sliding-window-log-rate-limiter-redis-java/" authors: - "raphael-delio" -image: "Redis_Video_RateLimiterImplementations_Part4_YoutubeThumbnail.png" +image: "Redis_Video_RateLimiterImplementations_Part4_YoutubeThumbnail.jpg" categories: - "Java" - "Java Beginner" @@ -29,7 +29,7 @@ By checking how many requests were made within that time frame, it ensures limit ## How It Works -![](https://cdn-images-1.medium.com/max/2160/1*tmaCfNHgzaAJNop4Aa2afA.gif) +![](1-tmaCfNHgzaAJNop4Aa2afA-bed82bc8.webp) ### 1. **Define a Time Window** diff --git a/content/posts/2025/02/17/a-glance-into-jfr-class-and-method-tagging/index.md b/content/posts/2025/02/17/a-glance-into-jfr-class-and-method-tagging/index.md index ffdd5000b..c38c38ded 100644 --- a/content/posts/2025/02/17/a-glance-into-jfr-class-and-method-tagging/index.md +++ b/content/posts/2025/02/17/a-glance-into-jfr-class-and-method-tagging/index.md @@ -44,7 +44,7 @@ In a world without any concurrency, the tag could just be a single bit, telling ## Tagging We can visualize the whole life cycle of a tag for a given entity: -![](https://mostlynerdless.de/wp-content/uploads/2025/02/tag-1-2000x1086.png) +![](tag-1-2000x1086-48e50069.jpg) In this example, the entity, a class, is brought into JFR by the method sampler ([link](https://github.com/openjdk/jdk/blob/5f5ed961db8462b0e01ca83194722d4456ba2372/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTrace.cpp#L262)) while walking another thread's stack. This causes the class to be tagged and enqueued in the internal entity queue (and is therefore known to the JFR writer) if it hasn't been tagged before ([source](https://github.com/openjdk/jdk/blob/5f5ed961db8462b0e01ca83194722d4456ba2372/src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceIdLoadBarrier.inline.hpp#L73)): diff --git a/content/posts/2025/02/17/a-glance-into-jfr-class-and-method-tagging/tag-1-2000x1086-48e50069.jpg b/content/posts/2025/02/17/a-glance-into-jfr-class-and-method-tagging/tag-1-2000x1086-48e50069.jpg new file mode 100644 index 000000000..0e553ab24 Binary files /dev/null and b/content/posts/2025/02/17/a-glance-into-jfr-class-and-method-tagging/tag-1-2000x1086-48e50069.jpg differ diff --git a/content/posts/2025/02/17/webinar-find-undead-code-in-your-java-environments/InfoWorld-TOTY-IC-2024-094c654f.png b/content/posts/2025/02/17/webinar-find-undead-code-in-your-java-environments/InfoWorld-TOTY-IC-2024-094c654f.png new file mode 100644 index 000000000..b10f549fe Binary files /dev/null and b/content/posts/2025/02/17/webinar-find-undead-code-in-your-java-environments/InfoWorld-TOTY-IC-2024-094c654f.png differ diff --git a/content/posts/2025/02/17/webinar-find-undead-code-in-your-java-environments/index.md b/content/posts/2025/02/17/webinar-find-undead-code-in-your-java-environments/index.md index 13cf2450b..3c0a0d684 100644 --- a/content/posts/2025/02/17/webinar-find-undead-code-in-your-java-environments/index.md +++ b/content/posts/2025/02/17/webinar-find-undead-code-in-your-java-environments/index.md @@ -54,7 +54,7 @@ In this webinar, you will learn how to: [Azul Code Inventory](https://www.azul.com/products/components/code-inventory/)®, a service of [Azul Intelligence Cloud](https://www.azul.com/products/intelligence-cloud), is the only solution that precisely catalogs what code runs in production across all of an enterprise's Java workloads. It slashes the time and burden of maintaining and testing unused code, significantly improving developer productivity and saving money. Code Inventory collects and aggregates detailed information from the Java Virtual Machine (JVM) of what code actually runs in production over time. It provides highly accurate, strong signals to confidently identify and prioritize unused code for removal. It helps reduce clutter so teams can work only on active code, lowering maintenance effort and increasing development velocity. In December, Azul Intelligence Cloud won InfoWorld's Technology of the Year Award for analytics solutions. InfoWorld judges said, in part, "Azul Intelligence Cloud is … like a smart assistant that watches how your Java programs work and suggests ways to improve them. It's a new and exciting way to optimize Java programs, using real-time data to make smart decisions." -![LOGO: InfoWorld Technology of the Year 2024 Award - Azul Intelligence Cloud](https://www.azul.com/wp-content/uploads/InfoWorld-TOTY-IC-2024.png) +![LOGO: InfoWorld Technology of the Year 2024 Award - Azul Intelligence Cloud](InfoWorld-TOTY-IC-2024-094c654f.png) [Click here to watch the on-demand webinar!](https://www.azul.com/webinar/your-undead-code-is-a-time-vampire/) diff --git a/content/posts/2025/02/25/sliding-window-counter-rate-limiter-redis-java/1-XLeoFFYwU1uzvLuMFu-tAw-8ccca08f.gif b/content/posts/2025/02/25/sliding-window-counter-rate-limiter-redis-java/1-XLeoFFYwU1uzvLuMFu-tAw-8ccca08f.gif new file mode 100644 index 000000000..7ff45e7cf Binary files /dev/null and b/content/posts/2025/02/25/sliding-window-counter-rate-limiter-redis-java/1-XLeoFFYwU1uzvLuMFu-tAw-8ccca08f.gif differ diff --git a/content/posts/2025/02/25/sliding-window-counter-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part5_YoutubeThumbnail.jpg b/content/posts/2025/02/25/sliding-window-counter-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part5_YoutubeThumbnail.jpg new file mode 100644 index 000000000..b07f4d824 Binary files /dev/null and b/content/posts/2025/02/25/sliding-window-counter-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part5_YoutubeThumbnail.jpg differ diff --git a/content/posts/2025/02/25/sliding-window-counter-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part5_YoutubeThumbnail.png b/content/posts/2025/02/25/sliding-window-counter-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part5_YoutubeThumbnail.png deleted file mode 100644 index e22fde7a9..000000000 Binary files a/content/posts/2025/02/25/sliding-window-counter-rate-limiter-redis-java/Redis_Video_RateLimiterImplementations_Part5_YoutubeThumbnail.png and /dev/null differ diff --git a/content/posts/2025/02/25/sliding-window-counter-rate-limiter-redis-java/index.md b/content/posts/2025/02/25/sliding-window-counter-rate-limiter-redis-java/index.md index eeddca8c5..893834d8a 100644 --- a/content/posts/2025/02/25/sliding-window-counter-rate-limiter-redis-java/index.md +++ b/content/posts/2025/02/25/sliding-window-counter-rate-limiter-redis-java/index.md @@ -6,7 +6,7 @@ description: "Learn how to implement a Sliding Window Counter Rate Limiter using canonical: "https://medium.com/redis-with-raphael-de-lio/sliding-window-counter-rate-limiter-redis-java-1ba8901c02e5" authors: - "raphael-delio" -image: "Redis_Video_RateLimiterImplementations_Part5_YoutubeThumbnail.png" +image: "Redis_Video_RateLimiterImplementations_Part5_YoutubeThumbnail.jpg" categories: - "Databases" - "Java" @@ -38,7 +38,7 @@ Though not as precise as the Sliding Window Log, the Sliding Window Counter requ ## How It Works -![](https://cdn-images-1.medium.com/max/2160/1*XLeoFFYwU1uzvLuMFu-tAw.gif) +![](1-XLeoFFYwU1uzvLuMFu-tAw-8ccca08f.gif) ### 1. Define a Time Window diff --git a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/banner-1-5302c117.jpg b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/banner-1-5302c117.jpg new file mode 100644 index 000000000..af3077b87 Binary files /dev/null and b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/banner-1-5302c117.jpg differ diff --git a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/banner-1.jpg b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/banner-1.jpg new file mode 100644 index 000000000..e380497f5 Binary files /dev/null and b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/banner-1.jpg differ diff --git a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/banner-1.png b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/banner-1.png deleted file mode 100644 index 0bab12b8d..000000000 Binary files a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/banner-1.png and /dev/null differ diff --git a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/diff-1ceb78b4.png b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/diff-1ceb78b4.png new file mode 100644 index 000000000..7f6f5fc24 Binary files /dev/null and b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/diff-1ceb78b4.png differ diff --git a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/diff-2-3401eb58.png b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/diff-2-3401eb58.png new file mode 100644 index 000000000..662992c6a Binary files /dev/null and b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/diff-2-3401eb58.png differ diff --git a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/evaluate-d620a384.png b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/evaluate-d620a384.png new file mode 100644 index 000000000..5f95eeb77 Binary files /dev/null and b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/evaluate-d620a384.png differ diff --git a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/first-changes-614d20b8.png b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/first-changes-614d20b8.png new file mode 100644 index 000000000..5d77333be Binary files /dev/null and b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/first-changes-614d20b8.png differ diff --git a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/follow-up-89f7a588.png b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/follow-up-89f7a588.png new file mode 100644 index 000000000..d7f461bf2 Binary files /dev/null and b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/follow-up-89f7a588.png differ diff --git a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/index.md b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/index.md index a7428f960..eaa835ff1 100644 --- a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/index.md +++ b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/index.md @@ -6,7 +6,7 @@ description: "Checking out Junie, a newly announced coding agent by JetBrains by canonical: "https://flounder.dev/posts/trying-out-junie/" authors: - "igor-kulakov" -image: "banner-1.png" +image: "banner-1.jpg" categories: - "IntelliJ IDEA" - "Kotlin" @@ -26,14 +26,14 @@ Recently, I talked about [Duplicate Finder](https://flounder.dev/duplicate-finde We agreed to think about adding the support soon. At the same time I got access to [Junie](https://www.jetbrains.com/junie/), a newly announced coding agent by JetBrains, which is currently in early access. After a while, a thought came to me that this is a great opportunity to try it in action. Coding agents are known to solve typical tasks well. But what about a project that is not based on a well-known framework and is outside a very common domain? As somewhat of a coding-agent skeptic, my expectations were mixed. -![Post banner](https://flounder.dev/img/trying-out-junie/banner-1.png "Post banner") +![Post banner](banner-1-5302c117.jpg "Post banner") Here is how it went. ## Installation and overview Junie is an IntelliJ IDEA plugin. Its UI adopts a familiar vertical tool window, similar to that of JetBrains AI Assistant or GitHub Copilot. Here's what it looks like: -![Junie UI consising of a text field, the 'add context' button, and the 'Brave Mode' checkbox](https://flounder.dev/img/trying-out-junie/overview.png "Junie UI consising of a text field, the 'add context' button, and the 'Brave Mode' checkbox") +![Junie UI consising of a text field, the 'add context' button, and the 'Brave Mode' checkbox](overview-ee42d00d.png "Junie UI consising of a text field, the 'add context' button, and the 'Brave Mode' checkbox") The minimalistic design only features a prompt field, a button for adding context, and a checkbox titled **Brave Mode**. This option controls whether Junie can run commands without double-checking with you. I'm not that brave yet, so I'll try that next time. @@ -42,33 +42,33 @@ The minimalistic design only features a prompt field, a button for adding contex Before giving Junie the coding task, I downloaded a topic from AsciiDoctor guide and placed it under `src/test/resources/` for Junie to use as test data and a reference. -![Initial prompt (Implement AsciiDoc support)](https://flounder.dev/img/trying-out-junie/initial-prompt.png "Initial prompt (Implement AsciiDoc support)") +![Initial prompt (Implement AsciiDoc support)](initial-prompt-6db658c6.png "Initial prompt (Implement AsciiDoc support)") For debugging purposes, I asked Junie to add the parsed blocks to a separate collection. This is because the actual index is structured in multiple levels, which makes it inconvenient to debug. For simplicity, I'd rather view the parsed elements as a flat structure if I need to check the results at runtime. ## 'Coding' After you enter the prompt, Junie breaks the task down into smaller items and starts to implement them. For adding the AsciiDoc support, it came up with the following plan: -![Initial plan consisting of several sub-items](https://flounder.dev/img/trying-out-junie/initial-plan.png "Initial plan consisting of several sub-items") +![Initial plan consisting of several sub-items](initial-plan-881b8b5c.png "Initial plan consisting of several sub-items") As Junie executes each item, it gives you the summary of the changes. You can review them right away, without having to wait for the entire workflow to complete: -![Changes appearing in the chat dialog](https://flounder.dev/img/trying-out-junie/first-changes.png "Changes appearing in the chat dialog") +![Changes appearing in the chat dialog](first-changes-614d20b8.png "Changes appearing in the chat dialog") By clicking the filenames, you can track the changes in the IntelliJ IDEA's diff view in a similar way to viewing Git changes or Local History. -![Diff view](https://flounder.dev/img/trying-out-junie/diff.png "Diff view") +![Diff view](diff-1ceb78b4.png "Diff view") After all items are completed, Junie proceeds with writing the tests and then prompts you to run them: -![Junie reasons about how to test the changes, creates the tests, and prompts to run them](https://flounder.dev/img/trying-out-junie/tests.png "Junie reasons about how to test the changes, creates the tests, and prompts to run them") +![Junie reasons about how to test the changes, creates the tests, and prompts to run them](tests-56ac2b8d.png "Junie reasons about how to test the changes, creates the tests, and prompts to run them") In this task, I gave Junie test data and explicitly requested tests. However, it appears that Junie generates them along with the test data by default. I experimented by running tasks without mentioning tests, and Junie created them anyway. After running the tests, which were successful in this case, Junie provides the summary of what has been done: -![Junie gives the summary of the changes together with the list of changed files](https://flounder.dev/img/trying-out-junie/summary.png "Junie gives the summary of the changes together with the list of changed files") +![Junie gives the summary of the changes together with the list of changed files](summary-a972b341.png "Junie gives the summary of the changes together with the list of changed files") ## Code quality Upon reviewing the code and tests, I found them well-structured and neat. What I really liked is that Junie changed not just the code required for the project to compile, but also took the extra step to introduce other meaningful changes in the context of the task. -![Diff view](https://flounder.dev/img/trying-out-junie/diff-2.png "Diff view") +![Diff view](diff-2-3401eb58.png "Diff view") **Tip:** **Evaluate Expression** has a lot of interesting use-cases beyond exploring collections. For example, you can use it to [prototype and apply fixes without restarting the program](https://flounder.dev/posts/efficient-debugging-exceptions/) or [arbitrarily modify its state](https://flounder.dev/posts/debugger-god-mode/) @@ -81,7 +81,7 @@ Everything's good so far, but it appears that more work still needs to be done. ## Correcting the implementation One area where coding agents are not yet fully autonomous is identifying potential problems at runtime. Technically, the implementation is correct, and it passes all the tests. The results of the parsing are consistent, as seen in the **Evaluate** dialog. -![The debugger's evaluate dialog showing the list of parsed blocks](https://flounder.dev/img/trying-out-junie/evaluate.png "The debugger's evaluate dialog showing the list of parsed blocks") +![The debugger's evaluate dialog showing the list of parsed blocks](evaluate-d620a384.png "The debugger's evaluate dialog showing the list of parsed blocks") **Tip** : **Evaluate Expression** has a lot of interesting use-cases beyond exploring collections. For example, [here's how](https://flounder.dev/posts/efficient-debugging-exceptions/) you can use it to prototype fixes and apply them to a running application. @@ -90,14 +90,14 @@ Everything looks fine, except processing a single file is taking a surprisingly Of course, this guess might not be accurate, giving us a fascinating opportunity for [profiling](https://flounder.dev/posts/get-started-with-profiling/) (or reading documentation). Anyway, changing a JRuby dependency for a simple Kotlin implementation would very likely speed things up. So, I decided to ask Junie to rewrite the code using a custom parser. Rather than starting a new task, I used the **Follow up** prompt for that: -![A follow-up prompt that says 'Could you replace the asciidoctorj library with a homemade no-frills implementation? It should pass the same test'](https://flounder.dev/img/trying-out-junie/follow-up.png "A follow-up prompt that says 'Could you replace the asciidoctorj library with a homemade no-frills implementation? It should pass the same test'") +![A follow-up prompt that says 'Could you replace the asciidoctorj library with a homemade no-frills implementation? It should pass the same test'](follow-up-89f7a588.png "A follow-up prompt that says 'Could you replace the asciidoctorj library with a homemade no-frills implementation? It should pass the same test'") ## Results Junie revised the implementation as requested. Although I'm not very familiar with the AsciiDoc format, the parsing seems to be largely correct at the first glance. There is some room for improvement in parsing of the preamble, and likely something else, but it does its job. Running the updated Duplicate Finder on AsciiDoctor's own help detected some duplicates! The analysis took 350 milliseconds on my laptop: -![Duplicate Finder UI showing duplicates in AsciiDoctor help](https://flounder.dev/img/trying-out-junie/results.png "Duplicate Finder UI showing duplicates in AsciiDoctor help") +![Duplicate Finder UI showing duplicates in AsciiDoctor help](results-b741a83c.png "Duplicate Finder UI showing duplicates in AsciiDoctor help") The project with the [committed changes](https://github.com/flounder4130/duplicate-finder/compare/0530670ed98a5815394944f28446ca47e983dfba...f10dd6ac8e3cddb3ec5fb0cac45f56cd4a9bcbc9) is on my [GitHub](https://github.com/flounder4130/duplicate-finder). To try the new version of the app, you can find the instructions and the download link on the [Duplicate Finder page](https://flounder.dev/duplicate-finder/). Overall, the implementation might not be perfect, and it definitely requires more thorough checking, but still I'm very impressed by what you can get done in 5 minutes nowadays. diff --git a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/initial-plan-881b8b5c.png b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/initial-plan-881b8b5c.png new file mode 100644 index 000000000..a65a5a014 Binary files /dev/null and b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/initial-plan-881b8b5c.png differ diff --git a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/initial-prompt-6db658c6.png b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/initial-prompt-6db658c6.png new file mode 100644 index 000000000..112116359 Binary files /dev/null and b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/initial-prompt-6db658c6.png differ diff --git a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/overview-ee42d00d.png b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/overview-ee42d00d.png new file mode 100644 index 000000000..b875c7b07 Binary files /dev/null and b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/overview-ee42d00d.png differ diff --git a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/results-b741a83c.png b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/results-b741a83c.png new file mode 100644 index 000000000..a68eb1b64 Binary files /dev/null and b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/results-b741a83c.png differ diff --git a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/summary-a972b341.png b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/summary-a972b341.png new file mode 100644 index 000000000..eca8b598f Binary files /dev/null and b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/summary-a972b341.png differ diff --git a/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/tests-56ac2b8d.png b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/tests-56ac2b8d.png new file mode 100644 index 000000000..71a602237 Binary files /dev/null and b/content/posts/2025/02/26/checking-out-junie-a-coding-agent-by-jetbrains/tests-56ac2b8d.png differ diff --git a/content/posts/2025/02/27/building-local-llm-ai-powered-applications-with-quarkus-ollama-and-testcontainers/https___dev-to-uploads.s3.amazonaws.com_uploads_articles_defv9j6s88xk87tot29t.jpg b/content/posts/2025/02/27/building-local-llm-ai-powered-applications-with-quarkus-ollama-and-testcontainers/https___dev-to-uploads.s3.amazonaws.com_uploads_articles_defv9j6s88xk87tot29t.jpg new file mode 100644 index 000000000..b14b69a5f Binary files /dev/null and b/content/posts/2025/02/27/building-local-llm-ai-powered-applications-with-quarkus-ollama-and-testcontainers/https___dev-to-uploads.s3.amazonaws.com_uploads_articles_defv9j6s88xk87tot29t.jpg differ diff --git a/content/posts/2025/02/27/building-local-llm-ai-powered-applications-with-quarkus-ollama-and-testcontainers/https___dev-to-uploads.s3.amazonaws.com_uploads_articles_defv9j6s88xk87tot29t.png b/content/posts/2025/02/27/building-local-llm-ai-powered-applications-with-quarkus-ollama-and-testcontainers/https___dev-to-uploads.s3.amazonaws.com_uploads_articles_defv9j6s88xk87tot29t.png deleted file mode 100644 index d43f79d9b..000000000 Binary files a/content/posts/2025/02/27/building-local-llm-ai-powered-applications-with-quarkus-ollama-and-testcontainers/https___dev-to-uploads.s3.amazonaws.com_uploads_articles_defv9j6s88xk87tot29t.png and /dev/null differ diff --git a/content/posts/2025/02/27/building-local-llm-ai-powered-applications-with-quarkus-ollama-and-testcontainers/index.md b/content/posts/2025/02/27/building-local-llm-ai-powered-applications-with-quarkus-ollama-and-testcontainers/index.md index 4a0409d68..e7a13d937 100644 --- a/content/posts/2025/02/27/building-local-llm-ai-powered-applications-with-quarkus-ollama-and-testcontainers/index.md +++ b/content/posts/2025/02/27/building-local-llm-ai-powered-applications-with-quarkus-ollama-and-testcontainers/index.md @@ -5,7 +5,7 @@ lastmod: "2025-05-06T10:50:02+00:00" description: "Explore how to combine Quarkus with Ollama, a platform for running AI models locally. We’ll also demonstrate how tools like Testcontainers and Quarkus Dev Services simplify development and testing workflows" authors: - "jonathan-vila" -image: "https___dev-to-uploads.s3.amazonaws.com_uploads_articles_defv9j6s88xk87tot29t.png" +image: "https___dev-to-uploads.s3.amazonaws.com_uploads_articles_defv9j6s88xk87tot29t.jpg" categories: - "Java" - "LangChain4j" diff --git a/content/posts/2025/02/27/front-end-debugging-part-3-networking/image18-firefox-network-monitor-700x429.jpg b/content/posts/2025/02/27/front-end-debugging-part-3-networking/image18-firefox-network-monitor-700x429.jpg new file mode 100644 index 000000000..2b41dc908 Binary files /dev/null and b/content/posts/2025/02/27/front-end-debugging-part-3-networking/image18-firefox-network-monitor-700x429.jpg differ diff --git a/content/posts/2025/02/27/front-end-debugging-part-3-networking/image18-firefox-network-monitor-700x429.png b/content/posts/2025/02/27/front-end-debugging-part-3-networking/image18-firefox-network-monitor-700x429.png deleted file mode 100644 index 3fca08611..000000000 Binary files a/content/posts/2025/02/27/front-end-debugging-part-3-networking/image18-firefox-network-monitor-700x429.png and /dev/null differ diff --git a/content/posts/2025/02/27/front-end-debugging-part-3-networking/image19-chrome-network-monitor-614x510.jpg b/content/posts/2025/02/27/front-end-debugging-part-3-networking/image19-chrome-network-monitor-614x510.jpg new file mode 100644 index 000000000..ac1cc31b5 Binary files /dev/null and b/content/posts/2025/02/27/front-end-debugging-part-3-networking/image19-chrome-network-monitor-614x510.jpg differ diff --git a/content/posts/2025/02/27/front-end-debugging-part-3-networking/image19-chrome-network-monitor-614x510.png b/content/posts/2025/02/27/front-end-debugging-part-3-networking/image19-chrome-network-monitor-614x510.png deleted file mode 100644 index 81f4e229c..000000000 Binary files a/content/posts/2025/02/27/front-end-debugging-part-3-networking/image19-chrome-network-monitor-614x510.png and /dev/null differ diff --git a/content/posts/2025/02/27/front-end-debugging-part-3-networking/image21-throttling-700x411.jpg b/content/posts/2025/02/27/front-end-debugging-part-3-networking/image21-throttling-700x411.jpg new file mode 100644 index 000000000..3ffc5605e Binary files /dev/null and b/content/posts/2025/02/27/front-end-debugging-part-3-networking/image21-throttling-700x411.jpg differ diff --git a/content/posts/2025/02/27/front-end-debugging-part-3-networking/image21-throttling-700x411.png b/content/posts/2025/02/27/front-end-debugging-part-3-networking/image21-throttling-700x411.png deleted file mode 100644 index 85bc578be..000000000 Binary files a/content/posts/2025/02/27/front-end-debugging-part-3-networking/image21-throttling-700x411.png and /dev/null differ diff --git a/content/posts/2025/02/27/front-end-debugging-part-3-networking/image22-firefox-storage-tab-700x324.jpg b/content/posts/2025/02/27/front-end-debugging-part-3-networking/image22-firefox-storage-tab-700x324.jpg new file mode 100644 index 000000000..f919d0c37 Binary files /dev/null and b/content/posts/2025/02/27/front-end-debugging-part-3-networking/image22-firefox-storage-tab-700x324.jpg differ diff --git a/content/posts/2025/02/27/front-end-debugging-part-3-networking/image22-firefox-storage-tab-700x324.png b/content/posts/2025/02/27/front-end-debugging-part-3-networking/image22-firefox-storage-tab-700x324.png deleted file mode 100644 index bd840f8c2..000000000 Binary files a/content/posts/2025/02/27/front-end-debugging-part-3-networking/image22-firefox-storage-tab-700x324.png and /dev/null differ diff --git a/content/posts/2025/02/27/front-end-debugging-part-3-networking/index.md b/content/posts/2025/02/27/front-end-debugging-part-3-networking/index.md index 7cd811f52..9dd8baa4c 100644 --- a/content/posts/2025/02/27/front-end-debugging-part-3-networking/index.md +++ b/content/posts/2025/02/27/front-end-debugging-part-3-networking/index.md @@ -39,7 +39,7 @@ As a side note, if you like the content of this and the other posts in this seri Modern browsers come equipped with developer tools that rival standalone IDE debuggers in capability and convenience. Both Chrome and Firefox have robust network monitoring features that allow developers to observe/analyze requests and responses without leaving the browser. -![](image18-firefox-network-monitor-700x429.png) +![](image18-firefox-network-monitor-700x429.jpg) On the basic level, which you're probably familiar with, these tools include: @@ -49,7 +49,7 @@ On the basic level, which you're probably familiar with, these tools include: While this post focuses on debugging techniques, it's worth noting that these tools are invaluable for performance optimization as well, though that topic warrants its own discussion. -![](image19-chrome-network-monitor-614x510.png) +![](image19-chrome-network-monitor-614x510.jpg) ## **Re-Issuing and Modifying Requests** @@ -73,7 +73,7 @@ If you prefer Postman, you can copy request headers and payloads from the browse Network throttling is a highly underrated feature that can be a game-changer for debugging specific classes of bugs. Both Chrome and Firefox allow developers to simulate various network speeds, from 2G connections to fast 4G. -![](image21-throttling-700x411.png) +![](image21-throttling-700x411.jpg) ### Why Throttling Matters: @@ -103,7 +103,7 @@ Understanding the exact state of a user's local storage can provide insight into In Firefox the dedicated **Storage** tab in Developer Tools makes it easy to inspect, edit, and delete data from local storage, session storage, cookies, and indexedDB. -![](image22-firefox-storage-tab-700x324.png) +![](image22-firefox-storage-tab-700x324.jpg) In Chrome the **Application** tab consolidates all storage options, including the ability to clear specific caches or edit entries manually. diff --git a/content/posts/2025/03/01/javafx-links-of-february-2025/index.md b/content/posts/2025/03/01/javafx-links-of-february-2025/index.md index 99677cf50..e40bfe6af 100644 --- a/content/posts/2025/03/01/javafx-links-of-february-2025/index.md +++ b/content/posts/2025/03/01/javafx-links-of-february-2025/index.md @@ -5,7 +5,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of February 202 canonical: "https://webtechie.be/post/2025-02-28-javafx-links-of-february-2025/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2025/03/01/javafx-links-of-february-2025/jfxcentral.jpg b/content/posts/2025/03/01/javafx-links-of-february-2025/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2025/03/01/javafx-links-of-february-2025/jfxcentral.jpg differ diff --git a/content/posts/2025/03/01/javafx-links-of-february-2025/jfxcentral.png b/content/posts/2025/03/01/javafx-links-of-february-2025/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2025/03/01/javafx-links-of-february-2025/jfxcentral.png and /dev/null differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-1b8bbf88.jpg b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-1b8bbf88.jpg new file mode 100644 index 000000000..45f16dc68 Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-1b8bbf88.jpg differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-2804a77d.jpg b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-2804a77d.jpg new file mode 100644 index 000000000..1ecd66948 Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-2804a77d.jpg differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-4eba458e.png b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-4eba458e.png new file mode 100644 index 000000000..e8d5d3436 Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-4eba458e.png differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-65008009.jpg b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-65008009.jpg new file mode 100644 index 000000000..16d2eed93 Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-65008009.jpg differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-70de7c27.png b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-70de7c27.png new file mode 100644 index 000000000..ae8c38c2b Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-70de7c27.png differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-7d8684f8.png b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-7d8684f8.png new file mode 100644 index 000000000..445e2fbd2 Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-7d8684f8.png differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-95cf718e.png b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-95cf718e.png new file mode 100644 index 000000000..5208175ba Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-95cf718e.png differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-9d1ae302.png b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-9d1ae302.png new file mode 100644 index 000000000..b026aad59 Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-9d1ae302.png differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-ba41bf30.png b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-ba41bf30.png new file mode 100644 index 000000000..e729f6b8b Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-ba41bf30.png differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c13927fb.jpg b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c13927fb.jpg new file mode 100644 index 000000000..1dbe84d2b Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c13927fb.jpg differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c5219758.png b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c5219758.png new file mode 100644 index 000000000..52d5c69af Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c5219758.png differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-df29f66d.jpg b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-df29f66d.jpg new file mode 100644 index 000000000..082da6182 Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-df29f66d.jpg differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-e159fd4d.png b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-e159fd4d.png new file mode 100644 index 000000000..78cad4bfb Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-e159fd4d.png differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-e38eec89.png b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-e38eec89.png new file mode 100644 index 000000000..fff02c559 Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-e38eec89.png differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-e9085767.png b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-e9085767.png new file mode 100644 index 000000000..974fe0fbd Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-e9085767.png differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-f1b8cd6b.png b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-f1b8cd6b.png new file mode 100644 index 000000000..1f171c71c Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-f1b8cd6b.png differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-f266291e.png b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-f266291e.png new file mode 100644 index 000000000..325dcc49d Binary files /dev/null and b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-f266291e.png differ diff --git a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/index.md b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/index.md index a29c5dfb2..153305e28 100644 --- a/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/index.md +++ b/content/posts/2025/03/07/code-reviews-with-ai-a-developer-guide/index.md @@ -32,17 +32,17 @@ I will discuss the use and impact of AI on the different phases of the SDLC from AI-powered generative code assistants take the power of AI even further by automatically generating code based on your inputs. This can dramatically reduce the time and effort required to write code, especially for repetitive or boilerplate tasks. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9vrkg0g1bvt44ta8uqo.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9vrkg0g1bvt44ta8uqo.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-f1b8cd6b.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-f1b8cd6b.png) Generative code assistants can also help you explore different design options and identify potential problems before you start coding. By leveraging these tools, you can focus on the creative and strategic aspects of software development, while the AI handles the tedious and mechanical tasks. AI adoption -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9eeleowba6m6fzxh00o1.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9eeleowba6m6fzxh00o1.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-e9085767.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-e9085767.png) There's a long list of AI code assistants providing different features, with different ranking rates considering 5 different categorizations: -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2yrk2ycgk1jpl68874ae.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2yrk2ycgk1jpl68874ae.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-e159fd4d.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-e159fd4d.png) *\*Codiumate is now Qodo Gen* @@ -54,9 +54,9 @@ The local free open-source approach .... Other completely open-source options are also available. This option involves hosting the model to generate code locally or in your network. There are tons of free and open-source models that you can use, and you can only serve those models by installing the free tool Ollama on a machine in your network or locally. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frdd5jkpaeqq6av617m0q.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frdd5jkpaeqq6av617m0q.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-df29f66d.jpg)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-df29f66d.jpg) -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feg0hnl2g99ry4nwfrvwv.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feg0hnl2g99ry4nwfrvwv.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-ba41bf30.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-ba41bf30.png) I've tried with the IntelliJ plugin "[Continue](https://plugins.jetbrains.com/plugin/22707-continue/reviews)", [Ollama](https://ollama.com/), and the models "codellama" and "deepseek-coder" and the experience was not bad at all. With this solution also you are sure your code, and [your prompts are not going anywhere out of your domains](https://github.com/ollama/ollama/blob/main/docs/faq.md#does-ollama-send-my-prompts-and-answers-back-to-ollamacom). @@ -66,7 +66,7 @@ While generative AI holds immense promise, it is not without its pitfalls. One m AI-generated code correctness -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8q4kodirhxscuyxj7rrd.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8q4kodirhxscuyxj7rrd.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-95cf718e.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-95cf718e.png) Additionally, generative AI systems may not fully understand the context or intent of the code they generate, leading to nonsensical or even harmful output. Furthermore, there is a risk that generative AI could not use the full code base context in order to generate the most aligned code with our current content. It is crucial for developers to carefully review and test code generated by AI and to employ robust security measures to mitigate these risks. @@ -110,9 +110,9 @@ For this task, there are static analyzers in the form of IDE linters, like Sonar Imagine catching potential bugs and best practices before they even make it to a code review. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74qlnrbowbyj92k3iwsu.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74qlnrbowbyj92k3iwsu.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-4eba458e.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-4eba458e.png) -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuuqq7d2rylzfx49t6xe8.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuuqq7d2rylzfx49t6xe8.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-f266291e.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-f266291e.png) These linters use static analysis, and different functions, to detect code smells, bugs, and security vulnerabilities directly in your IDE, empowering you to write cleaner and safer code from @@ -122,7 +122,7 @@ However, this includes not only bugs and vulnerabilities but **also best practic In this case, GitHub Copilot didn't suggest an approach using a feature introduced 7 years ago. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfmsfajraaskhs529t4b.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfmsfajraaskhs529t4b.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-e38eec89.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-e38eec89.png) Generated by Github Copilot @@ -147,7 +147,7 @@ Manual approach considering Java's new Teeing collector, introduced in Java 12, or even not using the latest new features of a language. In this case, Virtual Threads were introduced in Java 21, a year and a half ago. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2cdrdg8sadnh9dadgbl.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2cdrdg8sadnh9dadgbl.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-70de7c27.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-70de7c27.png) Code generated by Github Copilot, using platform threads @@ -169,7 +169,7 @@ Manual approach using Virtual Threads, being able to create thousands of threads Luckily these linters will also warn us about the lack of best practices usage while we code and during the CI full analysis. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficzv32sihtsevac0av9c.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficzv32sihtsevac0av9c.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c5219758.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c5219758.png) A particular benefit of some linters over others (like SonarQube IDE) is that they can analyze multiple types of files at the same time in the same project. This is not only restricted to programming languages like Java, Python, JScript, Kotlin, etc. but also to Cloud deployment files like Docker, Kubernetes, Ansible, Terraform, CloudFormation, etc., and even Secrets vulnerabilities. @@ -181,11 +181,11 @@ In this area, we can find tools like Qodo Gen, among others, that specialize in I've installed it in my IntelliJ IDE and tried it with my AI project. The result is impressive, considering several test use cases in the happy path or edge cases. As with most code assistants, we can select which remote-hosted model we want to use. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxp2q0rp6ggm3m2qimv9e.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxp2q0rp6ggm3m2qimv9e.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-7d8684f8.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-7d8684f8.png) Tools like Qodo will take a class method and create its tests. We will have a dashboard to see the tests and executions, and also a plan for the test generation in the Qodo plugin : -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4rthxjobjagon0djfr70.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4rthxjobjagon0djfr70.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-65008009.jpg)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-65008009.jpg) **3. Pull Request creation** @@ -209,7 +209,7 @@ A typical workflow would usually imply: Several guides ([GitHub](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests), [pull request](https://www.pullrequest.com/blog/writing-a-great-pull-request-description/)) can help you write good descriptions, but we can leverage AI for this. One of the tools we can use for this is Github Copilot, which analyzes the code in the PR to provide a more detailed description. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4itg64llbnym02iolrlj.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4itg64llbnym02iolrlj.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-1b8bbf88.jpg)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-1b8bbf88.jpg) In these two images, we see how we can ask Github Copilot to generate a summary for the PR. @@ -233,7 +233,7 @@ This allows developers to focus on the most critical problems first, making the Connecting this step with the previous PR workflow, the tools we connect to our repository can help us to check for all the scenarios that can make our code fail, before anyone invests time in reviewing it, to just focus on working changes that need experienced review. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpzok2w9t2i1jfgu23i9q.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpzok2w9t2i1jfgu23i9q.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c13927fb.jpg)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c13927fb.jpg) **5. Pull Request changes explanation** @@ -241,7 +241,7 @@ Now it's the turn of the reviewers. They should start by reading the ticket that For this, we can use several tools. I've tried [Github Copilot](https://docs.github.com/en/copilot/using-github-copilot/copilot-chat/asking-github-copilot-questions-in-github#asking-copilot-chat-questions-about-specific-pieces-of-code) and [Qodo PR-Agent](https://github.com/qodo-ai/pr-agent?tab=readme-ov-file#try-it-now) (you can find a comparison [here](https://dev.to/danielrendox/ai-powered-pull-requests-codiumai-vs-github-copilot-35d0)) : -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4zonrisjz2uyrqlao5g.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4zonrisjz2uyrqlao5g.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-2804a77d.jpg)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-2804a77d.jpg) While Copilot has an explanation feature per changed file, Qodo can create a description for the entire PR. This will help the reviewers understand the details applied to files and focus on those that require more attention. It's important to reduce the time a PR needs to be merged, and definitely, the usage of AI tools can help us with that. @@ -255,7 +255,7 @@ Some AI tools, like Qodo PR-Agent, can also implement the improvements and chang Like all the changes, they need to be analyzed and checked with tools like SonarQube. If there are any issues, these tools will fail, preventing those changes from being merged into the main branch. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44xvo4z9i73fhk40zrsp.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44xvo4z9i73fhk40zrsp.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-9d1ae302.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-9d1ae302.png) **Addressing the Challenges with AI** diff --git a/content/posts/2025/03/07/creating-sboms-with-the-snyk-cli/Creating_SBOMs_with_the_SNyk_CLI_-_origi-928c6946.png b/content/posts/2025/03/07/creating-sboms-with-the-snyk-cli/Creating_SBOMs_with_the_SNyk_CLI_-_origi-928c6946.png new file mode 100644 index 000000000..39506ace6 Binary files /dev/null and b/content/posts/2025/03/07/creating-sboms-with-the-snyk-cli/Creating_SBOMs_with_the_SNyk_CLI_-_origi-928c6946.png differ diff --git a/content/posts/2025/03/07/creating-sboms-with-the-snyk-cli/blog-creating-sboms-bomber-03bfb7f8.jpg b/content/posts/2025/03/07/creating-sboms-with-the-snyk-cli/blog-creating-sboms-bomber-03bfb7f8.jpg new file mode 100644 index 000000000..c1b355fd4 Binary files /dev/null and b/content/posts/2025/03/07/creating-sboms-with-the-snyk-cli/blog-creating-sboms-bomber-03bfb7f8.jpg differ diff --git a/content/posts/2025/03/07/creating-sboms-with-the-snyk-cli/index.md b/content/posts/2025/03/07/creating-sboms-with-the-snyk-cli/index.md index 6c56acbf4..5eff75af5 100644 --- a/content/posts/2025/03/07/creating-sboms-with-the-snyk-cli/index.md +++ b/content/posts/2025/03/07/creating-sboms-with-the-snyk-cli/index.md @@ -6,7 +6,7 @@ description: "The software bill of materials (SBOM) is quickly becoming an essen canonical: "https://snyk.io/blog/creating-sboms-snyk-cli/" authors: - "bmvermeer" -image: "https://res.cloudinary.com/snyk/image/upload/f_auto,w_960,q_auto/v1738787589/Creating_SBOMs_with_the_SNyk_CLI_-_original_fu9ead.png" +image: "Creating_SBOMs_with_the_SNyk_CLI_-_origi-928c6946.png" categories: - "Security" - "Snyk" @@ -133,7 +133,7 @@ At the time of writing, this is still an experimental feature hence the \`--expe * SPDX: JSON version 2.3 Please take a look at the [++Snyk CLI SBOM Test Documentation++](https://docs.snyk.io/snyk-cli/commands/sbom-test) for the latest updates on this feature and other available options. -![](https://res.cloudinary.com/snyk/image/upload/f_auto,w_960,q_auto/v1738787589/Creating_SBOMs_with_the_SNyk_CLI_-_original_fu9ead.png) +![](Creating_SBOMs_with_the_SNyk_CLI_-_origi-928c6946.png) #### Bomber @@ -163,7 +163,7 @@ bomber scan --provider snyk --token xxx mysbom.json ``` The output will show you all known vulnerabilities on your screen. -![Bomber SBOM scanner with the Snyk integration provider for Java Maven dependencies.](https://res.cloudinary.com/snyk/image/upload/f_auto,w_2560,q_auto/v1707410787/blog-creating-sboms-bomber.jpg) +![Bomber SBOM scanner with the Snyk integration provider for Java Maven dependencies.](blog-creating-sboms-bomber-03bfb7f8.jpg) ## Supplying up-to-date SBOMs with Snyk diff --git a/content/posts/2025/03/07/extending-java-apis-add-missing-features-without-the-hassle/a6xlwj10os1j8f59xiqm-5657cd84.jpeg b/content/posts/2025/03/07/extending-java-apis-add-missing-features-without-the-hassle/a6xlwj10os1j8f59xiqm-5657cd84.jpeg new file mode 100644 index 000000000..3cde466a9 Binary files /dev/null and b/content/posts/2025/03/07/extending-java-apis-add-missing-features-without-the-hassle/a6xlwj10os1j8f59xiqm-5657cd84.jpeg differ diff --git a/content/posts/2025/03/07/extending-java-apis-add-missing-features-without-the-hassle/fjqpna2nwtszbwemp5kh-020bd266.jpeg b/content/posts/2025/03/07/extending-java-apis-add-missing-features-without-the-hassle/fjqpna2nwtszbwemp5kh-020bd266.jpeg new file mode 100644 index 000000000..410b7fde4 Binary files /dev/null and b/content/posts/2025/03/07/extending-java-apis-add-missing-features-without-the-hassle/fjqpna2nwtszbwemp5kh-020bd266.jpeg differ diff --git a/content/posts/2025/03/07/extending-java-apis-add-missing-features-without-the-hassle/index.md b/content/posts/2025/03/07/extending-java-apis-add-missing-features-without-the-hassle/index.md index 8da255076..a59cc1d2c 100644 --- a/content/posts/2025/03/07/extending-java-apis-add-missing-features-without-the-hassle/index.md +++ b/content/posts/2025/03/07/extending-java-apis-add-missing-features-without-the-hassle/index.md @@ -72,11 +72,11 @@ Manifold has ready-made extensions for many built-in Java classes. In fact, all To understand this and some of the other capabilities around this feature we first need to understand how it works. Manifold can't add a method to an existing Java class. The JVM doesn't allow it. Instead, it does something very simple, it replaces the call to the class with a call to the extension. Since this is done during compile time the call is static and very efficient. There's no inherent runtime overhead. -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a6xlwj10os1j8f59xiqm.jpeg) +![Image description](a6xlwj10os1j8f59xiqm-5657cd84.jpeg) If during this process Manifold notices that a method with that signature already exists, it uses the actual method. This is important, if we want to use a feature that isn't yet available in the current version of Java, we can mock it with Manifold and then when we finally upgrade the transition would be seamless. We won't even need to remove Manifold! -![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fjqpna2nwtszbwemp5kh.jpeg) +![Image description](fjqpna2nwtszbwemp5kh-020bd266.jpeg) The extension libraries include too many features to cover here. String is extended with many common methods such as `substringAfterLast(delimiter)`, `removePrefix(String)`, `padStart(length, char)`, etc. Code like this does what you would expect: diff --git a/content/posts/2025/03/11/path-traversal-vulnerability-in-deep-java-library-djl-and-its-impact-on-java-ai-development/Screenshot_2025-02-18_at_9.09.14_AM_eq3c-d4d6f4a0.png b/content/posts/2025/03/11/path-traversal-vulnerability-in-deep-java-library-djl-and-its-impact-on-java-ai-development/Screenshot_2025-02-18_at_9.09.14_AM_eq3c-d4d6f4a0.png new file mode 100644 index 000000000..0d8b783ca Binary files /dev/null and b/content/posts/2025/03/11/path-traversal-vulnerability-in-deep-java-library-djl-and-its-impact-on-java-ai-development/Screenshot_2025-02-18_at_9.09.14_AM_eq3c-d4d6f4a0.png differ diff --git a/content/posts/2025/03/11/path-traversal-vulnerability-in-deep-java-library-djl-and-its-impact-on-java-ai-development/index.md b/content/posts/2025/03/11/path-traversal-vulnerability-in-deep-java-library-djl-and-its-impact-on-java-ai-development/index.md index 633ff46d9..88666758f 100644 --- a/content/posts/2025/03/11/path-traversal-vulnerability-in-deep-java-library-djl-and-its-impact-on-java-ai-development/index.md +++ b/content/posts/2025/03/11/path-traversal-vulnerability-in-deep-java-library-djl-and-its-impact-on-java-ai-development/index.md @@ -122,6 +122,6 @@ Depending on the OS this can potentially also work the other way around as Linux Updating DJL to 0.31.1 or above solves this specific CVE. DJL versions 0.31.1 and later address path traversal vulnerabilities using the normalize() function on Path. This update is reflected in this specific [++GitHub commit++](https://github.com/deepjavalibrary/djl/commit/7415cc5f72aae69ea9716a5e4f709af03a77a619). If you cannot update, pleas make sure to avoid using zip or tar files with unknown content. Snyk can also help you identify and remediate vulnerabilities like this one, not only in your supply chain but also in your custom code and more. Below, you see the Snyk plugin within the IntelliJ development environment. It detected the vulnerability in my manifest file and showed an available update. The identified issue can be resolved by upgrading to version 0.31.1 or any later version. This update process can be conveniently executed with a single click directly from the notification within IntelliJ. -![](https://res.cloudinary.com/snyk/image/upload/f_auto,w_2560,q_auto/v1739887817/Screenshot_2025-02-18_at_9.09.14_AM_eq3ccv.png) +![](Screenshot_2025-02-18_at_9.09.14_AM_eq3c-d4d6f4a0.png) This vulnerability highlights the importance of addressing supply chain security. If you aren't already, consider [scanning your applications](https://app.snyk.io/login) with Snyk to protect all application components. diff --git a/content/posts/2025/03/25/one-giant-kubernetes-cluster-for-everything/giant-kubernetes-1650x927-1.jpg b/content/posts/2025/03/25/one-giant-kubernetes-cluster-for-everything/giant-kubernetes-1650x927-1.jpg new file mode 100644 index 000000000..74dc993f8 Binary files /dev/null and b/content/posts/2025/03/25/one-giant-kubernetes-cluster-for-everything/giant-kubernetes-1650x927-1.jpg differ diff --git a/content/posts/2025/03/25/one-giant-kubernetes-cluster-for-everything/giant-kubernetes-1650x927-1.png b/content/posts/2025/03/25/one-giant-kubernetes-cluster-for-everything/giant-kubernetes-1650x927-1.png deleted file mode 100644 index d05c90248..000000000 Binary files a/content/posts/2025/03/25/one-giant-kubernetes-cluster-for-everything/giant-kubernetes-1650x927-1.png and /dev/null differ diff --git a/content/posts/2025/03/25/one-giant-kubernetes-cluster-for-everything/index.md b/content/posts/2025/03/25/one-giant-kubernetes-cluster-for-everything/index.md index 0eb416d79..68fc54f90 100644 --- a/content/posts/2025/03/25/one-giant-kubernetes-cluster-for-everything/index.md +++ b/content/posts/2025/03/25/one-giant-kubernetes-cluster-for-everything/index.md @@ -6,7 +6,7 @@ description: "The ideal size of your Kubernetes clusters is a day 0 question and canonical: "https://www.loft.sh/blog/one-giant-kubernetes-cluster" authors: - "nicolas-frankel" -image: "giant-kubernetes-1650x927-1.png" +image: "giant-kubernetes-1650x927-1.jpg" categories: - "DevOps" - "Kubernetes" diff --git a/content/posts/2025/03/25/webassembly-on-kubernetes/cover_blog_WebAssembly_Kubernetes_dark.jpg b/content/posts/2025/03/25/webassembly-on-kubernetes/cover_blog_WebAssembly_Kubernetes_dark.jpg new file mode 100644 index 000000000..468c58f83 Binary files /dev/null and b/content/posts/2025/03/25/webassembly-on-kubernetes/cover_blog_WebAssembly_Kubernetes_dark.jpg differ diff --git a/content/posts/2025/03/25/webassembly-on-kubernetes/cover_blog_WebAssembly_Kubernetes_dark.png b/content/posts/2025/03/25/webassembly-on-kubernetes/cover_blog_WebAssembly_Kubernetes_dark.png deleted file mode 100644 index b6c8e10ee..000000000 Binary files a/content/posts/2025/03/25/webassembly-on-kubernetes/cover_blog_WebAssembly_Kubernetes_dark.png and /dev/null differ diff --git a/content/posts/2025/03/25/webassembly-on-kubernetes/index.md b/content/posts/2025/03/25/webassembly-on-kubernetes/index.md index f6460bcb0..ec8129611 100644 --- a/content/posts/2025/03/25/webassembly-on-kubernetes/index.md +++ b/content/posts/2025/03/25/webassembly-on-kubernetes/index.md @@ -6,7 +6,7 @@ description: "Like a couple of innovative technologies, different people have di canonical: "https://www.loft.sh/blog/webassembly-on-kubernetes" authors: - "nicolas-frankel" -image: "cover_blog_WebAssembly_Kubernetes_dark.png" +image: "cover_blog_WebAssembly_Kubernetes_dark.jpg" categories: - "Research" related_posts: diff --git a/content/posts/2025/03/28/javafx-links-of-march-2025/index.md b/content/posts/2025/03/28/javafx-links-of-march-2025/index.md index 26b0a799c..899e94536 100644 --- a/content/posts/2025/03/28/javafx-links-of-march-2025/index.md +++ b/content/posts/2025/03/28/javafx-links-of-march-2025/index.md @@ -5,7 +5,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of March 2025. canonical: "https://webtechie.be/post/2025-03-28-javafx-links-of-march-2025/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2025/03/28/javafx-links-of-march-2025/jfxcentral.jpg b/content/posts/2025/03/28/javafx-links-of-march-2025/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2025/03/28/javafx-links-of-march-2025/jfxcentral.jpg differ diff --git a/content/posts/2025/03/28/javafx-links-of-march-2025/jfxcentral.png b/content/posts/2025/03/28/javafx-links-of-march-2025/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2025/03/28/javafx-links-of-march-2025/jfxcentral.png and /dev/null differ diff --git a/content/posts/2025/04/02/breaktime-tech-talks-ep38-spring-ai-debugging-how-to-contribute-to-open-source/index.md b/content/posts/2025/04/02/breaktime-tech-talks-ep38-spring-ai-debugging-how-to-contribute-to-open-source/index.md index 162f4d9ee..60605b4fd 100644 --- a/content/posts/2025/04/02/breaktime-tech-talks-ep38-spring-ai-debugging-how-to-contribute-to-open-source/index.md +++ b/content/posts/2025/04/02/breaktime-tech-talks-ep38-spring-ai-debugging-how-to-contribute-to-open-source/index.md @@ -5,7 +5,7 @@ lastmod: "2025-04-11T07:29:01+00:00" description: "In this episode, I focus on continuing my journey with vector databases, integrating Pinecone, Neo4J , and Spring AI." authors: - "jennifer-reif" -image: "techtalks.png" +image: "techtalks.jpg" categories: - "Debugging" - "Spring" diff --git a/content/posts/2025/04/02/breaktime-tech-talks-ep38-spring-ai-debugging-how-to-contribute-to-open-source/techtalks.jpg b/content/posts/2025/04/02/breaktime-tech-talks-ep38-spring-ai-debugging-how-to-contribute-to-open-source/techtalks.jpg new file mode 100644 index 000000000..6a9995eec Binary files /dev/null and b/content/posts/2025/04/02/breaktime-tech-talks-ep38-spring-ai-debugging-how-to-contribute-to-open-source/techtalks.jpg differ diff --git a/content/posts/2025/04/02/breaktime-tech-talks-ep38-spring-ai-debugging-how-to-contribute-to-open-source/techtalks.png b/content/posts/2025/04/02/breaktime-tech-talks-ep38-spring-ai-debugging-how-to-contribute-to-open-source/techtalks.png deleted file mode 100644 index 2b62105aa..000000000 Binary files a/content/posts/2025/04/02/breaktime-tech-talks-ep38-spring-ai-debugging-how-to-contribute-to-open-source/techtalks.png and /dev/null differ diff --git a/content/posts/2025/04/09/webinar-java-ai/20250428_Java_AI-1024x576.jpg b/content/posts/2025/04/09/webinar-java-ai/20250428_Java_AI-1024x576.jpg new file mode 100644 index 000000000..ed296b39c Binary files /dev/null and b/content/posts/2025/04/09/webinar-java-ai/20250428_Java_AI-1024x576.jpg differ diff --git a/content/posts/2025/04/09/webinar-java-ai/20250428_Java_AI-1024x576.png b/content/posts/2025/04/09/webinar-java-ai/20250428_Java_AI-1024x576.png deleted file mode 100644 index 975da5ea4..000000000 Binary files a/content/posts/2025/04/09/webinar-java-ai/20250428_Java_AI-1024x576.png and /dev/null differ diff --git a/content/posts/2025/04/09/webinar-java-ai/index.md b/content/posts/2025/04/09/webinar-java-ai/index.md index f690a255f..47f9f8826 100644 --- a/content/posts/2025/04/09/webinar-java-ai/index.md +++ b/content/posts/2025/04/09/webinar-java-ai/index.md @@ -46,4 +46,4 @@ Zoran Sevarac, CEO of @Deep Netts, Full Professor at University of Belgrade, Jav ### Moderator Pratik Patel, VP Developer Advocacy at Azul, Java Champion -![](20250428_Java_AI-1024x576.png) +![](20250428_Java_AI-1024x576.jpg) diff --git a/content/posts/2025/04/16/breaktime-tech-talks-ep39-why-embedding-models-should-match-advice-for-starting-a-blog/index.md b/content/posts/2025/04/16/breaktime-tech-talks-ep39-why-embedding-models-should-match-advice-for-starting-a-blog/index.md index a69ed791a..f616eae05 100644 --- a/content/posts/2025/04/16/breaktime-tech-talks-ep39-why-embedding-models-should-match-advice-for-starting-a-blog/index.md +++ b/content/posts/2025/04/16/breaktime-tech-talks-ep39-why-embedding-models-should-match-advice-for-starting-a-blog/index.md @@ -5,7 +5,7 @@ lastmod: "2025-04-22T08:07:51+00:00" description: "This week I talk through my hands-on experience of what happens when embedding models for creating vectors and searching them don’t match." authors: - "jennifer-reif" -image: "techtalks.png" +image: "techtalks.jpg" categories: - "Databases" - "Graph" diff --git a/content/posts/2025/04/16/breaktime-tech-talks-ep39-why-embedding-models-should-match-advice-for-starting-a-blog/techtalks.jpg b/content/posts/2025/04/16/breaktime-tech-talks-ep39-why-embedding-models-should-match-advice-for-starting-a-blog/techtalks.jpg new file mode 100644 index 000000000..6a9995eec Binary files /dev/null and b/content/posts/2025/04/16/breaktime-tech-talks-ep39-why-embedding-models-should-match-advice-for-starting-a-blog/techtalks.jpg differ diff --git a/content/posts/2025/04/16/breaktime-tech-talks-ep39-why-embedding-models-should-match-advice-for-starting-a-blog/techtalks.png b/content/posts/2025/04/16/breaktime-tech-talks-ep39-why-embedding-models-should-match-advice-for-starting-a-blog/techtalks.png deleted file mode 100644 index 2b62105aa..000000000 Binary files a/content/posts/2025/04/16/breaktime-tech-talks-ep39-why-embedding-models-should-match-advice-for-starting-a-blog/techtalks.png and /dev/null differ diff --git a/content/posts/2025/04/16/optimizing-the-garbage-collector-when-migrating-cloud-workloads/arm.jpg b/content/posts/2025/04/16/optimizing-the-garbage-collector-when-migrating-cloud-workloads/arm.jpg new file mode 100644 index 000000000..f8e9ca0c7 Binary files /dev/null and b/content/posts/2025/04/16/optimizing-the-garbage-collector-when-migrating-cloud-workloads/arm.jpg differ diff --git a/content/posts/2025/04/16/optimizing-the-garbage-collector-when-migrating-cloud-workloads/arm.png b/content/posts/2025/04/16/optimizing-the-garbage-collector-when-migrating-cloud-workloads/arm.png deleted file mode 100644 index 73d7ab76d..000000000 Binary files a/content/posts/2025/04/16/optimizing-the-garbage-collector-when-migrating-cloud-workloads/arm.png and /dev/null differ diff --git a/content/posts/2025/04/16/optimizing-the-garbage-collector-when-migrating-cloud-workloads/index.md b/content/posts/2025/04/16/optimizing-the-garbage-collector-when-migrating-cloud-workloads/index.md index 35afec835..238c20eab 100644 --- a/content/posts/2025/04/16/optimizing-the-garbage-collector-when-migrating-cloud-workloads/index.md +++ b/content/posts/2025/04/16/optimizing-the-garbage-collector-when-migrating-cloud-workloads/index.md @@ -5,7 +5,7 @@ lastmod: "2025-04-17T12:57:24+00:00" description: "You might associate Arm primarily with smartphones and the Java-based Android runtime. But no more after this article!" authors: - "kieran-hejmadi" -image: "arm.png" +image: "arm.jpg" categories: - "Arm" - "Cloud" diff --git a/content/posts/2025/04/22/jakarta-ee-11-web-profile-released-enabled-by-eclipse-glassfish/index.md b/content/posts/2025/04/22/jakarta-ee-11-web-profile-released-enabled-by-eclipse-glassfish/index.md index 5822f1e46..bd4750f44 100644 --- a/content/posts/2025/04/22/jakarta-ee-11-web-profile-released-enabled-by-eclipse-glassfish/index.md +++ b/content/posts/2025/04/22/jakarta-ee-11-web-profile-released-enabled-by-eclipse-glassfish/index.md @@ -44,9 +44,9 @@ Jakarta EE 11 Web Profile delivers an updated and streamlined set of specificati As the **first runtime to pass the full TCK**, GlassFish played a critical role in finalizing the Jakarta EE 11 Web Profile specification: -* ![✅](https://s.w.org/images/core/emoji/15.0.3/svg/2705.svg) **Full TCK compliance** for [Jakarta EE 11 Web Profile](https://jakarta.ee/specifications/webprofile/11/) -* ![🧪](https://s.w.org/images/core/emoji/15.0.3/svg/1f9ea.svg) Used to **ratify and validate** the Jakarta EE 11 Web Profile specifications on both [Java 17](https://repo1.maven.org/maven2/org/glassfish/main/distributions/web/8.0.0-JDK17-M10/web-8.0.0-JDK17-M10.zip) and [Java 21](https://repo1.maven.org/maven2/org/glassfish/main/distributions/web/8.0.0-M10/web-8.0.0-M10.zip) -* ![🚀](https://s.w.org/images/core/emoji/15.0.3/svg/1f680.svg) Delivered support for updated APIs across multiple layers of the runtime, even [beyond the scenarios](https://github.com/eclipse-ee4j/glassfish/issues?q=is%3Aissue%20state%3Aclosed%20label%3A8.0) covered by the TCK +* ✅ **Full TCK compliance** for [Jakarta EE 11 Web Profile](https://jakarta.ee/specifications/webprofile/11/) +* 🧪 Used to **ratify and validate** the Jakarta EE 11 Web Profile specifications on both [Java 17](https://repo1.maven.org/maven2/org/glassfish/main/distributions/web/8.0.0-JDK17-M10/web-8.0.0-JDK17-M10.zip) and [Java 21](https://repo1.maven.org/maven2/org/glassfish/main/distributions/web/8.0.0-M10/web-8.0.0-M10.zip) +* 🚀 Delivered support for updated APIs across multiple layers of the runtime, even [beyond the scenarios](https://github.com/eclipse-ee4j/glassfish/issues?q=is%3Aissue%20state%3Aclosed%20label%3A8.0) covered by the TCK ### OmniFish Engineering Contributions diff --git a/content/posts/2025/04/28/improving-mavens-dependencyanalyze-or-not/bafkreibztkdlkhrkyydfdntdkktrdw7qqr4t54m-0653ea62.jpg b/content/posts/2025/04/28/improving-mavens-dependencyanalyze-or-not/bafkreibztkdlkhrkyydfdntdkktrdw7qqr4t54m-0653ea62.jpg new file mode 100644 index 000000000..f97d03d36 Binary files /dev/null and b/content/posts/2025/04/28/improving-mavens-dependencyanalyze-or-not/bafkreibztkdlkhrkyydfdntdkktrdw7qqr4t54m-0653ea62.jpg differ diff --git a/content/posts/2025/04/28/improving-mavens-dependencyanalyze-or-not/index.md b/content/posts/2025/04/28/improving-mavens-dependencyanalyze-or-not/index.md index d70a0360b..d7ce0429f 100644 --- a/content/posts/2025/04/28/improving-mavens-dependencyanalyze-or-not/index.md +++ b/content/posts/2025/04/28/improving-mavens-dependencyanalyze-or-not/index.md @@ -25,7 +25,7 @@ Recently, my good friend Richard Fichtner advised using the `mvn dependency:anal > > It can show you the dependencies you use in your code but have not declared in your pom.xml. This works because you have a transitive dependency on your classpath. Either don't use the dependency or declare it. > -> [![](https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:cc2k5egfzqpf3nbjrs5xox4r/bafkreibztkdlkhrkyydfdntdkktrdw7qqr4t54mbwoazf6rkulcawhqkj4@jpeg)](https://bsky.app/profile/did:plc:cc2k5egfzqpf3nbjrs5xox4r/post/3lcxfnsc2h62m?ref_src=embed) +> [![](bafkreibztkdlkhrkyydfdntdkktrdw7qqr4t54m-0653ea62.jpg)](https://bsky.app/profile/did:plc:cc2k5egfzqpf3nbjrs5xox4r/post/3lcxfnsc2h62m?ref_src=embed) > > — [Richard Fichtner 💻☕ @richard.fichtner.dev](https://bsky.app/profile/did:plc:cc2k5egfzqpf3nbjrs5xox4r?ref_src=embed) > [December 10, 2024 at 2:00 PM](https://bsky.app/profile/did:plc:cc2k5egfzqpf3nbjrs5xox4r/post/3lcxfnsc2h62m?ref_src=embed) diff --git a/content/posts/2025/04/30/javafx-links-of-april-2025/index.md b/content/posts/2025/04/30/javafx-links-of-april-2025/index.md index 9b3ca8f59..afa52943d 100644 --- a/content/posts/2025/04/30/javafx-links-of-april-2025/index.md +++ b/content/posts/2025/04/30/javafx-links-of-april-2025/index.md @@ -5,7 +5,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of April 2025. canonical: "https://webtechie.be/post/2025-04-28-javafx-links-of-april-2025/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2025/04/30/javafx-links-of-april-2025/jfxcentral.jpg b/content/posts/2025/04/30/javafx-links-of-april-2025/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2025/04/30/javafx-links-of-april-2025/jfxcentral.jpg differ diff --git a/content/posts/2025/04/30/javafx-links-of-april-2025/jfxcentral.png b/content/posts/2025/04/30/javafx-links-of-april-2025/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2025/04/30/javafx-links-of-april-2025/jfxcentral.png and /dev/null differ diff --git a/content/posts/2025/04/30/supercharge-your-jakarta-ee-skills-with-these-must-read-guides/index.md b/content/posts/2025/04/30/supercharge-your-jakarta-ee-skills-with-these-must-read-guides/index.md index c787ed4c1..344e2fac9 100644 --- a/content/posts/2025/04/30/supercharge-your-jakarta-ee-skills-with-these-must-read-guides/index.md +++ b/content/posts/2025/04/30/supercharge-your-jakarta-ee-skills-with-these-must-read-guides/index.md @@ -23,7 +23,7 @@ At **Omnifish**, we're proud supporters of the open-source enterprise Java ecosy Let's dive in. -## ![🚀](https://s.w.org/images/core/emoji/15.0.3/svg/1f680.svg) Getting Started with Jakarta EE +## 🚀 Getting Started with Jakarta EE Before building complex enterprise apps, it's important to get the basics right. These starter guides will help you build a solid foundation — with real code examples and clear explanations. @@ -43,7 +43,7 @@ You'll eventually need to persist data — and this guide has you covered. Learn Security is never an afterthought. This guide walks you through adding authentication and authorization to your REST endpoints using Jakarta Security — including how to protect resources and validate user credentials. -## ![🧠](https://s.w.org/images/core/emoji/15.0.3/svg/1f9e0.svg) Understand the Specs Behind the Scenes +## 🧠 Understand the Specs Behind the Scenes Now that you've built something with Jakarta EE, it's time to go deeper. These **specification guides** break down the key technologies behind the platform — not just how to use them, but how they work under the hood. @@ -75,12 +75,12 @@ Want to scale your apps? You need to understand concurrency. This guide covers m Finally, this high-level overview ties everything together — showing how all the specs in Jakarta EE fit into a cohesive platform for building robust, cloud-ready enterprise applications. -## ![📚](https://s.w.org/images/core/emoji/15.0.3/svg/1f4da.svg) Wrap-Up: Learn. Build. Grow. +## 📚 Wrap-Up: Learn. Build. Grow. Jakarta EE is a mature, powerful platform — but it's also approachable, thanks to resources like these. Whether you're just starting out or looking to sharpen your enterprise Java chops, these guides will take you step-by-step from beginner to seasoned developer. And if you're building apps with projects **OmniFish** supports like Piranha Cloud or [GlassFish](https://omnifish.ee/glassfish/), all these technologies are already deeply integrated. That means you can spend less time setting things up, and more time solving real problems. -So grab a coffee ![☕](https://s.w.org/images/core/emoji/15.0.3/svg/2615.svg), open a few tabs, and start exploring what Jakarta EE has to offer. +So grab a coffee ☕, open a few tabs, and start exploring what Jakarta EE has to offer. Happy coding! diff --git a/content/posts/2025/05/05/youre-invited-to-intellij-idea-conf-2025/index.md b/content/posts/2025/05/05/youre-invited-to-intellij-idea-conf-2025/index.md index 47042b537..1b5ce0181 100644 --- a/content/posts/2025/05/05/youre-invited-to-intellij-idea-conf-2025/index.md +++ b/content/posts/2025/05/05/youre-invited-to-intellij-idea-conf-2025/index.md @@ -5,7 +5,7 @@ lastmod: "2025-05-05T13:18:51+00:00" description: "We are excited to invite you to IntelliJ IDEA Conf 2025, a free virtual event." authors: - "marit-van-dijk" -image: "jbconf.png" +image: "jbconf.jpg" categories: - "Developer Tools" - "Events" diff --git a/content/posts/2025/05/05/youre-invited-to-intellij-idea-conf-2025/jbconf.jpg b/content/posts/2025/05/05/youre-invited-to-intellij-idea-conf-2025/jbconf.jpg new file mode 100644 index 000000000..3d159b24f Binary files /dev/null and b/content/posts/2025/05/05/youre-invited-to-intellij-idea-conf-2025/jbconf.jpg differ diff --git a/content/posts/2025/05/05/youre-invited-to-intellij-idea-conf-2025/jbconf.png b/content/posts/2025/05/05/youre-invited-to-intellij-idea-conf-2025/jbconf.png deleted file mode 100644 index e8d61abbb..000000000 Binary files a/content/posts/2025/05/05/youre-invited-to-intellij-idea-conf-2025/jbconf.png and /dev/null differ diff --git a/content/posts/2025/05/06/building-formpilot-my-journey-creating-an-ai-powered-form-filler-with-rag-langchain4j-and-ollama/Screenshot-2025-04-05-at-9.48.13-E2-80-A-5244e7a7.png b/content/posts/2025/05/06/building-formpilot-my-journey-creating-an-ai-powered-form-filler-with-rag-langchain4j-and-ollama/Screenshot-2025-04-05-at-9.48.13-E2-80-A-5244e7a7.png new file mode 100644 index 000000000..614d3d695 Binary files /dev/null and b/content/posts/2025/05/06/building-formpilot-my-journey-creating-an-ai-powered-form-filler-with-rag-langchain4j-and-ollama/Screenshot-2025-04-05-at-9.48.13-E2-80-A-5244e7a7.png differ diff --git a/content/posts/2025/05/06/building-formpilot-my-journey-creating-an-ai-powered-form-filler-with-rag-langchain4j-and-ollama/Screenshot-2025-04-06-at-6.38.24-E2-80-A-48dd9c3b.jpg b/content/posts/2025/05/06/building-formpilot-my-journey-creating-an-ai-powered-form-filler-with-rag-langchain4j-and-ollama/Screenshot-2025-04-06-at-6.38.24-E2-80-A-48dd9c3b.jpg new file mode 100644 index 000000000..f64f11bec Binary files /dev/null and b/content/posts/2025/05/06/building-formpilot-my-journey-creating-an-ai-powered-form-filler-with-rag-langchain4j-and-ollama/Screenshot-2025-04-06-at-6.38.24-E2-80-A-48dd9c3b.jpg differ diff --git a/content/posts/2025/05/06/building-formpilot-my-journey-creating-an-ai-powered-form-filler-with-rag-langchain4j-and-ollama/index.md b/content/posts/2025/05/06/building-formpilot-my-journey-creating-an-ai-powered-form-filler-with-rag-langchain4j-and-ollama/index.md index 05e05c1a3..f9c98d7e8 100644 --- a/content/posts/2025/05/06/building-formpilot-my-journey-creating-an-ai-powered-form-filler-with-rag-langchain4j-and-ollama/index.md +++ b/content/posts/2025/05/06/building-formpilot-my-journey-creating-an-ai-powered-form-filler-with-rag-langchain4j-and-ollama/index.md @@ -99,7 +99,7 @@ ollama list ``` -### ![](https://bazlur.ca/wp-content/uploads/2025/04/Screenshot-2025-04-05-at-9.48.13%E2%80%AFPM-1024x448.png) +### ![](Screenshot-2025-04-05-at-9.48.13-E2-80-A-5244e7a7.png) ### **Part 2: Creating the Spring Boot Project via Spring Initializr** @@ -691,7 +691,7 @@ Then visit `http://localhost:8000/demo/demo-form.html` in your browser. * Click the extension icon in your Chrome toolbar * Right-click on the page and select "Smart Form Filler" from the context menu, then choose "Fill Forms" -![](https://bazlur.ca/wp-content/uploads/2025/04/Screenshot-2025-04-06-at-6.38.24%E2%80%AFPM-713x1024.png) +![](Screenshot-2025-04-06-at-6.38.24-E2-80-A-48dd9c3b.jpg) ## **Testing with a Demo Form** diff --git a/content/posts/2025/05/06/local-ai-with-spring-building-privacy-first-agents-using-ollama/3wm66Vp.md-e5f656a1.png b/content/posts/2025/05/06/local-ai-with-spring-building-privacy-first-agents-using-ollama/3wm66Vp.md-e5f656a1.png new file mode 100644 index 000000000..de63fe785 Binary files /dev/null and b/content/posts/2025/05/06/local-ai-with-spring-building-privacy-first-agents-using-ollama/3wm66Vp.md-e5f656a1.png differ diff --git a/content/posts/2025/05/06/local-ai-with-spring-building-privacy-first-agents-using-ollama/index.md b/content/posts/2025/05/06/local-ai-with-spring-building-privacy-first-agents-using-ollama/index.md index 4814b6a7d..4a7a31cf3 100644 --- a/content/posts/2025/05/06/local-ai-with-spring-building-privacy-first-agents-using-ollama/index.md +++ b/content/posts/2025/05/06/local-ai-with-spring-building-privacy-first-agents-using-ollama/index.md @@ -41,7 +41,7 @@ ollama serve This will spin up a client on your machine and you should see something like below: -[![3wm66Vp.md.png](https://iili.io/3wm66Vp.md.png)](https://freeimage.host/i/3wm66Vp) +[![3wm66Vp.md.png](3wm66Vp.md-e5f656a1.png)](https://freeimage.host/i/3wm66Vp) This means that your Ollama client is up and running, and, it will be accessible on port 11434. diff --git a/content/posts/2025/05/14/building-a-real-time-ai-fraud-detection-system-with-spring-kafka-and-mongodb/AD_4nXfECBrr0rIhDHXp15Bq9Ar87X3rNst_DTzz-d9167cd8.png b/content/posts/2025/05/14/building-a-real-time-ai-fraud-detection-system-with-spring-kafka-and-mongodb/AD_4nXfECBrr0rIhDHXp15Bq9Ar87X3rNst_DTzz-d9167cd8.png new file mode 100644 index 000000000..6866eb84e Binary files /dev/null and b/content/posts/2025/05/14/building-a-real-time-ai-fraud-detection-system-with-spring-kafka-and-mongodb/AD_4nXfECBrr0rIhDHXp15Bq9Ar87X3rNst_DTzz-d9167cd8.png differ diff --git a/content/posts/2025/05/14/building-a-real-time-ai-fraud-detection-system-with-spring-kafka-and-mongodb/AD_4nXftuWZcypBpxatRlnmpzAYft5VBjg7Ek0US-7fe654b5.jpg b/content/posts/2025/05/14/building-a-real-time-ai-fraud-detection-system-with-spring-kafka-and-mongodb/AD_4nXftuWZcypBpxatRlnmpzAYft5VBjg7Ek0US-7fe654b5.jpg new file mode 100644 index 000000000..eeaa75c04 Binary files /dev/null and b/content/posts/2025/05/14/building-a-real-time-ai-fraud-detection-system-with-spring-kafka-and-mongodb/AD_4nXftuWZcypBpxatRlnmpzAYft5VBjg7Ek0US-7fe654b5.jpg differ diff --git a/content/posts/2025/05/14/building-a-real-time-ai-fraud-detection-system-with-spring-kafka-and-mongodb/index.md b/content/posts/2025/05/14/building-a-real-time-ai-fraud-detection-system-with-spring-kafka-and-mongodb/index.md index 030d7a010..d6ce000f4 100644 --- a/content/posts/2025/05/14/building-a-real-time-ai-fraud-detection-system-with-spring-kafka-and-mongodb/index.md +++ b/content/posts/2025/05/14/building-a-real-time-ai-fraud-detection-system-with-spring-kafka-and-mongodb/index.md @@ -37,7 +37,7 @@ Our real-time fraud detection pipeline will work like this: * No similar transactions exist for that user. * Any of the returned similar transactions are already flagged as fraud. -![Diagram showing the architecture of the app](https://lh7-rt.googleusercontent.com/docsz/AD_4nXfECBrr0rIhDHXp15Bq9Ar87X3rNst_DTzzVF_9EmJ-Q7U4Pxi89RsEIdroQm5Et5lvZ-XtQj7K0JeUX_qvk-h7xHXOGTl6CqWkU0CjxyveFR7FogazKF4vEmJWoWtY7fIIzLUtbg?key=80Ot0rEJoJhzoI8RA3iUIw) +![Diagram showing the architecture of the app](AD_4nXfECBrr0rIhDHXp15Bq9Ar87X3rNst_DTzz-d9167cd8.png) This pipeline ensures real-time anomaly detection using AI-powered embeddings and vector search. @@ -65,7 +65,7 @@ For this simple demo, we are just going to create basic collections because, as We are going to create a [vector search index](https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-overview/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=Tim-foojay&utm_term=megan.grant) on our transactions collection. This will allow us to find semantically similar documents, to help us identify anomalies in our customer transactions, and mark these as fraud. How does this work? Well, we create [vector embeddings](https://www.mongodb.com/resources/basics/vector-embeddings/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=Tim-foojay&utm_term=megan.grant) (numerical representations of our data) of our transactions, to store in our vector store, the transactions collection. We get these by sending the information from our transactions to an embedding model, like OpenAI's text-embedding-3-small. These embeddings look like an array of floating point numbers, e.g., \[2.0457, -3.1417895, ...\]. -![Diagram showing how vector embeddings are created](https://lh7-rt.googleusercontent.com/docsz/AD_4nXftuWZcypBpxatRlnmpzAYft5VBjg7Ek0USF5zTry7RSP7xYARX586r_0pFKP-bo-a3PP4t0MysGJXODL4b6n2HYIxWoCzL03tObSj0Pa6vZvQN3OE7oPpTEHBc26vdLjfV-r6diA?key=80Ot0rEJoJhzoI8RA3iUIw) +![Diagram showing how vector embeddings are created](AD_4nXftuWZcypBpxatRlnmpzAYft5VBjg7Ek0US-7fe654b5.jpg) We then use MongoDB's Atlas Vector Search, which uses a nearest neighbour algorithm to decide what transactions are semantically similar. These transactions are returned, and if the new transaction does not match any past transactions for that user, or if it matches transactions marked fraud, it could be an anomaly (potential fraud). diff --git a/content/posts/2025/05/16/what-is-rag-and-how-to-secure-it/Screenshot_2025-04-17_at_10.56.16_AM_j9y-22832cfa.png b/content/posts/2025/05/16/what-is-rag-and-how-to-secure-it/Screenshot_2025-04-17_at_10.56.16_AM_j9y-22832cfa.png new file mode 100644 index 000000000..0daf33f99 Binary files /dev/null and b/content/posts/2025/05/16/what-is-rag-and-how-to-secure-it/Screenshot_2025-04-17_at_10.56.16_AM_j9y-22832cfa.png differ diff --git a/content/posts/2025/05/16/what-is-rag-and-how-to-secure-it/index.md b/content/posts/2025/05/16/what-is-rag-and-how-to-secure-it/index.md index 6245935fa..4a82d98b5 100644 --- a/content/posts/2025/05/16/what-is-rag-and-how-to-secure-it/index.md +++ b/content/posts/2025/05/16/what-is-rag-and-how-to-secure-it/index.md @@ -68,7 +68,7 @@ These embeddings are stored in a **vector database**. When a user asks a questio ### 2. Generation The most relevant content is retrieved and combined with the original question to form a complete prompt. This prompt is then passed to the language model, such as GPT-4 or Claude, which uses this context to generate a response that is better in line with your intentions. -![Diagram illustrating the Retrieval-Augmented Generation (RAG) process for language models.](https://res.cloudinary.com/snyk/image/upload/f_auto,w_2560,q_auto/v1744901930/Screenshot_2025-04-17_at_10.56.16_AM_j9yhif.png) +![Diagram illustrating the Retrieval-Augmented Generation (RAG) process for language models.](Screenshot_2025-04-17_at_10.56.16_AM_j9y-22832cfa.png) *Image Source: docs.langchain4j.dev* diff --git a/content/posts/2025/05/19/join-the-nljug-jspring-conference-on-thursday-june-5/index.md b/content/posts/2025/05/19/join-the-nljug-jspring-conference-on-thursday-june-5/index.md index d36fd22bc..c9492e9dc 100644 --- a/content/posts/2025/05/19/join-the-nljug-jspring-conference-on-thursday-june-5/index.md +++ b/content/posts/2025/05/19/join-the-nljug-jspring-conference-on-thursday-june-5/index.md @@ -20,7 +20,7 @@ frozen: false **Join the Dutch Java community at [J-Spring 2025](https://jspring.nl/), the premier Java conference in the Netherlands, taking place Thursday, June 5th at Jaarbeurs Utrecht.** This international event, organized by the NLJUG (Dutch Java User Group), will be bigger than ever before, offering attendees [a comprehensive program](https://jspring.nl/timetable-2025/) featuring world-class speakers from across the globe. Dive deep into the world of Java with expert speakers from leading tech companies such as Uber, Spotify, Azul, Oracle and more, guaranteeing captivating talks and valuable industry insights. -[![](nljugjspring2025-1024x576.png)](https://jspring.nl) +[![](nljugjspring2025-1024x576.jpg)](https://jspring.nl) J-Spring 2025 aims to create a truly community-driven conference where developers can learn new techniques, share knowledge, and network with peers. The program will cover essential Java-related topics across various tracks including **Architecture, Dev Practices, Security, UX \& UI, and emerging** technologies. Whether you're interested in technical sessions, hands-on labs, or keynote presentations, this event offers a perfect blend of practical knowledge and theoretical insights to enhance your Java development skills. diff --git a/content/posts/2025/05/19/join-the-nljug-jspring-conference-on-thursday-june-5/nljugjspring2025-1024x576.jpg b/content/posts/2025/05/19/join-the-nljug-jspring-conference-on-thursday-june-5/nljugjspring2025-1024x576.jpg new file mode 100644 index 000000000..9df1e0720 Binary files /dev/null and b/content/posts/2025/05/19/join-the-nljug-jspring-conference-on-thursday-june-5/nljugjspring2025-1024x576.jpg differ diff --git a/content/posts/2025/05/19/join-the-nljug-jspring-conference-on-thursday-june-5/nljugjspring2025-1024x576.png b/content/posts/2025/05/19/join-the-nljug-jspring-conference-on-thursday-june-5/nljugjspring2025-1024x576.png deleted file mode 100644 index 642d38572..000000000 Binary files a/content/posts/2025/05/19/join-the-nljug-jspring-conference-on-thursday-june-5/nljugjspring2025-1024x576.png and /dev/null differ diff --git a/content/posts/2025/05/29/testing-mongodb-atlas-search-java-apps-using-testcontainers/AD_4nXdH3ab-XATCrN5-LLJCvpbECaU-yIa91oAv-b11f2b07.jpg b/content/posts/2025/05/29/testing-mongodb-atlas-search-java-apps-using-testcontainers/AD_4nXdH3ab-XATCrN5-LLJCvpbECaU-yIa91oAv-b11f2b07.jpg new file mode 100644 index 000000000..5ce4e762a Binary files /dev/null and b/content/posts/2025/05/29/testing-mongodb-atlas-search-java-apps-using-testcontainers/AD_4nXdH3ab-XATCrN5-LLJCvpbECaU-yIa91oAv-b11f2b07.jpg differ diff --git a/content/posts/2025/05/29/testing-mongodb-atlas-search-java-apps-using-testcontainers/AD_4nXdlQGT-Gx9KjXh62fBIazUC4WwMXa3Ti-NV-6b33b0f0.png b/content/posts/2025/05/29/testing-mongodb-atlas-search-java-apps-using-testcontainers/AD_4nXdlQGT-Gx9KjXh62fBIazUC4WwMXa3Ti-NV-6b33b0f0.png new file mode 100644 index 000000000..37cf7f5f0 Binary files /dev/null and b/content/posts/2025/05/29/testing-mongodb-atlas-search-java-apps-using-testcontainers/AD_4nXdlQGT-Gx9KjXh62fBIazUC4WwMXa3Ti-NV-6b33b0f0.png differ diff --git a/content/posts/2025/05/29/testing-mongodb-atlas-search-java-apps-using-testcontainers/index.md b/content/posts/2025/05/29/testing-mongodb-atlas-search-java-apps-using-testcontainers/index.md index 0ebf6057b..240ca5a09 100644 --- a/content/posts/2025/05/29/testing-mongodb-atlas-search-java-apps-using-testcontainers/index.md +++ b/content/posts/2025/05/29/testing-mongodb-atlas-search-java-apps-using-testcontainers/index.md @@ -37,7 +37,7 @@ Mongot has two responsibilities: * First, it follows the change stream of any collection you choose to index and builds Lucene indexes asynchronously. * Second, when you run the $search aggregation stage in a MongoDB query, mongot will be invoked to perform a Lucene query on the index and return a stream of document ids for further processing and data retrieval. -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdH3ab-XATCrN5-LLJCvpbECaU-yIa91oAvqb0TmfmYlyEgp--tM6m3g11X-gZBA2zFm82mkBt1Rv1OCFgsgQqkTYplnfzTCqSvYhKsR1_qn5zWgA-eJWccH3QxMBg_XVCtg4VOTg?key=xtuklWIXthgOT-_RVHPDsg) +![](AD_4nXdH3ab-XATCrN5-LLJCvpbECaU-yIa91oAv-b11f2b07.jpg) Lucene and MongoDB Atlas Search support many index types which are very different to the excellent, efficient, and super-fast [b-tree based MongoDB indexes](https://www.mongodb.com/docs/manual/indexes/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=Testing+MongoDB+Atlas+Search+Java+Apps+Using+TestContainers&utm_term=megan.grant#details). @@ -583,7 +583,7 @@ mongoDBContainer.execInContainer(ExecConfig.builder() ### Loading a *mongodump* BSON database and index Let's create some seed data and MongoDB Atlas Search indexes, which we'll store in a resource directory /seed-data. -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdlQGT-Gx9KjXh62fBIazUC4WwMXa3Ti--NVjGkt3YqlpAsQoIpGl_rQiqtz7Db-xAgDfYx71au5tzv3yIO35ipy04k7I_f4wkepw2RoSM-qdeBF59W_0A1YbeOce3zcvzqzEiH_g?key=xtuklWIXthgOT-_RVHPDsg) +![](AD_4nXdlQGT-Gx9KjXh62fBIazUC4WwMXa3Ti-NV-6b33b0f0.png) I've built a little test dataset of 15,000 Person documents in MongoDB and used mongodump to export it. Just for fun, I used a [local LLM](https://github.com/luketn/generate-person-data) to generate it. diff --git a/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXcOj9vfq5QasaTLeQUSk7c34967Gb6gx-5e-d6b1b001.png b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXcOj9vfq5QasaTLeQUSk7c34967Gb6gx-5e-d6b1b001.png new file mode 100644 index 000000000..561810212 Binary files /dev/null and b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXcOj9vfq5QasaTLeQUSk7c34967Gb6gx-5e-d6b1b001.png differ diff --git a/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXcR84k2iNjH2EWBYN1LO_l8rpl5EB21_blp-d09027b5.png b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXcR84k2iNjH2EWBYN1LO_l8rpl5EB21_blp-d09027b5.png new file mode 100644 index 000000000..205df47e6 Binary files /dev/null and b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXcR84k2iNjH2EWBYN1LO_l8rpl5EB21_blp-d09027b5.png differ diff --git a/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXcSbbNxObiIqzkcDI2CSRLj5Wnca7Kt-YHn-3e9d1455.jpg b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXcSbbNxObiIqzkcDI2CSRLj5Wnca7Kt-YHn-3e9d1455.jpg new file mode 100644 index 000000000..4f0890dac Binary files /dev/null and b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXcSbbNxObiIqzkcDI2CSRLj5Wnca7Kt-YHn-3e9d1455.jpg differ diff --git a/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXdFz3jXmgLdtmqrghO4R5PU2e9utpTP82p2-45d6c28b.png b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXdFz3jXmgLdtmqrghO4R5PU2e9utpTP82p2-45d6c28b.png new file mode 100644 index 000000000..fe1db9362 Binary files /dev/null and b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXdFz3jXmgLdtmqrghO4R5PU2e9utpTP82p2-45d6c28b.png differ diff --git a/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXdadu97agADtWToJ1Fb06p0v8GtfTqBv360-6f9ddea6.jpg b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXdadu97agADtWToJ1Fb06p0v8GtfTqBv360-6f9ddea6.jpg new file mode 100644 index 000000000..1812ecc08 Binary files /dev/null and b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXdadu97agADtWToJ1Fb06p0v8GtfTqBv360-6f9ddea6.jpg differ diff --git a/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXdc1t53Ju-31AtsUVbkEHGYjukOOcrcWxFL-463b6d4f.jpg b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXdc1t53Ju-31AtsUVbkEHGYjukOOcrcWxFL-463b6d4f.jpg new file mode 100644 index 000000000..9be8d527d Binary files /dev/null and b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXdc1t53Ju-31AtsUVbkEHGYjukOOcrcWxFL-463b6d4f.jpg differ diff --git a/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXdfpsNuQXEs_FfFCzSkl8ge3vTCdMC2XyI7-bc2cc101.png b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXdfpsNuQXEs_FfFCzSkl8ge3vTCdMC2XyI7-bc2cc101.png new file mode 100644 index 000000000..1bd445b3b Binary files /dev/null and b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXdfpsNuQXEs_FfFCzSkl8ge3vTCdMC2XyI7-bc2cc101.png differ diff --git a/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXdwRWOIsd5Ojljil2DoUI9s50TqbpG8EcDt-3190940a.jpg b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXdwRWOIsd5Ojljil2DoUI9s50TqbpG8EcDt-3190940a.jpg new file mode 100644 index 000000000..fb5b6c97e Binary files /dev/null and b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXdwRWOIsd5Ojljil2DoUI9s50TqbpG8EcDt-3190940a.jpg differ diff --git a/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXe6lCZqHaNq1k3HWfjb1Jf6xLFFQyX7-JZA-9b010303.png b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXe6lCZqHaNq1k3HWfjb1Jf6xLFFQyX7-JZA-9b010303.png new file mode 100644 index 000000000..38b62a0e9 Binary files /dev/null and b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXe6lCZqHaNq1k3HWfjb1Jf6xLFFQyX7-JZA-9b010303.png differ diff --git a/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXeaqRSFqPlMVJdJXwBrdva4a5YHiCzV9XDM-30fa9c93.png b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXeaqRSFqPlMVJdJXwBrdva4a5YHiCzV9XDM-30fa9c93.png new file mode 100644 index 000000000..e05608e89 Binary files /dev/null and b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXeaqRSFqPlMVJdJXwBrdva4a5YHiCzV9XDM-30fa9c93.png differ diff --git a/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXevPQ03ftq_gYGoR7LsFT9zrACMkckkFqnK-77353935.jpg b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXevPQ03ftq_gYGoR7LsFT9zrACMkckkFqnK-77353935.jpg new file mode 100644 index 000000000..60c8bde85 Binary files /dev/null and b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXevPQ03ftq_gYGoR7LsFT9zrACMkckkFqnK-77353935.jpg differ diff --git a/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXfFi_tpV133_o_NcWdaXwsAvWrrElDw_sbR-8f23ace4.jpg b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXfFi_tpV133_o_NcWdaXwsAvWrrElDw_sbR-8f23ace4.jpg new file mode 100644 index 000000000..f561db638 Binary files /dev/null and b/content/posts/2025/05/30/brokk-for-java-developers/AD_4nXfFi_tpV133_o_NcWdaXwsAvWrrElDw_sbR-8f23ace4.jpg differ diff --git a/content/posts/2025/05/30/brokk-for-java-developers/index.md b/content/posts/2025/05/30/brokk-for-java-developers/index.md index b113eb74f..1f872bb22 100644 --- a/content/posts/2025/05/30/brokk-for-java-developers/index.md +++ b/content/posts/2025/05/30/brokk-for-java-developers/index.md @@ -38,7 +38,7 @@ Brokk is built with Java Swing for the UI, [Joern](https://docs.joern.io/) for a When you start Brokk, you'll see five main areas: -![Brokk Interface Overview](https://lh7-rt.googleusercontent.com/docsz/AD_4nXcSbbNxObiIqzkcDI2CSRLj5Wnca7Kt-YHnokuKoMD-BWtBqE9U09viBQI_2Weds_XsDu8USUPO26fgxyincMI5apjNHG8z9Dij_TQkq9l73XqLelI9v96ZseE5wK-NFWcHSLpZ2A?key=uP1lqs1lPqiVB7uD01Ypkg) +![Brokk Interface Overview](AD_4nXcSbbNxObiIqzkcDI2CSRLj5Wnca7Kt-YHn-3e9d1455.jpg) *Brokk main interface showing the five key areas: Instructions panel on the left, Output panel in the center, Activity panel on the right, Workspace panel on the far right, and Git panel at the bottom* From left to right, starting at the top, these are: @@ -51,7 +51,7 @@ From left to right, starting at the top, these are: The Workspace is the core of Brokk's approach to managing context. Here's an example of (most of) the different types of context that Brokk can manipulate: -![Workspace Context Types](https://lh7-rt.googleusercontent.com/docsz/AD_4nXevPQ03ftq_gYGoR7LsFT9zrACMkckkFqnKdEkIAgFSDvdOkRsTnK-gvNu-3_KladCH0Es9YBAZjS8l-oROYIAexWljFVrvGzULcrROE0fVgtw1nP2lPdFRrD91ie9wtR2VpndwVg?key=uP1lqs1lPqiVB7uD01Ypkg) +![Workspace Context Types](AD_4nXevPQ03ftq_gYGoR7LsFT9zrACMkckkFqnK-77353935.jpg) *Workspace panel showing various types of context including image files, source files, library summaries, stacktraces, Git diffs, documentation, and method usages* From top to bottom, these are: @@ -70,14 +70,14 @@ You can right-click on any of the referenced files on the right to add them indi Brokk also enriches context with what it knows about your code. Here, I've double-clicked on the stacktrace (on the left) and the getTrackedFiles usages (on the right) to show their contents: -![Context Enrichment](https://lh7-rt.googleusercontent.com/docsz/AD_4nXcR84k2iNjH2EWBYN1LO_l8rpl5EB21_blpQNXorhRI-4otDCYsyjV_X1aYVqbV8dEXbVz-KnfG0P8SmtdH9FAwtaS2MI8Gsq1fxSKDfJqjZ6hOVYuyp57JShpLVULorl6r515nNQ?key=uP1lqs1lPqiVB7uD01Ypkg) +![Context Enrichment](AD_4nXcR84k2iNjH2EWBYN1LO_l8rpl5EB21_blp-d09027b5.png) *Split view showing expanded stacktrace details on the left with full source code of methods in the stack, and expanded method usages on the right showing calling method source code* For the stacktrace, Brokk includes the full source of any method in your project. For the usages, it similarly shows not just the call site but the source of each calling method. This lets Brokk perform refactoring across your codebase without having to load entire files into the Workspace. Smaller contexts mean faster and cheaper calls to the LLM. The other main tool that Brokk uses to slim down the Workspace is summarization. Here is what a Brokk summary of a source file looks like: -![File Summarization](https://lh7-rt.googleusercontent.com/docsz/AD_4nXeaqRSFqPlMVJdJXwBrdva4a5YHiCzV9XDMkopZIS8uq3VRTRVkfogN-V5EgEqO5JlDO6RarVMQYdV1DmnR9ZW9s4nIk4Oynp_Gk8xRdKx7k_pRTv_Ly955P9jvR-b5ZdBuIHp6dA?key=uP1lqs1lPqiVB7uD01Ypkg) +![File Summarization](AD_4nXeaqRSFqPlMVJdJXwBrdva4a5YHiCzV9XDM-30fa9c93.png) *Example of Brokk's file summarization showing class signatures, method declarations, and private fields without full implementation details* Brokk extracts the signatures and declarations to show the LLM how to use this class without hallucinating. Brokk also includes private fields and methods to give a hint of how the implementation works under the hood. This means that you almost never need to include full source files in the Workspace unless they are going to be actively edited. @@ -88,12 +88,12 @@ Brokk's goal is to make context management *explicit* (you always know what's in We already covered how Brokk links referenced files in the Workspace so you can easily add related code. Brokk also offers similar recommendations as you type your instructions in realtime. -![Quick Context Recommendations](https://lh7-rt.googleusercontent.com/docsz/AD_4nXe6lCZqHaNq1k3HWfjb1Jf6xLFFQyX7-JZAJfiVdQf_-J0IyvAoeJAoEV06J2ytgG1Ls8O3YEnS_Kugavngyd3kFqne4-u_n9rZ0jDG1RjaO8fzIQ88y-Age8Xt1CyZhzFkTyAoXA?key=uP1lqs1lPqiVB7uD01Ypkg) +![Quick Context Recommendations](AD_4nXe6lCZqHaNq1k3HWfjb1Jf6xLFFQyX7-JZA-9b010303.png) *Quick Context recommendations panel showing suggested files to add to the workspace based on the current instruction being typed* This is called Quick Context, and it's optimized for speed. If you want to trade that speed away for a more in-depth analysis, click on Deep Scan: -![Deep Scan Results](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdwRWOIsd5Ojljil2DoUI9s50TqbpG8EcDtY-gkl1b-ueedX9M-sA4zBClkmmvkp3TOqz6Fm_PJNK4CsZheVIB1V3OnWQ-ruDDbxoq8cWsrI5gEa8TrD-inP_UnK4_9VxLJw1z1fA?key=uP1lqs1lPqiVB7uD01Ypkg) +![Deep Scan Results](AD_4nXdwRWOIsd5Ojljil2DoUI9s50TqbpG8EcDt-3190940a.jpg) *Deep Scan results dialog showing recommended files for a serialization refactor task, with options to Edit, Summarize, or Add files to the workspace* This is a solid set of recommendations for the serialization refactor, although not perfect; I would change Json.java and ContextFragment.java from Summarize to Edit. @@ -102,14 +102,14 @@ This is a solid set of recommendations for the serialization refactor, although The Git Panel, located at the bottom of the Brokk interface, is your primary interface to bring Git-based historical context into the Workspace. It's divided into two main tabs: Log and Commit. The Commit tab is fairly self-explanatory, so we'll focus on the operations available in the Log. -![Git Panel](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdfpsNuQXEs_FfFCzSkl8ge3vTCdMC2XyI7Ch-wqQFyGj2p7F1_V2kzwD_Oq5KUdFAJDItzjB7t4RF-pMI-B8P1bpgjHboyUhxN3e9-6SFrqsNpgzp2Myn70zyPMu5YuWgQnXn6ow?key=uP1lqs1lPqiVB7uD01Ypkg) +![Git Panel](AD_4nXdfpsNuQXEs_FfFCzSkl8ge3vTCdMC2XyI7-bc2cc101.png) *Git Log panel showing commit history with right-click context menu options for capturing diffs and viewing file revisions* * **Capture Diff:** This is the most commonly used integration point, useful for asking questions, troubleshooting regressions, and performing merges. * **How it works:** Right-click any set of commits or file changes, in the log and select Capture Diff. This adds a unified diff of the selected changes to your Workspace. * **Best for:** Providing the LLM with focused context about a past bug fix, feature implementation, or refactor. You can also right-click on the diff to add all (or some) of the affected files to the Workspace in their entirety or as summaries. -![Git Diff Context](https://lh7-rt.googleusercontent.com/docsz/AD_4nXfFi_tpV133_o_NcWdaXwsAvWrrElDw_sbRBP5QI8mzl9S2RRzBCMrvVRDMX4s_sDfpOggoRLLLjqmVAdigEnUrfstYgzyOYvv5aymxlj-vjVy8-nR6nmlPO_6URp3SnJSbcjgR?key=uP1lqs1lPqiVB7uD01Ypkg) +![Git Diff Context](AD_4nXfFi_tpV133_o_NcWdaXwsAvWrrElDw_sbR-8f23ace4.jpg) *Git diff context menu showing options to add affected files to workspace as summaries or full files* * **Capturing Older Revisions:** Primarily used to give the LLM an anchor point for a particularly complex diff. @@ -147,10 +147,10 @@ The Instructions panel is where you provide your textual input to Brokk. The but Brokk allows configuring both default models for each of the main actions, and a selection of commonly-used overrides. This allows the best of both worlds with a default you use most frequently, without having to reconfigure things (or worse, restart) when you want to use a different option. -![Model Configuration 1](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdc1t53Ju-31AtsUVbkEHGYjukOOcrcWxFLLw1wk_3vIIgMe5rwnNluJEMVHoFrMV3I80hkMtZrBUZV1mcMPL64ogawAu8hYDxtbM4qYMRkN4C0ca0jkIGHQIMvwLD5lsq6WmgJsQ?key=uP1lqs1lPqiVB7uD01Ypkg) +![Model Configuration 1](AD_4nXdc1t53Ju-31AtsUVbkEHGYjukOOcrcWxFL-463b6d4f.jpg) *Model configuration dialog showing default model settings for different actions like Code, Ask, Search, and Architect* -![Model Configuration 2](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdadu97agADtWToJ1Fb06p0v8GtfTqBv3606NLDo-sD7M-0XSmEAbZ3IYCjZCt71fpqYz05cwnYWF-JUnpiU_WWTPjVIiZmgncnOauw4YnBEjX_-E6c6q2FReygI0ztPqxSatI67A?key=uP1lqs1lPqiVB7uD01Ypkg) +![Model Configuration 2](AD_4nXdadu97agADtWToJ1Fb06p0v8GtfTqBv360-6f9ddea6.jpg) *Model override selection interface showing commonly-used model options for quick switching without reconfiguration* See [this article](https://brokk.ai/blog/the-best-llm-for-code) for more on how to choose which models to use. @@ -163,14 +163,14 @@ To do this effectively, Brokk asks the LLM to infer details about your build whe By default, Brokk runs only the tests in the Workspace after each set of changes to your code; if your test suite runs quickly enough, you can change that to run all tests instead, in `File -> Settings -> Build`: -![Build Settings](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdFz3jXmgLdtmqrghO4R5PU2e9utpTP82p2SvCmwO4Ee84cGIKkAJozfBAWLeHA_OCF4MUkE2hkoocLbzbA9dzsC16pq4kIAg7aP8k4s4Y-zzGkMH19HfZoq6CEixt0oNNVmJrDnw?key=uP1lqs1lPqiVB7uD01Ypkg) +![Build Settings](AD_4nXdFz3jXmgLdtmqrghO4R5PU2e9utpTP82p2-45d6c28b.png) *Build settings dialog showing options for test execution, including running only workspace tests vs all tests, and custom shell command configuration* You can also (ab)use the Run All Tests option to specify an arbitrary shell command; any non-zero exit code will be treated as a failure and sent to the coding LLM for revision. For example, when I was debugging tree-sitter parsing I changed it to `tree-sitter query … && sbt "testOnly …"` The Activity panel is designed to allow you to solve side quests, like a quick refactor or a bug fix, and come back to where you were without losing your flow or confusing the AI with irrelevant context. There are three options when you right-click on an earlier state: -![Activity History Options](https://lh7-rt.googleusercontent.com/docsz/AD_4nXcOj9vfq5QasaTLeQUSk7c34967Gb6gx-5ei4nEflx4LT5RDGFOXpy3WuYmfZBL3Z7v9yoLtI1MGh9vKbnfKrHn2kfmnMEItb1QlJRJ9K2dGFyWJFRW3Wh3jSBPibboEllT-wzc?key=uP1lqs1lPqiVB7uD01Ypkg) +![Activity History Options](AD_4nXcOj9vfq5QasaTLeQUSk7c34967Gb6gx-5e-d6b1b001.png) *Activity history context menu showing three options: Undo to Here, Copy Workspace, and Copy Workspace with History* 1. **Undo to Here**: This action reverts both your file changes on disk and the Workspace to the state they were in at that selected point in history. Any file modifications made after that point will be undone. (But Git history is not touched.) diff --git a/content/posts/2025/06/01/javafx-links-of-may-2025/index.md b/content/posts/2025/06/01/javafx-links-of-may-2025/index.md index 423ccbc80..4db7e6a3a 100644 --- a/content/posts/2025/06/01/javafx-links-of-may-2025/index.md +++ b/content/posts/2025/06/01/javafx-links-of-may-2025/index.md @@ -5,7 +5,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of April 2025. canonical: "https://webtechie.be/post/2025-05-30-javafx-links-of-may-2025/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2025/06/01/javafx-links-of-may-2025/jfxcentral.jpg b/content/posts/2025/06/01/javafx-links-of-may-2025/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2025/06/01/javafx-links-of-may-2025/jfxcentral.jpg differ diff --git a/content/posts/2025/06/01/javafx-links-of-may-2025/jfxcentral.png b/content/posts/2025/06/01/javafx-links-of-may-2025/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2025/06/01/javafx-links-of-may-2025/jfxcentral.png and /dev/null differ diff --git a/content/posts/2025/06/11/performance-best-practise-no-1-optimize-database-operations/image-1.jpg b/content/posts/2025/06/11/performance-best-practise-no-1-optimize-database-operations/image-1.jpg new file mode 100644 index 000000000..ac6807be7 Binary files /dev/null and b/content/posts/2025/06/11/performance-best-practise-no-1-optimize-database-operations/image-1.jpg differ diff --git a/content/posts/2025/06/11/performance-best-practise-no-1-optimize-database-operations/image-1.png b/content/posts/2025/06/11/performance-best-practise-no-1-optimize-database-operations/image-1.png deleted file mode 100644 index f89fce53e..000000000 Binary files a/content/posts/2025/06/11/performance-best-practise-no-1-optimize-database-operations/image-1.png and /dev/null differ diff --git a/content/posts/2025/06/11/performance-best-practise-no-1-optimize-database-operations/index.md b/content/posts/2025/06/11/performance-best-practise-no-1-optimize-database-operations/index.md index 64a60f44b..505b16fd7 100644 --- a/content/posts/2025/06/11/performance-best-practise-no-1-optimize-database-operations/index.md +++ b/content/posts/2025/06/11/performance-best-practise-no-1-optimize-database-operations/index.md @@ -48,7 +48,7 @@ JDBC statement caching involves storing frequently executed SQL statements, such ### Connection pool configuration You can configure connection pools in the Admin Console as follows: -![](blog-conn-pool-size-idle.png) ![](image-1.png) +![](blog-conn-pool-size-idle.png) ![](image-1.jpg) Or set the following properties (using the `set` admin command or as Embedded GlassFish properties): diff --git a/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/index.md b/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/index.md index 2e8330fb8..de3be9ae5 100644 --- a/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/index.md +++ b/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/index.md @@ -123,8 +123,8 @@ understanding_readynow_tier2_with_readynow-1024x547.png The chart with the code waiting in a queue to be compiled also shows a big difference. In the first run, we can see a huge spike starting at around second 26, when the actual Dacapo-test starts, which causes a lot of load on the application. Thanks to the profile log, this queue is moved to the start of the application. As described before, ReadyNow uses the decisions of the previous run to immediately compile most of the native code and have it available when needed. As a result, we only see a small peak at 26 seconds. {{< gallery >}} -understanding_readynow_compiler_queu_no_readynow-1-1024x547.png -understanding_readynow_compiler_queu_with_readynow-1-1024x547.png +understanding_readynow_compiler_queu_no_readynow-1-1024x547.jpg +understanding_readynow_compiler_queu_with_readynow-1-1024x547.jpg {{< /gallery >}} ## Conclusion diff --git a/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/understanding_readynow_compiler_queu_no_readynow-1-1024x547.jpg b/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/understanding_readynow_compiler_queu_no_readynow-1-1024x547.jpg new file mode 100644 index 000000000..2a5334ba5 Binary files /dev/null and b/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/understanding_readynow_compiler_queu_no_readynow-1-1024x547.jpg differ diff --git a/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/understanding_readynow_compiler_queu_no_readynow-1-1024x547.png b/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/understanding_readynow_compiler_queu_no_readynow-1-1024x547.png deleted file mode 100644 index 922027f7e..000000000 Binary files a/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/understanding_readynow_compiler_queu_no_readynow-1-1024x547.png and /dev/null differ diff --git a/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/understanding_readynow_compiler_queu_with_readynow-1-1024x547.jpg b/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/understanding_readynow_compiler_queu_with_readynow-1-1024x547.jpg new file mode 100644 index 000000000..f00117a3c Binary files /dev/null and b/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/understanding_readynow_compiler_queu_with_readynow-1-1024x547.jpg differ diff --git a/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/understanding_readynow_compiler_queu_with_readynow-1-1024x547.png b/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/understanding_readynow_compiler_queu_with_readynow-1-1024x547.png deleted file mode 100644 index c48118500..000000000 Binary files a/content/posts/2025/06/13/how-readynow-improves-java-warmup-time/understanding_readynow_compiler_queu_with_readynow-1-1024x547.png and /dev/null differ diff --git a/content/posts/2025/06/16/foojay-podcast-73/episode-73-jcon-part-2.jpg b/content/posts/2025/06/16/foojay-podcast-73/episode-73-jcon-part-2.jpg new file mode 100644 index 000000000..b341c3c54 Binary files /dev/null and b/content/posts/2025/06/16/foojay-podcast-73/episode-73-jcon-part-2.jpg differ diff --git a/content/posts/2025/06/16/foojay-podcast-73/episode-73-jcon-part-2.png b/content/posts/2025/06/16/foojay-podcast-73/episode-73-jcon-part-2.png deleted file mode 100644 index 00560194b..000000000 Binary files a/content/posts/2025/06/16/foojay-podcast-73/episode-73-jcon-part-2.png and /dev/null differ diff --git a/content/posts/2025/06/16/foojay-podcast-73/index.md b/content/posts/2025/06/16/foojay-podcast-73/index.md index 6ef101eb4..8cf871c47 100644 --- a/content/posts/2025/06/16/foojay-podcast-73/index.md +++ b/content/posts/2025/06/16/foojay-podcast-73/index.md @@ -10,7 +10,7 @@ authors: - "jens-knipper" - "karl-heinz-marbaise" - "miro-wengner" -image: "episode-73-jcon-part-2.png" +image: "episode-73-jcon-part-2.jpg" categories: - "Java" - "Java Core" diff --git a/content/posts/2025/06/19/multi-cloud-strategies-with-mongodb-atlas/AD_4nXdVG2u0jyq6NHuZlKPDTKhpvSLBGnx-OlZc-223683ca.png b/content/posts/2025/06/19/multi-cloud-strategies-with-mongodb-atlas/AD_4nXdVG2u0jyq6NHuZlKPDTKhpvSLBGnx-OlZc-223683ca.png new file mode 100644 index 000000000..96485f175 Binary files /dev/null and b/content/posts/2025/06/19/multi-cloud-strategies-with-mongodb-atlas/AD_4nXdVG2u0jyq6NHuZlKPDTKhpvSLBGnx-OlZc-223683ca.png differ diff --git a/content/posts/2025/06/19/multi-cloud-strategies-with-mongodb-atlas/AD_4nXeNRKpE7oevY6xtrhkRhfIsizzDXqyPkdWw-75c32b1c.png b/content/posts/2025/06/19/multi-cloud-strategies-with-mongodb-atlas/AD_4nXeNRKpE7oevY6xtrhkRhfIsizzDXqyPkdWw-75c32b1c.png new file mode 100644 index 000000000..fed290209 Binary files /dev/null and b/content/posts/2025/06/19/multi-cloud-strategies-with-mongodb-atlas/AD_4nXeNRKpE7oevY6xtrhkRhfIsizzDXqyPkdWw-75c32b1c.png differ diff --git a/content/posts/2025/06/19/multi-cloud-strategies-with-mongodb-atlas/index.md b/content/posts/2025/06/19/multi-cloud-strategies-with-mongodb-atlas/index.md index e9c017c98..0fcb68148 100644 --- a/content/posts/2025/06/19/multi-cloud-strategies-with-mongodb-atlas/index.md +++ b/content/posts/2025/06/19/multi-cloud-strategies-with-mongodb-atlas/index.md @@ -45,11 +45,11 @@ Setting up a new cluster in MongoDB Atlas to be multi-cloud is very simple but l 1. Inside MongoDB Atlas, click the button to create a new cluster. 2. In the new cluster wizard, ensure you toggle the switch to enable multi-cloud. -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXeNRKpE7oevY6xtrhkRhfIsizzDXqyPkdWw1IhOdQDPSvo1zxr6X9MKrkwobbeTLLfVXiKche9qbww_eozosc2OL_ATjlxeSRdLAhXbs5hh_SgDoBpZSWEMBlMhu1KiMxYXTf8AYQ?key=XVCJ7AwFRtBzbiRuAEWj9A) +![](AD_4nXeNRKpE7oevY6xtrhkRhfIsizzDXqyPkdWw-75c32b1c.png) 3. The next selections in the wizard allow you to add cloud providers and regions for extra write, read, and analytic nodes. -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdVG2u0jyq6NHuZlKPDTKhpvSLBGnx-OlZcQsbI466GexVlO_RLoTZqv2elAYiLeaQq3Km8MOAIyr2DqoDiSlw7eiTdvYma77N818H8M1jakroSP_uCWV372FN20jti7hBbByWKew?key=XVCJ7AwFRtBzbiRuAEWj9A) +![](AD_4nXdVG2u0jyq6NHuZlKPDTKhpvSLBGnx-OlZc-223683ca.png) 4. You can then pick what cluster tier you want to use, give it a name, and then click \`Create Cluster\`, and it will go ahead and deploy a multi-cloud cluster. diff --git a/content/posts/2025/06/26/how-to-identify-the-underlying-causes-of-connection-timeout-errors-for-mongodb-with-java/dz2cdn1-dzone-com-1d763dac.jpg b/content/posts/2025/06/26/how-to-identify-the-underlying-causes-of-connection-timeout-errors-for-mongodb-with-java/dz2cdn1-dzone-com-1d763dac.jpg new file mode 100644 index 000000000..9bbbaf806 Binary files /dev/null and b/content/posts/2025/06/26/how-to-identify-the-underlying-causes-of-connection-timeout-errors-for-mongodb-with-java/dz2cdn1-dzone-com-1d763dac.jpg differ diff --git a/content/posts/2025/06/26/how-to-identify-the-underlying-causes-of-connection-timeout-errors-for-mongodb-with-java/dz2cdn1-dzone-com-78619f63.jpg b/content/posts/2025/06/26/how-to-identify-the-underlying-causes-of-connection-timeout-errors-for-mongodb-with-java/dz2cdn1-dzone-com-78619f63.jpg new file mode 100644 index 000000000..6d1d4b8fe Binary files /dev/null and b/content/posts/2025/06/26/how-to-identify-the-underlying-causes-of-connection-timeout-errors-for-mongodb-with-java/dz2cdn1-dzone-com-78619f63.jpg differ diff --git a/content/posts/2025/06/26/how-to-identify-the-underlying-causes-of-connection-timeout-errors-for-mongodb-with-java/dz2cdn1-dzone-com-93c0f56f.jpg b/content/posts/2025/06/26/how-to-identify-the-underlying-causes-of-connection-timeout-errors-for-mongodb-with-java/dz2cdn1-dzone-com-93c0f56f.jpg new file mode 100644 index 000000000..3a3c22fb7 Binary files /dev/null and b/content/posts/2025/06/26/how-to-identify-the-underlying-causes-of-connection-timeout-errors-for-mongodb-with-java/dz2cdn1-dzone-com-93c0f56f.jpg differ diff --git a/content/posts/2025/06/26/how-to-identify-the-underlying-causes-of-connection-timeout-errors-for-mongodb-with-java/index.md b/content/posts/2025/06/26/how-to-identify-the-underlying-causes-of-connection-timeout-errors-for-mongodb-with-java/index.md index 4debcce3d..eea584a29 100644 --- a/content/posts/2025/06/26/how-to-identify-the-underlying-causes-of-connection-timeout-errors-for-mongodb-with-java/index.md +++ b/content/posts/2025/06/26/how-to-identify-the-underlying-causes-of-connection-timeout-errors-for-mongodb-with-java/index.md @@ -48,7 +48,7 @@ It could be any of the following: Either way, your MongoDB client silently dies with a MongoDB Connection Timeout exception and you are left to wonder why your perfect Java API code won't talk to MongoDB, until your eyes land on the network logs. Here, you can see log snippets for an exception for connection refused in a Java Spring Boot application when we are trying to connect to the database on port `27018`. -![socket exception](https://dz2cdn1.dzone.com/storage/temp/18398896-1747072041430.png) +![socket exception](dz2cdn1-dzone-com-93c0f56f.jpg) This is similar to a connection timeout as it leads to exception at the driver end in application and results in an immediate connection rejection and socket exception. In case of a MongoDB timeout exception, which can be due to a host/port misconfiguration, there would be a similar exception happening only after a small duration until it reaches the network issue of unable to find the database instance. @@ -83,7 +83,7 @@ Similarly, if the server's RAM is insufficient—say, the working set of data ex Here's a real-world parallel from your Spring Boot app: Imagine a microservice managing the wedding's guest list, running on a shared host. Each guest lookup opens a new MongoDB connection, but sloppy cleanup—failing to close `MongoClient` instances properly—leaves connections lingering. Over time, the microservice hits the server's ulimit on file descriptors (e.g., 1024 open files), and MongoDB starts rejecting new connections. Below is a screenshot from [Java Visual VM](https://visualvm.github.io/download.html) showing the high memory usage by Java threads for the Spring Boot application, leading to `MongoDBConnectionTimeoutException`. -![Java Visual VM](https://dz2cdn1.dzone.com/storage/temp/18398887-1747071135135.png) +![Java Visual VM](dz2cdn1-dzone-com-1d763dac.jpg) ## Connection Pool Misconfiguration @@ -140,7 +140,7 @@ Some of the common mistakes in the MongoDB URI that disrupts connectivity are: * Missing credentials: Omitting the `user:pass` portion for a MongoDB instance that requires authentication causes an authentication failure. The server rejects the connection, and the app logs a `MongoSecurityException` or `MongoTimeoutException`, depending on the driver's timeout settings. A frequent issue arises when the MongoDB URI in your application's configuration points to an outdated server. In a Spring Boot application, the `application.properties` file typically defines the URI. If the URI refers to a server that is no longer running—perhaps decommissioned during a system migration—the application cannot connect. After the default timeout period (e.g., five seconds), the MongoDB Java driver throws a `MongoTimeoutException: "Timed out after 5000 ms while waiting to connect."` This error disrupts all database operations, causing user-facing errors and application failures until the URI is updated to point to the correct server (e.g., `mongodb://user:pass@prod-server:27017/test`). -![Port mismatch connection exception](https://dz2cdn1.dzone.com/storage/temp/18398897-1747072179481.png) +![Port mismatch connection exception](dz2cdn1-dzone-com-78619f63.jpg) A correct way to connect to a replica set cluster would be to provide the right pattern for the MongoDB URI. For example : `mongodb://user:host1:port1,host2:port2,host3:port3/mydb?replicaSet=myReplicaSet` diff --git a/content/posts/2025/06/29/javafx-links-of-june-2025/index.md b/content/posts/2025/06/29/javafx-links-of-june-2025/index.md index 916116609..160818174 100644 --- a/content/posts/2025/06/29/javafx-links-of-june-2025/index.md +++ b/content/posts/2025/06/29/javafx-links-of-june-2025/index.md @@ -5,7 +5,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of June 2025. Y canonical: "https://webtechie.be/post/2025-06-27-javafx-links-of-june-2025/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2025/06/29/javafx-links-of-june-2025/jfxcentral.jpg b/content/posts/2025/06/29/javafx-links-of-june-2025/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2025/06/29/javafx-links-of-june-2025/jfxcentral.jpg differ diff --git a/content/posts/2025/06/29/javafx-links-of-june-2025/jfxcentral.png b/content/posts/2025/06/29/javafx-links-of-june-2025/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2025/06/29/javafx-links-of-june-2025/jfxcentral.png and /dev/null differ diff --git a/content/posts/2025/07/02/java-21-not-working-on-the-raspberry-pi-zero-2/compare-boards-1024x600.jpg b/content/posts/2025/07/02/java-21-not-working-on-the-raspberry-pi-zero-2/compare-boards-1024x600.jpg new file mode 100644 index 000000000..6a1f862b1 Binary files /dev/null and b/content/posts/2025/07/02/java-21-not-working-on-the-raspberry-pi-zero-2/compare-boards-1024x600.jpg differ diff --git a/content/posts/2025/07/02/java-21-not-working-on-the-raspberry-pi-zero-2/compare-boards-1024x600.png b/content/posts/2025/07/02/java-21-not-working-on-the-raspberry-pi-zero-2/compare-boards-1024x600.png deleted file mode 100644 index a1c8b72e9..000000000 Binary files a/content/posts/2025/07/02/java-21-not-working-on-the-raspberry-pi-zero-2/compare-boards-1024x600.png and /dev/null differ diff --git a/content/posts/2025/07/02/java-21-not-working-on-the-raspberry-pi-zero-2/index.md b/content/posts/2025/07/02/java-21-not-working-on-the-raspberry-pi-zero-2/index.md index 5d1a414a0..82e7ba842 100644 --- a/content/posts/2025/07/02/java-21-not-working-on-the-raspberry-pi-zero-2/index.md +++ b/content/posts/2025/07/02/java-21-not-working-on-the-raspberry-pi-zero-2/index.md @@ -100,4 +100,4 @@ Hello World ## Compare Boards To help identify these kinds of issues that behave differently on different types of Raspberry Pi boards, the Board Info Service has been extended with a [Compare view](https://api.pi4j.com/board-compare?board2=MODEL_4_B&board1=ZERO_V2) where you can easily see the differences between two boards. -![](compare-boards-1024x600.png) +![](compare-boards-1024x600.jpg) diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-7-2025-12_40_05-PM-900x20-303d0ba6.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-7-2025-12_40_05-PM-900x20-303d0ba6.png new file mode 100644 index 000000000..0386b978a Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-7-2025-12_40_05-PM-900x20-303d0ba6.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-7-2025-1_11_41-PM-900x200-58cbd86a.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-7-2025-1_11_41-PM-900x200-58cbd86a.png new file mode 100644 index 000000000..8dfaebcd1 Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-7-2025-1_11_41-PM-900x200-58cbd86a.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-7-2025-1_19_15-PM-2000x90-52303f50.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-7-2025-1_19_15-PM-2000x90-52303f50.png new file mode 100644 index 000000000..c79d1f04b Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-7-2025-1_19_15-PM-2000x90-52303f50.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-7-2025-4_53_38-PM-900x200-680767c1.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-7-2025-4_53_38-PM-900x200-680767c1.png new file mode 100644 index 000000000..62e19f889 Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-7-2025-4_53_38-PM-900x200-680767c1.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-7-2025-5_03_35-PM1-900x20-27485845.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-7-2025-5_03_35-PM1-900x20-27485845.png new file mode 100644 index 000000000..25dbcb202 Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-7-2025-5_03_35-PM1-900x20-27485845.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-12_37_53-PM-900x20-c0fcfea4.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-12_37_53-PM-900x20-c0fcfea4.png new file mode 100644 index 000000000..4e4413e58 Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-12_37_53-PM-900x20-c0fcfea4.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-12_53_04-PM-900x20-7254269d.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-12_53_04-PM-900x20-7254269d.png new file mode 100644 index 000000000..4608a35b4 Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-12_53_04-PM-900x20-7254269d.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-12_55_39-PM-1-900x-466ad6af.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-12_55_39-PM-1-900x-466ad6af.png new file mode 100644 index 000000000..60340da5e Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-12_55_39-PM-1-900x-466ad6af.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-1_14_40-PM-900x200-339ddbf8.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-1_14_40-PM-900x200-339ddbf8.png new file mode 100644 index 000000000..98741fec7 Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-1_14_40-PM-900x200-339ddbf8.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-1_27_10-PM-2000x90-19c25adb.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-1_27_10-PM-2000x90-19c25adb.png new file mode 100644 index 000000000..4b5afeca0 Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-1_27_10-PM-2000x90-19c25adb.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-1_28_58-PM-2000x90-26d30ae3.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-1_28_58-PM-2000x90-26d30ae3.png new file mode 100644 index 000000000..94f759439 Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-1_28_58-PM-2000x90-26d30ae3.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-2_05_45-PM-1-900x2-93245a6d.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-2_05_45-PM-1-900x2-93245a6d.png new file mode 100644 index 000000000..1b5acbc26 Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-2_05_45-PM-1-900x2-93245a6d.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-2_19_39-PM-900x200-59b98a9a.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-2_19_39-PM-900x200-59b98a9a.png new file mode 100644 index 000000000..3f68b3d0b Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-2_19_39-PM-900x200-59b98a9a.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-2_25_43-PM-1-900x2-bca9f115.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-2_25_43-PM-1-900x2-bca9f115.png new file mode 100644 index 000000000..1e32c3c2f Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-2_25_43-PM-1-900x2-bca9f115.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-4_27_18-PM-1-900x2-c2653c79.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-4_27_18-PM-1-900x2-c2653c79.png new file mode 100644 index 000000000..e2c3e4a73 Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-8-2025-4_27_18-PM-1-900x2-c2653c79.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-9-2025-12_42_33-PM-900x20-fa5a4d3e.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-9-2025-12_42_33-PM-900x20-fa5a4d3e.png new file mode 100644 index 000000000..f352ca063 Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot-May-9-2025-12_42_33-PM-900x20-fa5a4d3e.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot_20250508-133128-2000x900-de10d14b.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot_20250508-133128-2000x900-de10d14b.png new file mode 100644 index 000000000..e6183cfd3 Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot_20250508-133128-2000x900-de10d14b.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot_20250508-133150-2000x900-621a8336.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot_20250508-133150-2000x900-621a8336.png new file mode 100644 index 000000000..587a22e0c Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/Screenshot_20250508-133150-2000x900-621a8336.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/image-1-900x2000-acb2d67b.png b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/image-1-900x2000-acb2d67b.png new file mode 100644 index 000000000..8b7c7c972 Binary files /dev/null and b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/image-1-900x2000-acb2d67b.png differ diff --git a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/index.md b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/index.md index 2641978aa..7be4e6f33 100644 --- a/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/index.md +++ b/content/posts/2025/07/07/cap-in-the-pocket-developing-java-applications-on-your-phone/index.md @@ -19,7 +19,7 @@ frozen: true Smartphones are more powerful then ever, with processors rivaling old laptops. So let's try to use them like a laptop to develop web-applications on the go. Below I'll show you how to do use run and develop a [CAP Java](https://cap.cloud.sap/docs/java/) [Spring Boot](https://spring.io/projects/spring-boot) application on your smartphone and how to run [VSCode](https://code.visualstudio.com/) locally to develop and modify it. This, of course, works only on Android phones, as they are a Linux at their core. -![](https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-8-2025-1_28_58-PM-2000x900.png) +![](Screenshot-May-8-2025-1_28_58-PM-2000x90-26d30ae3.png) ## Termux @@ -54,7 +54,7 @@ apt install openjdk-21 Now we have a proper OpenJDK JVM running on our phone: -{{< img src="https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-7-2025-12_40_05-PM-900x2000.png" class="aligncenter size-large is-resized" style="width:300px" >}} +{{< img src="Screenshot-May-7-2025-12_40_05-PM-900x20-303d0ba6.png" class="aligncenter size-large is-resized" style="width:300px" >}} But developing code in shell tools like VIM is cumbersome, so we let's install VSCode. The cool part about VSCode is that it consists of two parts, a backend and a front-end. We can run the backend in Termux and the front-end in the browser. @@ -77,10 +77,10 @@ This launches a local version and ignores the shell output. Code-server is by de Go to [localhost:8080](http://localhost:8080) to access it. Now we have a IDE, running locally directly on our device: -{{< img src="https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-7-2025-1_11_41-PM-900x2000.png" class="aligncenter size-large is-resized" style="width:300px" >}} +{{< img src="Screenshot-May-7-2025-1_11_41-PM-900x200-58cbd86a.png" class="aligncenter size-large is-resized" style="width:300px" >}} That was simple, wasn't it? The only Problem: The official VSCode extensions and accessing the official VSCode market place is not supported, as code-server is a fork of VSCode: -![](https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-7-2025-1_19_15-PM-2000x900.png) +![](Screenshot-May-7-2025-1_19_15-PM-2000x90-52303f50.png) You can still install the Java extensions from file by downloading the latest Linux arm64 release via wget from [GitHub](https://github.com/redhat-developer/vscode-java/releases/tag/v1.41.1) and then use "Install from VSIX" in the front-end, but this is cumbersome. @@ -132,7 +132,7 @@ apt install sapmachine-21-jdk Resulting in a proper JVM: -{{< img src="https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-8-2025-12_37_53-PM-900x2000.png" class="aligncenter size-large is-resized" style="width:300px" >}} +{{< img src="Screenshot-May-8-2025-12_37_53-PM-900x20-c0fcfea4.png" class="aligncenter size-large is-resized" style="width:300px" >}} After that, we can install the official VSCode distribution: @@ -154,7 +154,7 @@ nohup code serve-web --port 8080 --without-connection-token & Now we have a proper official VSCode and can view it in the browser at [localhost:8080](http://localhost:8080): -{{< img src="https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-8-2025-1_14_40-PM-900x2000.png" class="aligncenter size-large is-resized" style="width:300px" >}} +{{< img src="Screenshot-May-8-2025-1_14_40-PM-900x200-339ddbf8.png" class="aligncenter size-large is-resized" style="width:300px" >}} In this we can install all the extensions we want and can start developing applications. @@ -213,11 +213,11 @@ mvn spring-boot:run But the CAP tools run into a problem: -{{< img src="https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-7-2025-4_53_38-PM-900x2000.png" class="aligncenter size-large is-resized" style="width:300px" >}} +{{< img src="Screenshot-May-7-2025-4_53_38-PM-900x200-680767c1.png" class="aligncenter size-large is-resized" style="width:300px" >}} Seems like nobody prebuilt their npm packages from the Android arm64 target. And no, self-building all packages doesn't work and even if. `mvn spring-boot:run`, which uses the CAP's NodeJS tools internally, crashes with a double free: -{{< img src="https://mostlynerdless.de/wp-content/uploads/2025/05/image-1-900x2000.png" class="aligncenter size-large is-resized" style="width:300px" >}} +{{< img src="image-1-900x2000-acb2d67b.png" class="aligncenter size-large is-resized" style="width:300px" >}} Because I still want to build SFlight on my phone, I need to get creative. The problem here are solely the CAP tools, not anything written in Java. So yes, you might call the following hacky, but this would be no problem in standard Spring Boot applications. It only means that you should be aware of the dependencies that your project needs, especially of natively compiled dependencies. @@ -251,20 +251,20 @@ You might want to add this to your `.zshrc` to make it permament. To access the most basic page of the app, visit [localhost:4004](http://localhost:4004) -{{< img src="https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-7-2025-5_03_35-PM1-900x2000.png" class="aligncenter size-large is-resized" style="width:300px" >}} +{{< img src="Screenshot-May-7-2025-5_03_35-PM1-900x20-27485845.png" class="aligncenter size-large is-resized" style="width:300px" >}} Or visit to a proper page with which we can easily interact. When the website wants you to sign in, choose "privileged" as a user and an empty password. -{{< img src="https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-8-2025-12_53_04-PM-900x2000.png" class="aligncenter size-large is-resized" style="width:300px" >}} +{{< img src="Screenshot-May-8-2025-12_53_04-PM-900x20-7254269d.png" class="aligncenter size-large is-resized" style="width:300px" >}} Leading you to: -{{< img src="https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-8-2025-12_55_39-PM-1-900x2000.png" class="aligncenter size-large is-resized" style="width:300px" >}} +{{< img src="Screenshot-May-8-2025-12_55_39-PM-1-900x-466ad6af.png" class="aligncenter size-large is-resized" style="width:300px" >}} ## Modifying the Application via VSCode We can use the VSCode instance that we launched before to access our SFlight project (`nohup code serve-web --port 8080 --without-connection-token &` to start it again if you stopped yours) and work with the code: -![](https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-8-2025-1_27_10-PM-2000x900.png) +![](Screenshot-May-8-2025-1_27_10-PM-2000x90-19c25adb.png) Now let's have some fun: The SFlight admin screens allows the privileged user to application deductions to the cost of a flight. We now introduce a small bug in the code that computes the discount in the `DeductDiscountHandler` class to always calculate a ten times higher discount than requested. This might not make any sense, but the reverse (fixing this bug) is a nice demo of how one can use VSCode on their phone to fix a serious bug on the go. @@ -282,13 +282,13 @@ BigDecimal deductedTotalPrice = travel.totalPrice() ``` We can now introduce the bug by dividing `context.percent()` in the first two lines not by 100, but by 10. -![](https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-8-2025-1_28_58-PM-2000x900.png) +![](Screenshot-May-8-2025-1_28_58-PM-2000x90-26d30ae3.png) When we rebuild and run the application via `mvn spring-boot:run`, deducting 10% of the travel costs: -![](https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot_20250508-133128-2000x900.png) +![](Screenshot_20250508-133128-2000x900-de10d14b.png) Decreases the price to 0 USD: -![](https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot_20250508-133150-2000x900.png) +![](Screenshot_20250508-133150-2000x900-621a8336.png) Nothing prevents us from using git to commit our change to some repo. This shows how we can easily modify our CAP/Spring-Boot application locally on our phone. @@ -332,7 +332,7 @@ And of course you should set `JAVA_HOME` as before to prevent maven from complai We now have a SapMachine: -{{< img src="https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-8-2025-2_05_45-PM-1-900x2000.png" class="aligncenter size-large is-resized" style="width:300px" >}} +{{< img src="Screenshot-May-8-2025-2_05_45-PM-1-900x2-93245a6d.png" class="aligncenter size-large is-resized" style="width:300px" >}} *There are now technically two SapMachines and one OpenJDK installed on my tiny phone. Maybe I should install an OpenJ9 build just for good measure...* @@ -348,11 +348,11 @@ rm code.deb During the installation I got asked whether I want to add the Microsoft apt repository, having this prompt on my phone just looks funny: -{{< img src="https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-8-2025-2_19_39-PM-900x2000.png" class="aligncenter size-large is-resized" style="width:300px" >}} +{{< img src="Screenshot-May-8-2025-2_19_39-PM-900x200-59b98a9a.png" class="aligncenter size-large is-resized" style="width:300px" >}} Unsuprisingly, launching VSCode via `nohup code serve-web --port 8080 --without-connection-token &` and then accessing the front-end via [localhost:8080](http://localhost:8080) works: -{{< img src="https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-8-2025-2_25_43-PM-1-900x2000.png" class="aligncenter size-large is-resized" style="width:300px" >}} +{{< img src="Screenshot-May-8-2025-2_25_43-PM-1-900x2-bca9f115.png" class="aligncenter size-large is-resized" style="width:300px" >}} Now the thing you're all waiting for: How long does a git clone take and do the CAP Java tools work in building the SFlight CAP app on this system? @@ -390,7 +390,7 @@ And well, it worked... Which I find surprising. The UI of the new Linux Terminal Well it worked till I opened the browser and then the Linux Terminal App crashed. I'm happy that I documented everything. I tried it two times more. But this means that despite it's apparent benefits, it's basically unusuable for this specific use case for now. -{{< img src="https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-8-2025-4_27_18-PM-1-900x2000.png" class="aligncenter size-large is-resized" style="width:300px" >}} +{{< img src="Screenshot-May-8-2025-4_27_18-PM-1-900x2-c2653c79.png" class="aligncenter size-large is-resized" style="width:300px" >}} Hopefully I can revisit this in a few months and it's fixed. @@ -400,7 +400,7 @@ Hopefully I can revisit this in a few months and it's fixed. Switching between VSCode for editing and the shell for killing the previous SFlight server instance is too cumbersome for my demo. So I created the [CAP-in-the-Pocket](https://github.com/parttimenerd/cap-in-the-pocket-extension) extension for VSCode: -{{< img src="https://mostlynerdless.de/wp-content/uploads/2025/05/Screenshot-May-9-2025-12_42_33-PM-900x2000.png" class="aligncenter size-large is-resized" style="width:300px" >}} +{{< img src="Screenshot-May-9-2025-12_42_33-PM-900x20-fa5a4d3e.png" class="aligncenter size-large is-resized" style="width:300px" >}} To install it, download the extension from [GitHub](https://github.com/parttimenerd/cap-in-the-pocket-extension/releases/download/snapshot/cap-in-the-pocket-0.0.1.vsix) and open with the Termux app to make it available to VSCode. Then open the Extensions view in VSCode, click the "..." at the top of the Extensions view, select "Install from VSIX..." and select the downloaded file. diff --git a/content/posts/2025/07/07/carbon-aware-job-processing-with-jobrunr-v8/index.md b/content/posts/2025/07/07/carbon-aware-job-processing-with-jobrunr-v8/index.md index 22634e806..37819de5e 100644 --- a/content/posts/2025/07/07/carbon-aware-job-processing-with-jobrunr-v8/index.md +++ b/content/posts/2025/07/07/carbon-aware-job-processing-with-jobrunr-v8/index.md @@ -5,7 +5,7 @@ lastmod: "2025-07-07T09:50:58+00:00" description: "Discover how JobRunr v8 helps developers cut CO2 emissions without sacrificing performance. Use Carbon Aware Job Processing to run background jobs when your grid is greenest. Make your apps smarter, and the planet a little cleaner, with just a few lines of code." authors: - "nicholas-dhondt" -image: "jobrunr-carbon-foojay.png" +image: "jobrunr-carbon-foojay.jpg" categories: - "Java" - "Tutorials" diff --git a/content/posts/2025/07/07/carbon-aware-job-processing-with-jobrunr-v8/jobrunr-carbon-foojay.jpg b/content/posts/2025/07/07/carbon-aware-job-processing-with-jobrunr-v8/jobrunr-carbon-foojay.jpg new file mode 100644 index 000000000..cae803841 Binary files /dev/null and b/content/posts/2025/07/07/carbon-aware-job-processing-with-jobrunr-v8/jobrunr-carbon-foojay.jpg differ diff --git a/content/posts/2025/07/07/carbon-aware-job-processing-with-jobrunr-v8/jobrunr-carbon-foojay.png b/content/posts/2025/07/07/carbon-aware-job-processing-with-jobrunr-v8/jobrunr-carbon-foojay.png deleted file mode 100644 index 6f27f6908..000000000 Binary files a/content/posts/2025/07/07/carbon-aware-job-processing-with-jobrunr-v8/jobrunr-carbon-foojay.png and /dev/null differ diff --git a/content/posts/2025/07/07/new-ai-conference-for-and-by-developers/ai4devs0-1024x616.jpg b/content/posts/2025/07/07/new-ai-conference-for-and-by-developers/ai4devs0-1024x616.jpg new file mode 100644 index 000000000..c9fe250b9 Binary files /dev/null and b/content/posts/2025/07/07/new-ai-conference-for-and-by-developers/ai4devs0-1024x616.jpg differ diff --git a/content/posts/2025/07/07/new-ai-conference-for-and-by-developers/ai4devs0-1024x616.png b/content/posts/2025/07/07/new-ai-conference-for-and-by-developers/ai4devs0-1024x616.png deleted file mode 100644 index 651670fc0..000000000 Binary files a/content/posts/2025/07/07/new-ai-conference-for-and-by-developers/ai4devs0-1024x616.png and /dev/null differ diff --git a/content/posts/2025/07/07/new-ai-conference-for-and-by-developers/index.md b/content/posts/2025/07/07/new-ai-conference-for-and-by-developers/index.md index 19dd120d9..f22f7fa80 100644 --- a/content/posts/2025/07/07/new-ai-conference-for-and-by-developers/index.md +++ b/content/posts/2025/07/07/new-ai-conference-for-and-by-developers/index.md @@ -18,6 +18,6 @@ frozen: false --- AI4DEVS, **September 19, 2025** in Amsterdam, is created **for and by developers working with AI technologies** . Our mission is simple: share practical, usable knowledge with real use cases and code. Whether you're an experienced AI engineer or just starting to explore machine learning in your applications, AI4DEVS offers **valuable knowledge for every level** . All the details are here: -[![](ai4devs0-1024x616.png)](https://amsterdam.ai4devs.io/) [![](ai4devs-730x1024.png)](https://amsterdam.ai4devs.io/) +[![](ai4devs0-1024x616.jpg)](https://amsterdam.ai4devs.io/) [![](ai4devs-730x1024.png)](https://amsterdam.ai4devs.io/) All the details are here: diff --git a/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-10eb25ef.png b/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-10eb25ef.png new file mode 100644 index 000000000..ca97e8a41 Binary files /dev/null and b/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-10eb25ef.png differ diff --git a/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-35ae87c3.png b/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-35ae87c3.png new file mode 100644 index 000000000..2f1ede695 Binary files /dev/null and b/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-35ae87c3.png differ diff --git a/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-aa1c0fce.jpg b/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-aa1c0fce.jpg new file mode 100644 index 000000000..bb0306f2e Binary files /dev/null and b/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-aa1c0fce.jpg differ diff --git a/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-fc6db0de.jpg b/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-fc6db0de.jpg new file mode 100644 index 000000000..bd2f767a5 Binary files /dev/null and b/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-fc6db0de.jpg differ diff --git a/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/index.md b/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/index.md index c857009ea..e9bc96d49 100644 --- a/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/index.md +++ b/content/posts/2025/07/08/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/index.md @@ -57,7 +57,7 @@ Once your free Atlas cluster is ready, download the [SQL schema script](https:// ### Analysing the Postgres schema In this section, we will understand an example of a library management system where we have nine different tables, and the relationship between them is shown in the diagram below: -[![Image representing the relational schema diagram for the database](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftjz0onokqk2qp839418n.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftjz0onokqk2qp839418n.png) +[![Image representing the relational schema diagram for the database](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-10eb25ef.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-10eb25ef.png) The ER diagram above also depicts the relationship between these tables. Relational databases often require intricate joins, nested subqueries, and multiple layers of aggregation to retrieve even moderately complex data relationships. As a result, what might seem like a simple query can quickly escalate into a large, complex, and unwieldy SQL statement. This not only increases the cognitive load for developers but also makes the code harder to maintain and prone to errors. @@ -78,7 +78,7 @@ This leads to the joining of two different tables using the foreign key constrai The nine different tables in the relational schema need to be converted into five different collections using the [mapping technique](https://www.mongodb.com/docs/relational-migrator/mapping-rules/mapping-rules/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=Building%20a%20Spring%20Boot%20CRUD%20Application%20Using%20MongoDB%E2%80%99s%20Relational%20Migrator&utm_term=aasawari.sahasrabuddhe) given by MongoDB. These techniques follow the [design patterns](https://www.mongodb.com/docs/manual/data-modeling/design-patterns/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=Building%20a%20Spring%20Boot%20CRUD%20Application%20Using%20MongoDB%E2%80%99s%20Relational%20Migrator&utm_term=aasawari.sahasrabuddhe) followed by MongoDB in data modelling concepts. After the mappings have been applied to the tables, the MongoDB schema would like the following: -[![Image representing the desired MongoDB schema](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8dycmqr8zxtnpi6ovgtq.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8dycmqr8zxtnpi6ovgtq.png) +[![Image representing the desired MongoDB schema](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-fc6db0de.jpg)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-fc6db0de.jpg) Let's try to convert the above SQL query into the equivalent MongoDB query: @@ -121,7 +121,7 @@ The tool's Code Converter feature is designed to simplify your journey further b ## Code generation with Relational Migrator To create an application with migrated data using Relational Migrator, you should click on the "Code Generation" tab and select the language and template as Java and Spring Data, respectively. The below screenshot from the Relational Migrator tools explains the steps for the code generation. -[![Screenshot from Relational Migrator tool performing the code generation](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgftcazognj7pfmnk7clw.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgftcazognj7pfmnk7clw.png) +[![Screenshot from Relational Migrator tool performing the code generation](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-35ae87c3.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-35ae87c3.png) Once you select the framework, you are all set to download/copy the code in the editor of your choice for further processing. @@ -134,7 +134,7 @@ In this tutorial, we are using IntelliJ as the IDE and copying all the code prov Depending on the data model that has been selected, the Relational Migrator tools create the [entity](https://spring.io/guides/gs/accessing-data-jpa) and the [repository](https://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html) files for the application. Once the entity and the repository files are all copied/downloaded, all you need to do is create the service and the controller to perform the business logic of the applications. After all the files are copied, the project will look like this: -[![Screenshot from InteliJ representing the project structure of the application](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjq1djs4ewlxkux75y8id.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjq1djs4ewlxkux75y8id.png) +[![Screenshot from InteliJ representing the project structure of the application](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-aa1c0fce.jpg)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-aa1c0fce.jpg) The controller has all the REST API calls, and the service files are where we need to write the aggregate pipelines. diff --git a/content/posts/2025/07/08/prime-time-the-high-performance-java-event/index.md b/content/posts/2025/07/08/prime-time-the-high-performance-java-event/index.md index 6c7dd3bbb..e0821efce 100644 --- a/content/posts/2025/07/08/prime-time-the-high-performance-java-event/index.md +++ b/content/posts/2025/07/08/prime-time-the-high-performance-java-event/index.md @@ -5,7 +5,7 @@ lastmod: "2025-08-14T12:35:26+00:00" description: "Java is the engine behind mission-critical applications and end user experiences. From faster response times to consistent performance, Java can have a…" authors: - "geertjan-wielenga" -image: "unlock.png" +image: "unlock.jpg" categories: - "Events" - "Java" diff --git a/content/posts/2025/07/08/prime-time-the-high-performance-java-event/unlock.jpg b/content/posts/2025/07/08/prime-time-the-high-performance-java-event/unlock.jpg new file mode 100644 index 000000000..a7d6c9124 Binary files /dev/null and b/content/posts/2025/07/08/prime-time-the-high-performance-java-event/unlock.jpg differ diff --git a/content/posts/2025/07/08/prime-time-the-high-performance-java-event/unlock.png b/content/posts/2025/07/08/prime-time-the-high-performance-java-event/unlock.png deleted file mode 100644 index b3ee593a2..000000000 Binary files a/content/posts/2025/07/08/prime-time-the-high-performance-java-event/unlock.png and /dev/null differ diff --git a/content/posts/2025/07/09/how-i-improved-zero-shot-classification-in-deep-java-library-djl-oss/0-MqJEP40BE5Gi3Ay7-31e39fc8.png b/content/posts/2025/07/09/how-i-improved-zero-shot-classification-in-deep-java-library-djl-oss/0-MqJEP40BE5Gi3Ay7-31e39fc8.png new file mode 100644 index 000000000..2fdb1ff0e Binary files /dev/null and b/content/posts/2025/07/09/how-i-improved-zero-shot-classification-in-deep-java-library-djl-oss/0-MqJEP40BE5Gi3Ay7-31e39fc8.png differ diff --git a/content/posts/2025/07/09/how-i-improved-zero-shot-classification-in-deep-java-library-djl-oss/1-H7FiUe-NTKoYSlqg76peww-44b140c2.webp b/content/posts/2025/07/09/how-i-improved-zero-shot-classification-in-deep-java-library-djl-oss/1-H7FiUe-NTKoYSlqg76peww-44b140c2.webp new file mode 100644 index 000000000..1bc7f43b7 Binary files /dev/null and b/content/posts/2025/07/09/how-i-improved-zero-shot-classification-in-deep-java-library-djl-oss/1-H7FiUe-NTKoYSlqg76peww-44b140c2.webp differ diff --git a/content/posts/2025/07/09/how-i-improved-zero-shot-classification-in-deep-java-library-djl-oss/1-qWVMzOJ0JDDrqtJpIFIRbg-479c3f31.jpg b/content/posts/2025/07/09/how-i-improved-zero-shot-classification-in-deep-java-library-djl-oss/1-qWVMzOJ0JDDrqtJpIFIRbg-479c3f31.jpg new file mode 100644 index 000000000..b02b6d18c Binary files /dev/null and b/content/posts/2025/07/09/how-i-improved-zero-shot-classification-in-deep-java-library-djl-oss/1-qWVMzOJ0JDDrqtJpIFIRbg-479c3f31.jpg differ diff --git a/content/posts/2025/07/09/how-i-improved-zero-shot-classification-in-deep-java-library-djl-oss/index.md b/content/posts/2025/07/09/how-i-improved-zero-shot-classification-in-deep-java-library-djl-oss/index.md index 8068a2d6a..c268e2bf3 100644 --- a/content/posts/2025/07/09/how-i-improved-zero-shot-classification-in-deep-java-library-djl-oss/index.md +++ b/content/posts/2025/07/09/how-i-improved-zero-shot-classification-in-deep-java-library-djl-oss/index.md @@ -58,13 +58,13 @@ Politics: 0.000 With a higher score for "Software Engineering" and an even lower score for "Politics." -![](https://cdn-images-1.medium.com/max/2000/1*H7FiUe-NTKoYSlqg76peww.gif) +![](1-H7FiUe-NTKoYSlqg76peww-44b140c2.webp) You can easily try it out at: [https://huggingface.co/MoritzLaurer/DeBERTa-v3-large-mnli-fever-anli-ling-wanli](https://huggingface.co/MoritzLaurer/DeBERTa-v3-large-mnli-fever-anli-ling-wanli?candidate_labels=Software+Engineering%2C+Software+Programming%2C+Politics&multi_class=true&text=Java+is+a+great+programming+language) ## Integrating a Zero-Shot Classification Model with the Deep Java Library -![](https://cdn-images-1.medium.com/max/2612/0*MqJEP40BE5Gi3Ay7.png) +![](0-MqJEP40BE5Gi3Ay7-31e39fc8.png) **The Deep Java Library (DJL) is an open-source library that makes it easier to work with machine learning models in Java.** It lets you run models locally, in-process, inside your Java application. It supports many engines (like PyTorch and TensorFlow), and it can load models directly from Hugging Face or from disk. @@ -330,7 +330,7 @@ After I had tested and made sure the translator was working as expected, it was As a result, you can find the PR here: -![](https://cdn-images-1.medium.com/max/800/1*qWVMzOJ0JDDrqtJpIFIRbg.png) +![](1-qWVMzOJ0JDDrqtJpIFIRbg-479c3f31.jpg) ## Final Words diff --git a/content/posts/2025/07/15/sustainability-starts-with-your-runtime-meet-a-green-jvm/2025-07-01-green-diagram-1024x503-b2b3bfea.jpg b/content/posts/2025/07/15/sustainability-starts-with-your-runtime-meet-a-green-jvm/2025-07-01-green-diagram-1024x503-b2b3bfea.jpg new file mode 100644 index 000000000..7fcf54325 Binary files /dev/null and b/content/posts/2025/07/15/sustainability-starts-with-your-runtime-meet-a-green-jvm/2025-07-01-green-diagram-1024x503-b2b3bfea.jpg differ diff --git a/content/posts/2025/07/15/sustainability-starts-with-your-runtime-meet-a-green-jvm/index.md b/content/posts/2025/07/15/sustainability-starts-with-your-runtime-meet-a-green-jvm/index.md index 705d96f95..9f9c569ba 100644 --- a/content/posts/2025/07/15/sustainability-starts-with-your-runtime-meet-a-green-jvm/index.md +++ b/content/posts/2025/07/15/sustainability-starts-with-your-runtime-meet-a-green-jvm/index.md @@ -43,7 +43,7 @@ Azul Platform Prime changes the game by making your Java apps more efficient at * **Cloud Native Compiler** **–** [CNC](https://www.azul.com/products/intelligence-cloud/cloud-native-compiler/) offloads JIT compilation to a remote service, freeing up local CPU cycles and improving resource efficiency, especially in containers. This means your Java applications do more, with less. Less compute. Less memory. Less electricity. -![DIAGRAM: Faster Java apps and increased instance utilization with Azul Platform Prime lead to lower cloud costs and lower energy consumption.](https://azul.imgix.net/wp-content/uploads/2025-07-01-green-diagram-1024x503.jpg?auto=format&crop=faces,entropy&fit=max&q=80&s=8b8f9c85ac4a7bf6cc6a795def64b890) Faster Java apps and increased instance utilization with Azul Platform Prime lead to lower cloud costs and lower energy consumption. +![DIAGRAM: Faster Java apps and increased instance utilization with Azul Platform Prime lead to lower cloud costs and lower energy consumption.](2025-07-01-green-diagram-1024x503-b2b3bfea.jpg) Faster Java apps and increased instance utilization with Azul Platform Prime lead to lower cloud costs and lower energy consumption. ## Sustainable engineering in action diff --git a/content/posts/2025/07/15/the-great-data-reimagination-from-static-to-agile-in-the-ai-era/f9c3c06e-mongodb-9a81de3f.svg b/content/posts/2025/07/15/the-great-data-reimagination-from-static-to-agile-in-the-ai-era/f9c3c06e-mongodb-9a81de3f.svg new file mode 100644 index 000000000..43fea5ebd --- /dev/null +++ b/content/posts/2025/07/15/the-great-data-reimagination-from-static-to-agile-in-the-ai-era/f9c3c06e-mongodb-9a81de3f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/posts/2025/07/15/the-great-data-reimagination-from-static-to-agile-in-the-ai-era/index.md b/content/posts/2025/07/15/the-great-data-reimagination-from-static-to-agile-in-the-ai-era/index.md index df4e8bfe5..7b036a90b 100644 --- a/content/posts/2025/07/15/the-great-data-reimagination-from-static-to-agile-in-the-ai-era/index.md +++ b/content/posts/2025/07/15/the-great-data-reimagination-from-static-to-agile-in-the-ai-era/index.md @@ -31,7 +31,7 @@ These changes are driving the great data reimagination, where companies must thi Organizations are currently facing [$1.52 trillion in technical debt](https://www.architectureandgovernance.com/elevating-ea/new-research-suggests-architectural-technical-debt-is-most-damaging-to-applications-amid-1-52-trillion-technical-debt-crisis/?utm_source=chatgpt.com), and according to Gartner, by 2026, [80% of that debt](https://vfunction.com/blog/technical-debt-vs-architectural-technical-debt-what-to-know/?utm_source=chatgpt.com) will be due to architectural issues. For developers, technical debt consumes up to [42% of their time](https://thenewstack.io/technical-debt-continues-to-mount-heres-how-to-solve-it/), hurting morale, contributing to turnover and slowing innovation, all of which hinder competitiveness in areas like AI, personalization and Internet of Things (IoT) usage. "Today's developers are building [AI agents](https://thenewstack.io/ai-agents-a-comprehensive-introduction-for-developers/) that need to remember conversations, search through millions of documents semantically and scale across multiple clouds simultaneously," said [Han Heloir](https://www.linkedin.com/in/hanheloiryan/), EMEA generative AI solutions architect at MongoDB. "Much of the architectural debt developers are facing stems from mismatches between object and relations systems, which kills agility, speed and performance." -![](https://cdn.thenewstack.io/media/f9c3c06e-mongodb.svg) +![](f9c3c06e-mongodb-9a81de3f.svg) [](https://www.mongodb.com/cloud/atlas/?utm_content=sponsor+module) diff --git a/content/posts/2025/07/16/getting-started-with-scala/Scala1.jpg b/content/posts/2025/07/16/getting-started-with-scala/Scala1.jpg new file mode 100644 index 000000000..e49f25d56 Binary files /dev/null and b/content/posts/2025/07/16/getting-started-with-scala/Scala1.jpg differ diff --git a/content/posts/2025/07/16/getting-started-with-scala/Scala1.png b/content/posts/2025/07/16/getting-started-with-scala/Scala1.png deleted file mode 100644 index 4b7faccf2..000000000 Binary files a/content/posts/2025/07/16/getting-started-with-scala/Scala1.png and /dev/null differ diff --git a/content/posts/2025/07/16/getting-started-with-scala/index.md b/content/posts/2025/07/16/getting-started-with-scala/index.md index 551cebe16..7312926ea 100644 --- a/content/posts/2025/07/16/getting-started-with-scala/index.md +++ b/content/posts/2025/07/16/getting-started-with-scala/index.md @@ -5,7 +5,7 @@ lastmod: "2025-07-16T06:42:21+00:00" description: "At Quantexa, we love Scala. This may be the first dedicated article on Foojay.io about Scala. I hope my colleagues and I can add more in due course." authors: - "steve-wilcockson" -image: "Scala1.png" +image: "Scala1.jpg" categories: - "Data Engineering" - "Scala" diff --git a/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/demo-app-picospot-channels-ce878674.jpg b/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/demo-app-picospot-channels-ce878674.jpg new file mode 100644 index 000000000..01d90babb Binary files /dev/null and b/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/demo-app-picospot-channels-ce878674.jpg differ diff --git a/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/djfranky-1-139270d8.jpg b/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/djfranky-1-139270d8.jpg new file mode 100644 index 000000000..a8a22d9f5 Binary files /dev/null and b/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/djfranky-1-139270d8.jpg differ diff --git a/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/dmx-fixtures-0c323cd4.jpg b/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/dmx-fixtures-0c323cd4.jpg new file mode 100644 index 000000000..bb0cff61a Binary files /dev/null and b/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/dmx-fixtures-0c323cd4.jpg differ diff --git a/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/index.md b/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/index.md index 075584904..a63939f6d 100644 --- a/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/index.md +++ b/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/index.md @@ -29,7 +29,7 @@ But first... ## A Personal Story I've always been fascinated by sound and light equipment. As a teenager (over 30 years ago...), I built two disco bars and used them as "DJ Franky" to bring ambiance to many weddings and other parties. I loved the DJ-ing, but I loved even more the technique of getting all the devices together and finding the best way to connect them, building custom housing, and creating the best possible connections. But there was one problem with this hobby, it all cost a lot of money... -![](https://webtechie.be/images/2025/dmx/djfranky-1.jpg) +![](djfranky-1-139270d8.jpg) Fast forward to now. Thanks to modern technology and improved production processes, prices have decreased significantly, allowing you to purchase marvelous pieces of technology at an affordable price. However, most of these can still be controlled by an "ancient" standard: DMX512. @@ -42,7 +42,7 @@ Let's start by explaining the standards used in this project. ### What is DMX512 [DMX512](https://en.wikipedia.org/wiki/DMX512) is a digital communication protocol, based on [RS-485](https://en.wikipedia.org/wiki/RS-485), widely used in professional lighting and stage equipment to control dimmers, moving lights, fog machines, and other effects. The protocol transmits data in a serial format over standard XLR cables, with each "universe" capable of controlling up to 512 channels of information. Each channel can carry values from 0 to 255, allowing for precise control of parameters such as brightness, color, position, and speed across multiple fixtures simultaneously. DMX512 has become the industry standard because it's reliable, relatively simple to implement, and allows complex lighting shows to be programmed and synchronized from a central console. -![](https://webtechie.be/images/2025/dmx/dmx-fixtures.png) +![](dmx-fixtures-0c323cd4.jpg) #### DMX512 Data Example @@ -75,7 +75,7 @@ But none of these are based on Java... ### What is Open Fixture Library The [Open Fixture Library (OFL)](https://open-fixture-library.org/) is a collaborative, open-source platform that addresses a persistent issue in lighting control: fixture definitions that are tied to specific software platforms. -![](https://webtechie.be/images/2025/dmx/ofl-picospot.png) +![](ofl-picospot-e8dd87df.jpg) The project emerged when lighting professionals wanted to switch between different software controllers, but discovered their fixture definitions couldn't be easily transferred. This meant recreating all their work from scratch – a time-consuming process the entire lighting community had been dealing with for years. @@ -116,7 +116,7 @@ I have the following fixtures connected to it: * Address 1 and 12: [PicoSpot 20 LED](https://www.thomann.de/intl/fun_generation_picospot_20_led.htm) with 11 channels. * Address 23 and 28 : [LED PARty TCL Spot](https://www.steinigke.de/en/mpn42110193-eurolite-led-party-tcl-spot.html) with 5 channels. -![](https://webtechie.be/images/2025/dmx/test-setup-2.jpg) +![](test-setup-2-15714e0b.jpg) ### Minimal Code Example @@ -213,7 +213,7 @@ List ipDevices = DMXIPDiscoverTool.discoverDevices(); ## DMX512 JavaFX Demo Project To demonstrate how the DMX data can be controlled from a user interface and what gets loaded from the OFL JSON files, a separate project has been created. It's also [available as open-source on GitHub](https://github.com/codewriterbv/DMX512-Demo). -![](https://webtechie.be/images/2025/dmx/demo-app-picospot-channels.png) +![](demo-app-picospot-channels-ce878674.jpg) ## Next Steps diff --git a/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/ofl-picospot-e8dd87df.jpg b/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/ofl-picospot-e8dd87df.jpg new file mode 100644 index 000000000..bb8d2ca7f Binary files /dev/null and b/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/ofl-picospot-e8dd87df.jpg differ diff --git a/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/test-setup-2-15714e0b.jpg b/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/test-setup-2-15714e0b.jpg new file mode 100644 index 000000000..0c20b517a Binary files /dev/null and b/content/posts/2025/07/25/introducing-a-new-java-dmx512-library-with-demo-javafx-user-interface/test-setup-2-15714e0b.jpg differ diff --git a/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXd3vk7tQ-oCw-eD57JSOJc_DY65JoyxYFQE-a15be1ea.png b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXd3vk7tQ-oCw-eD57JSOJc_DY65JoyxYFQE-a15be1ea.png new file mode 100644 index 000000000..14367d793 Binary files /dev/null and b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXd3vk7tQ-oCw-eD57JSOJc_DY65JoyxYFQE-a15be1ea.png differ diff --git a/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXdIPEJxYYZqyukpAJinuiDnsvFG9uevT3LS-8eff7327.jpg b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXdIPEJxYYZqyukpAJinuiDnsvFG9uevT3LS-8eff7327.jpg new file mode 100644 index 000000000..d600f5546 Binary files /dev/null and b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXdIPEJxYYZqyukpAJinuiDnsvFG9uevT3LS-8eff7327.jpg differ diff --git a/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXdP0ScEHyncW7h8ep-P8ZCQOXNbEV3X09F5-bc11c02f.png b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXdP0ScEHyncW7h8ep-P8ZCQOXNbEV3X09F5-bc11c02f.png new file mode 100644 index 000000000..4581ef590 Binary files /dev/null and b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXdP0ScEHyncW7h8ep-P8ZCQOXNbEV3X09F5-bc11c02f.png differ diff --git a/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXdmFSw89x4qIEwTxmdBEdpj8T8YZz1DHHAZ-3f5a9b62.jpg b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXdmFSw89x4qIEwTxmdBEdpj8T8YZz1DHHAZ-3f5a9b62.jpg new file mode 100644 index 000000000..8f1234696 Binary files /dev/null and b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXdmFSw89x4qIEwTxmdBEdpj8T8YZz1DHHAZ-3f5a9b62.jpg differ diff --git a/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXdw4TLmNXlUjXjCmX7Fi6n0Qt3PZVZkVMzm-aad0cac8.png b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXdw4TLmNXlUjXjCmX7Fi6n0Qt3PZVZkVMzm-aad0cac8.png new file mode 100644 index 000000000..6bc159283 Binary files /dev/null and b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXdw4TLmNXlUjXjCmX7Fi6n0Qt3PZVZkVMzm-aad0cac8.png differ diff --git a/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXeBKyEirFkCHi-9ewcIIVxy8TkRm3PHqlM4-63840a6a.png b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXeBKyEirFkCHi-9ewcIIVxy8TkRm3PHqlM4-63840a6a.png new file mode 100644 index 000000000..744cd80e0 Binary files /dev/null and b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXeBKyEirFkCHi-9ewcIIVxy8TkRm3PHqlM4-63840a6a.png differ diff --git a/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXfDezzE0jUR1QGLWki4cZuKmTWBDOuOVBZv-6d9f497d.png b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXfDezzE0jUR1QGLWki4cZuKmTWBDOuOVBZv-6d9f497d.png new file mode 100644 index 000000000..f8d2d7e18 Binary files /dev/null and b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXfDezzE0jUR1QGLWki4cZuKmTWBDOuOVBZv-6d9f497d.png differ diff --git a/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXf_7PUY7wOFl6C8408vhtXiVnBRmI9_1hwz-09191d20.png b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXf_7PUY7wOFl6C8408vhtXiVnBRmI9_1hwz-09191d20.png new file mode 100644 index 000000000..a7d2f44fc Binary files /dev/null and b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXf_7PUY7wOFl6C8408vhtXiVnBRmI9_1hwz-09191d20.png differ diff --git a/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXfiplRuE2wftZUml8Vt1awoHPvW4JiNwGRO-6ab93fb9.png b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXfiplRuE2wftZUml8Vt1awoHPvW4JiNwGRO-6ab93fb9.png new file mode 100644 index 000000000..1e14b091e Binary files /dev/null and b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/AD_4nXfiplRuE2wftZUml8Vt1awoHPvW4JiNwGRO-6ab93fb9.png differ diff --git a/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/index.md b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/index.md index 5c71e38e2..f03983342 100644 --- a/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/index.md +++ b/content/posts/2025/07/28/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/index.md @@ -173,7 +173,7 @@ What could be causing this? One of the first clues is the significant difference ## Real-time metrics: Detecting the bottleneck To better understand the system's behavior, the /movies/enriched-details endpoint was executed again, but this time, with MongoDB Atlas's[Real-Time Performance](https://www.mongodb.com/docs/atlas/real-time-performance-panel/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=why_your_dev_environment_should_mirror_production&utm_term=ricardo.mello) panel open. That's when a red flag appeared: CPU usage spiked to 100% during the request. -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdw4TLmNXlUjXjCmX7Fi6n0Qt3PZVZkVMzma2TrIKnfuYpM1XCtTtLJl0AdwQ82Z6tVBlcZv_fEhVn6aVblC_dgnkbGNvHlKCip1w1VOCxeKdzGWMEKmF2dzFJ_2DOSdSMQzaH3?key=PBvB2TCVxbZqZz48uwpcQg) +![](AD_4nXdw4TLmNXlUjXjCmX7Fi6n0Qt3PZVZkVMzm-aad0cac8.png) *Atlas real-time metrics* @@ -182,17 +182,17 @@ On the bottom-right, we also see the slowest operations pointing to the movies c ## Query insights: The detective tool Following the clues, the next logical step is to open [Query Insights](https://www.mongodb.com/blog/post/elevating-database-performance-introducing-query-insights-mongodb-atlas%20/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=why_your_dev_environment_should_mirror_production&utm_term=ricardo.mello), a tool that helps investigate performance issues in more detail. During the same time window, we can access the **Query Profiler** tab to view which operations took the longest to execute. There, we can often identify the query responsible for the high resource usage. -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdmFSw89x4qIEwTxmdBEdpj8T8YZz1DHHAZQ-kSbQhz96bcn90gi0OXb_19hViPCz08bZuU_rO8SUyzGfCvq4986M5w9mDyhKISC__x-Fdpgcu7Fa9m5_Ve6GQpir7G6Fcf52R7gg?key=PBvB2TCVxbZqZz48uwpcQg) +![](AD_4nXdmFSw89x4qIEwTxmdBEdpj8T8YZz1DHHAZ-3f5a9b62.jpg) *Query Profiler* As we can observe, between 18:00 and 19:00, the chart shows a clear spike in operation execution time. During this window, the duration of read operations on the movies collection increased quickly, starting from just a few milliseconds and reaching up to one minute. -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXfiplRuE2wftZUml8Vt1awoHPvW4JiNwGROr-C1bqnkNcAktsQ5NryA_ZO4ZMI1px-V-3AYeTIKlGn8l_yG2Hc49QPFaz6m8CPzDiEBqQgbA-mt8MEop6cTBb1FET1xXvsOc7P9rA?key=PBvB2TCVxbZqZz48uwpcQg) +![](AD_4nXfiplRuE2wftZUml8Vt1awoHPvW4JiNwGRO-6ab93fb9.png) *Query Profiler* This sudden escalation confirms that the query began consuming significantly more resources, which aligns with the symptoms we observed earlier in the real-time metrics. The Query Profiler provided more concrete details: It shows the exact aggregation that was running, the total execution time (1.03min), and the number of documents examined: -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdIPEJxYYZqyukpAJinuiDnsvFG9uevT3LSp1C9HRXo1xNTE8RqU4i04UUjQumXyhX1n42_K4CxECZ0ikociXT6b4Pj0SCQmSm-yl9eQwSXbXIyWy4Y4qDBa361HR67lCi0ROb8_A?key=PBvB2TCVxbZqZz48uwpcQg) +![](AD_4nXdIPEJxYYZqyukpAJinuiDnsvFG9uevT3LS-8eff7327.jpg) *Query Profiler* @@ -202,12 +202,12 @@ With this information in hand, we can move toward a proper optimization solution Continuing our analysis, we have the /by-title-year endpoint, which returns movies filtered by title and year. Once the application is live in production, this endpoint starts receiving several requests to look up specific movies. That's when we notice the query isn't optimized, and we might not even know exactly how to improve it. -This is where the [Performance Advisor](https://www.mongodb.com/docs/atlas/performance-advisor/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=why_your_dev_environment_should_mirror_production&utm_term=ricardo.mello) comes in. M10+ clusters offer this feature under the **Performance** menu, providing valuable suggestions based on real-world usage. Select your cluster and click on the **Performance Advisor** tab:![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXf_7PUY7wOFl6C8408vhtXiVnBRmI9_1hwzpSyYUY3nsxU-yVXcdCsLIbFlz5DQDGgNYZjeJoaiuVTfwEr9D-uRLrkqTi1e8bQ_eQ-1fimk_n9PR0nvZsOK0ih__VyY3fSk0lC2?key=PBvB2TCVxbZqZz48uwpcQg) +This is where the [Performance Advisor](https://www.mongodb.com/docs/atlas/performance-advisor/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=why_your_dev_environment_should_mirror_production&utm_term=ricardo.mello) comes in. M10+ clusters offer this feature under the **Performance** menu, providing valuable suggestions based on real-world usage. Select your cluster and click on the **Performance Advisor** tab:![](AD_4nXf_7PUY7wOFl6C8408vhtXiVnBRmI9_1hwz-09191d20.png) *Performance Advisor recommendations* In our scenario, the Performance Advisor is suggesting the creation of an index for our cluster. By selecting *View Recommendations*, we can view the specific index suggestion that may help improve query performance: -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXfDezzE0jUR1QGLWki4cZuKmTWBDOuOVBZvMpU91zrOmiezs3f9PCrou_vD6yH2XXY1VLIvY_TODQZYxrjs0OfFUWUsM-bWot79pLNQGZQuDjOzfNocFHVLwRkVy258Fvr9qSOP1w?key=PBvB2TCVxbZqZz48uwpcQg) +![](AD_4nXfDezzE0jUR1QGLWki4cZuKmTWBDOuOVBZv-6d9f497d.png) *Performance Advisor index suggestion* @@ -218,7 +218,7 @@ The query is quite simple, and the need for an index might be easy to spot manua ## Resilience under pressure: Testing primary failover A cluster configured in MongoDB Atlas operates as a replica set with three nodes. By default, there are two secondary nodes and one primary node, as shown in the image below: -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXd3vk7tQ-oCw-eD57JSOJc_DY65JoyxYFQEO5jZd5Y6MsXFnSiURlBc833kgZSesoXpjsXQVo5DWpEmEZtLBdtNbkeTU-3kykL4pSC3OIWGNUKy_RbsI1BApcNZyxdy99JrNNCV?key=PBvB2TCVxbZqZz48uwpcQg) +![](AD_4nXd3vk7tQ-oCw-eD57JSOJc_DY65JoyxYFQE-a15be1ea.png) *MongoDB replica set* @@ -269,12 +269,12 @@ This loop runs continuously, inserting and reading documents until the applicati ### Triggering the test in Atlas While the loop is running, open your MongoDB Atlas dashboard. Find the cluster you want to test, click the ⋮ (three dots) menu, and select **Test Resilience**. This will initiate the failover process and let you observe how your application behaves in real time. -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdP0ScEHyncW7h8ep-P8ZCQOXNbEV3X09F5-lmce3wHPGwpGTJMW7yPDl5bA-hRkcuYusLFQfYwsDVxoJ6Ano81ebrapVQe2mVbcIkxzFLN7qLHt4KFPUkvMN3kGkRfRNUxD0V32Q?key=PBvB2TCVxbZqZz48uwpcQg) +![](AD_4nXdP0ScEHyncW7h8ep-P8ZCQOXNbEV3X09F5-bc11c02f.png) *MongoDB Test Primary Failover* Once activated, simplyobserve your application logs to check for any anomalies or unexpected failures during the process. -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXeBKyEirFkCHi-9ewcIIVxy8TkRm3PHqlM4Nhta_dleWi01ea6CTSAsAkL--DySLj8D8xEkfSZtlBmBRdg-B4AYv77ZrkqUKyv6S8tpMZBE0MOIDvU8SGQD1s91weiIymLiA2zm6Q?key=PBvB2TCVxbZqZz48uwpcQg) +![](AD_4nXeBKyEirFkCHi-9ewcIIVxy8TkRm3PHqlM4-63840a6a.png) *Application log* diff --git a/content/posts/2025/07/29/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/Screenshot-2025-06-21-at-12.17.07-E2-80-201125cf.png b/content/posts/2025/07/29/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/Screenshot-2025-06-21-at-12.17.07-E2-80-201125cf.png new file mode 100644 index 000000000..a26660c33 Binary files /dev/null and b/content/posts/2025/07/29/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/Screenshot-2025-06-21-at-12.17.07-E2-80-201125cf.png differ diff --git a/content/posts/2025/07/29/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/index.md b/content/posts/2025/07/29/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/index.md index 5962f657d..f858fdc2f 100644 --- a/content/posts/2025/07/29/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/index.md +++ b/content/posts/2025/07/29/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/index.md @@ -6,7 +6,7 @@ description: "Learn how to build secure AI applications using LangChain4j guardr canonical: "https://bazlur.ca/2025/06/21/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/" authors: - "bazlur-rahman" -image: "u6131494527_1._Shield__AI_Brain_Concept__A_modern_minimalist__c6366e07-45bb-4d60-8f31-a4380e8e1bd8_0.png" +image: "u6131494527_1._Shield__AI_Brain_Concept__A_modern_minimalist__c6366e07-45bb-4d60-8f31-a4380e8e1bd8_0.jpg" categories: - "AI" - "Java" @@ -946,7 +946,7 @@ open http://localhost:8080 > The demo application includes all the guardrails discussed in this article, pre-configured and ready to test. Simply clone, run, and navigate to localhost:8080 to see them in action. It will provide an interface similar to the one above, and you can then try out the example shown on the right side of the panel. -![](https://bazlur.ca/wp-content/uploads/2025/06/Screenshot-2025-06-21-at-12.17.07%E2%80%AFPM-1024x832.png) +![](Screenshot-2025-06-21-at-12.17.07-E2-80-201125cf.png) ## Conclusion diff --git a/content/posts/2025/07/29/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/u6131494527_1._Shield__AI_Brain_Concept__A_modern_minimalist__c6366e07-45bb-4d60-8f31-a4380e8e1bd8_0.jpg b/content/posts/2025/07/29/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/u6131494527_1._Shield__AI_Brain_Concept__A_modern_minimalist__c6366e07-45bb-4d60-8f31-a4380e8e1bd8_0.jpg new file mode 100644 index 000000000..23a8aa1e1 Binary files /dev/null and b/content/posts/2025/07/29/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/u6131494527_1._Shield__AI_Brain_Concept__A_modern_minimalist__c6366e07-45bb-4d60-8f31-a4380e8e1bd8_0.jpg differ diff --git a/content/posts/2025/07/29/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/u6131494527_1._Shield__AI_Brain_Concept__A_modern_minimalist__c6366e07-45bb-4d60-8f31-a4380e8e1bd8_0.png b/content/posts/2025/07/29/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/u6131494527_1._Shield__AI_Brain_Concept__A_modern_minimalist__c6366e07-45bb-4d60-8f31-a4380e8e1bd8_0.png deleted file mode 100644 index 73f94f4e2..000000000 Binary files a/content/posts/2025/07/29/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/u6131494527_1._Shield__AI_Brain_Concept__A_modern_minimalist__c6366e07-45bb-4d60-8f31-a4380e8e1bd8_0.png and /dev/null differ diff --git a/content/posts/2025/07/31/javafx-links-of-july-2025/index.md b/content/posts/2025/07/31/javafx-links-of-july-2025/index.md index 1f7fff514..fea9ba705 100644 --- a/content/posts/2025/07/31/javafx-links-of-july-2025/index.md +++ b/content/posts/2025/07/31/javafx-links-of-july-2025/index.md @@ -5,7 +5,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of July 2025. Y canonical: "https://webtechie.be/post/2025-07-28-javafx-links-of-july-2025/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2025/07/31/javafx-links-of-july-2025/jfxcentral.jpg b/content/posts/2025/07/31/javafx-links-of-july-2025/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2025/07/31/javafx-links-of-july-2025/jfxcentral.jpg differ diff --git a/content/posts/2025/07/31/javafx-links-of-july-2025/jfxcentral.png b/content/posts/2025/07/31/javafx-links-of-july-2025/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2025/07/31/javafx-links-of-july-2025/jfxcentral.png and /dev/null differ diff --git a/content/posts/2025/08/04/release-v0-0-2-of-java-dmx512-library-with-universes-and-usb-to-dmx-support/demo-app-picospot-channels-ce878674.jpg b/content/posts/2025/08/04/release-v0-0-2-of-java-dmx512-library-with-universes-and-usb-to-dmx-support/demo-app-picospot-channels-ce878674.jpg new file mode 100644 index 000000000..01d90babb Binary files /dev/null and b/content/posts/2025/08/04/release-v0-0-2-of-java-dmx512-library-with-universes-and-usb-to-dmx-support/demo-app-picospot-channels-ce878674.jpg differ diff --git a/content/posts/2025/08/04/release-v0-0-2-of-java-dmx512-library-with-universes-and-usb-to-dmx-support/index.md b/content/posts/2025/08/04/release-v0-0-2-of-java-dmx512-library-with-universes-and-usb-to-dmx-support/index.md index 112aaab2b..925b930eb 100644 --- a/content/posts/2025/08/04/release-v0-0-2-of-java-dmx512-library-with-universes-and-usb-to-dmx-support/index.md +++ b/content/posts/2025/08/04/release-v0-0-2-of-java-dmx512-library-with-universes-and-usb-to-dmx-support/index.md @@ -117,7 +117,7 @@ The library I created is open-source with its [sources on GitHub](https://github ## DMX512 JavaFX Demo Project The JavaFX user interface demo application has been updated to use V0.0.2 of the library and has proven to work identically with IP-to-DMX and USB-to-DMX. Check the [sources on GitHub](https://github.com/codewriterbv/DMX512-Demo). -![](https://webtechie.be/images/2025/dmx/demo-app-picospot-channels.png) +![](demo-app-picospot-channels-ce878674.jpg) ## Next Steps diff --git a/content/posts/2025/08/07/semantic-caching-with-springboot-redis/0-6H8Qyn7gZW-fI-dE-3fe94eb0.webp b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/0-6H8Qyn7gZW-fI-dE-3fe94eb0.webp new file mode 100644 index 000000000..002674f17 Binary files /dev/null and b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/0-6H8Qyn7gZW-fI-dE-3fe94eb0.webp differ diff --git a/content/posts/2025/08/07/semantic-caching-with-springboot-redis/0-Fiq0hLEwAAh-Raij-d086f912.png b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/0-Fiq0hLEwAAh-Raij-d086f912.png new file mode 100644 index 000000000..9a93a8025 Binary files /dev/null and b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/0-Fiq0hLEwAAh-Raij-d086f912.png differ diff --git a/content/posts/2025/08/07/semantic-caching-with-springboot-redis/0-Q31EboPeCOEkT8hB-15ceba35.png b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/0-Q31EboPeCOEkT8hB-15ceba35.png new file mode 100644 index 000000000..7aa8764ad Binary files /dev/null and b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/0-Q31EboPeCOEkT8hB-15ceba35.png differ diff --git a/content/posts/2025/08/07/semantic-caching-with-springboot-redis/0-qe0eDWFW6VoJHQvM-6ac57570.webp b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/0-qe0eDWFW6VoJHQvM-6ac57570.webp new file mode 100644 index 000000000..7bee9bd7a Binary files /dev/null and b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/0-qe0eDWFW6VoJHQvM-6ac57570.webp differ diff --git a/content/posts/2025/08/07/semantic-caching-with-springboot-redis/1-eCSGHnfvU1obVePLTjQDuA-0ec0c6b6.png b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/1-eCSGHnfvU1obVePLTjQDuA-0ec0c6b6.png new file mode 100644 index 000000000..b0a91506b Binary files /dev/null and b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/1-eCSGHnfvU1obVePLTjQDuA-0ec0c6b6.png differ diff --git a/content/posts/2025/08/07/semantic-caching-with-springboot-redis/1-f0R9gBDSJQk8872lh2QMDQ-4762b875.png b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/1-f0R9gBDSJQk8872lh2QMDQ-4762b875.png new file mode 100644 index 000000000..479539d15 Binary files /dev/null and b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/1-f0R9gBDSJQk8872lh2QMDQ-4762b875.png differ diff --git a/content/posts/2025/08/07/semantic-caching-with-springboot-redis/1-mXjME1KfaR6i1ZCDpI9wdA-72a73049.png b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/1-mXjME1KfaR6i1ZCDpI9wdA-72a73049.png new file mode 100644 index 000000000..33297dfeb Binary files /dev/null and b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/1-mXjME1KfaR6i1ZCDpI9wdA-72a73049.png differ diff --git a/content/posts/2025/08/07/semantic-caching-with-springboot-redis/index.md b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/index.md index 4b2104f86..6a2865bbf 100644 --- a/content/posts/2025/08/07/semantic-caching-with-springboot-redis/index.md +++ b/content/posts/2025/08/07/semantic-caching-with-springboot-redis/index.md @@ -26,7 +26,7 @@ frozen: false > > It works by storing query-response pairs as vector embeddings in Redis, allowing your application to retrieve cached answers for similar questions without calling the expensive LLM, reducing both latency and costs. -![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*f0R9gBDSJQk8872lh2QMDQ.png) +![](1-f0R9gBDSJQk8872lh2QMDQ-4762b875.png) LLMs are powerful but expensive. Every API call costs money and takes time. When users ask similar questions like "What beer goes with grilled meat?" and "Which beer pairs well with barbecue?", traditional systems would make separate LLM calls even though these queries are essentially asking the same thing. @@ -290,19 +290,19 @@ This will start: When all services are running, go to `localhost:8080` to access the demo. You'll see a beer recommendation interface: -![](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*Fiq0hLEwAAh-Raij.png) +![](0-Fiq0hLEwAAh-Raij-d086f912.png) If you click on `Start Chat`, it may be that the embeddings are still being created, and you get a message asking for this operation to complete. This is the operation where the documents we'll search through will be turned into vectors and then stored in the database. It is done only the first time the app starts up and is required regardless of the vector database you use. -![](https://miro.medium.com/v2/resize:fit:1108/format:webp/0*Q31EboPeCOEkT8hB.png) +![](0-Q31EboPeCOEkT8hB-15ceba35.png) Once all the embeddings have been created, you can start asking your chatbot questions. It will semantically search through the documents we have stored, try to find the best answer for your questions, and cache the responses semantically in Redis: -![](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*6H8Qyn7gZW-fI-dE.gif) +![](0-6H8Qyn7gZW-fI-dE-3fe94eb0.webp) If you ask something similar to a question had already been asked, your chatbot will retrieve it from the cache instead of sending the query to the LLM. Retrieving an answer much faster now. -![](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*qe0eDWFW6VoJHQvM.gif) +![](0-qe0eDWFW6VoJHQvM-6ac57570.webp) RedisInsight provides a visual interface for exploring the cached data in Redis. Access it at `localhost:5540` to see: @@ -310,11 +310,11 @@ RedisInsight provides a visual interface for exploring the cached data in Redis. 2. **Vector Index Schema**: The schema used for similarity search 3. **Performance Metrics**: Monitor cache hit rates and response times -![captionless image](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*mXjME1KfaR6i1ZCDpI9wdA.png) +![captionless image](1-mXjME1KfaR6i1ZCDpI9wdA-72a73049.png) If you run the `FT.INFO semanticCachingIdx` command in the RedisInsight workbench, you'll see the details of the vector index schema that enables efficient semantic matching. -![captionless image](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*eCSGHnfvU1obVePLTjQDuA.png) +![captionless image](1-eCSGHnfvU1obVePLTjQDuA-0ec0c6b6.png) And that's it — you now have a working semantic caching system using Spring Boot and Redis. diff --git a/content/posts/2025/08/11/new-features-in-jakarta-ee-11-with-examples/image-4-1024x707-1.jpg b/content/posts/2025/08/11/new-features-in-jakarta-ee-11-with-examples/image-4-1024x707-1.jpg new file mode 100644 index 000000000..fef876fb3 Binary files /dev/null and b/content/posts/2025/08/11/new-features-in-jakarta-ee-11-with-examples/image-4-1024x707-1.jpg differ diff --git a/content/posts/2025/08/11/new-features-in-jakarta-ee-11-with-examples/image-4-1024x707-1.png b/content/posts/2025/08/11/new-features-in-jakarta-ee-11-with-examples/image-4-1024x707-1.png deleted file mode 100644 index 5ec0f56b1..000000000 Binary files a/content/posts/2025/08/11/new-features-in-jakarta-ee-11-with-examples/image-4-1024x707-1.png and /dev/null differ diff --git a/content/posts/2025/08/11/new-features-in-jakarta-ee-11-with-examples/index.md b/content/posts/2025/08/11/new-features-in-jakarta-ee-11-with-examples/index.md index 34c77797d..1be93395a 100644 --- a/content/posts/2025/08/11/new-features-in-jakarta-ee-11-with-examples/index.md +++ b/content/posts/2025/08/11/new-features-in-jakarta-ee-11-with-examples/index.md @@ -218,7 +218,7 @@ Virtual Threads enhance scalability and efficiency in cloud-native and serverles ## **Enhancements in the current APIs** Here's the full list of APIs that received updates: -![](image-4-1024x707-1.png) +![](image-4-1024x707-1.jpg) We'll quickly go through some of the most interesting enhancements. diff --git a/content/posts/2025/08/11/preparing-for-spring-framework-7-and-spring-boot-4/index.md b/content/posts/2025/08/11/preparing-for-spring-framework-7-and-spring-boot-4/index.md index 77bd88f65..3709f0794 100644 --- a/content/posts/2025/08/11/preparing-for-spring-framework-7-and-spring-boot-4/index.md +++ b/content/posts/2025/08/11/preparing-for-spring-framework-7-and-spring-boot-4/index.md @@ -5,7 +5,7 @@ lastmod: "2025-08-17T00:07:21+00:00" description: "Spring Boot 4 and Spring 7 bring API changes, native threads, and resilience. Prepare your codebase for the upgrade." authors: - "mahendra1413" -image: "spring.png" +image: "spring.jpg" categories: - "Jakarta EE" - "Java" diff --git a/content/posts/2025/08/11/preparing-for-spring-framework-7-and-spring-boot-4/spring.jpg b/content/posts/2025/08/11/preparing-for-spring-framework-7-and-spring-boot-4/spring.jpg new file mode 100644 index 000000000..9723a6720 Binary files /dev/null and b/content/posts/2025/08/11/preparing-for-spring-framework-7-and-spring-boot-4/spring.jpg differ diff --git a/content/posts/2025/08/11/preparing-for-spring-framework-7-and-spring-boot-4/spring.png b/content/posts/2025/08/11/preparing-for-spring-framework-7-and-spring-boot-4/spring.png deleted file mode 100644 index e490a2307..000000000 Binary files a/content/posts/2025/08/11/preparing-for-spring-framework-7-and-spring-boot-4/spring.png and /dev/null differ diff --git a/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXcPPLQVyrfCrA2YBUDLgj_MDv7hQa1gpTpE-b9cfe036.png b/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXcPPLQVyrfCrA2YBUDLgj_MDv7hQa1gpTpE-b9cfe036.png new file mode 100644 index 000000000..9112c035b Binary files /dev/null and b/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXcPPLQVyrfCrA2YBUDLgj_MDv7hQa1gpTpE-b9cfe036.png differ diff --git a/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXcq2s-go-k5tgvDUQ6HPSTLjtUNUEzQhYS0-48b1937c.jpg b/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXcq2s-go-k5tgvDUQ6HPSTLjtUNUEzQhYS0-48b1937c.jpg new file mode 100644 index 000000000..9a5183295 Binary files /dev/null and b/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXcq2s-go-k5tgvDUQ6HPSTLjtUNUEzQhYS0-48b1937c.jpg differ diff --git a/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXd3-33_1s0eUd8ZiqnKDJIlw7m23iGaylNH-0edfa94b.jpg b/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXd3-33_1s0eUd8ZiqnKDJIlw7m23iGaylNH-0edfa94b.jpg new file mode 100644 index 000000000..db4761504 Binary files /dev/null and b/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXd3-33_1s0eUd8ZiqnKDJIlw7m23iGaylNH-0edfa94b.jpg differ diff --git a/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXdujOcrNYgocscIEtbLBPYjwE6VJ7Y4Ieb9-ae9145f1.png b/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXdujOcrNYgocscIEtbLBPYjwE6VJ7Y4Ieb9-ae9145f1.png new file mode 100644 index 000000000..70700c079 Binary files /dev/null and b/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXdujOcrNYgocscIEtbLBPYjwE6VJ7Y4Ieb9-ae9145f1.png differ diff --git a/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXeNb5LNgWiKsljTH10PIxaBJqNFg2eFq7m7-5fcc0b13.jpg b/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXeNb5LNgWiKsljTH10PIxaBJqNFg2eFq7m7-5fcc0b13.jpg new file mode 100644 index 000000000..42efef4d9 Binary files /dev/null and b/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXeNb5LNgWiKsljTH10PIxaBJqNFg2eFq7m7-5fcc0b13.jpg differ diff --git a/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXeU1lUV71qq91DLAL39ZWmISnJR0xV7DClH-717da03a.png b/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXeU1lUV71qq91DLAL39ZWmISnJR0xV7DClH-717da03a.png new file mode 100644 index 000000000..87a77f2fc Binary files /dev/null and b/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/AD_4nXeU1lUV71qq91DLAL39ZWmISnJR0xV7DClH-717da03a.png differ diff --git a/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/index.md b/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/index.md index f6d63ce4f..c2e09c85f 100644 --- a/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/index.md +++ b/content/posts/2025/08/13/enforcing-governance-in-mongodb-atlas-with-resource-policies/index.md @@ -131,12 +131,12 @@ These policies can be organized in multiple .tf files and integrated into CI pip Once Resource Policies are applied via Terraform, it's possible to validate their enforcement using the Atlas UI or the administration API. Below is an example of a Terraform plan applying several policies to the organization: -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXeNb5LNgWiKsljTH10PIxaBJqNFg2eFq7m7LeRetHRfVW989P2iJRIuyXS5J9BQ1m7gthdAMoq73t_OxaIb8md6IRdT5yNZpwaYA6FqOB2Rj-EDx6rYSeOqfq9cpsQQBkQM53O1bw?key=FOpKAlLwLhYVlHz_DCq4KA) +![](AD_4nXeNb5LNgWiKsljTH10PIxaBJqNFg2eFq7m7-5fcc0b13.jpg) Resource Policies plan Once applied, the policies become visible in the MongoDB Atlas UI: -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXd3-33_1s0eUd8ZiqnKDJIlw7m23iGaylNHo3LJRF7OaAPdalIVeVnhsbxNwHMXNknrF8cZxfQQS4efyQe-Anuab0MIFqGatv1cl7ULqLBifFKowSg2PrMFy0Dax-QVBfAjkEH-Qw?key=FOpKAlLwLhYVlHz_DCq4KA) +![](AD_4nXd3-33_1s0eUd8ZiqnKDJIlw7m23iGaylNH-0edfa94b.jpg) Resource Policies in Atlas UI @@ -155,10 +155,10 @@ This endpoint returns a list of projects, clusters, or networks that violate cur *⚠️ Important: MongoDB Atlas does not automatically fix or block existing resources. If a resource is out of compliance, it will remain unchanged — the system only reports the violation, enabling visibility without disruption.* In the example below, a public IP was already configured in the project. After applying the policy that blocks 0.0.0.0/0, the resource was not removed, but it was flagged as non-compliant: -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXeU1lUV71qq91DLAL39ZWmISnJR0xV7DClHUNbT-mnuKPLog1cbHEQpT79-UQnoS_V7oJxyhvqnNlGGhb8rUvteHC6mq48-rQoOr7VQngPk2y3Pr6ow-N_14XjF44wAbg4FL5Gx?key=FOpKAlLwLhYVlHz_DCq4KA) +![](AD_4nXeU1lUV71qq91DLAL39ZWmISnJR0xV7DClH-717da03a.png) Network Access List in Atlas UI -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdujOcrNYgocscIEtbLBPYjwE6VJ7Y4Ieb9Do_OBos74927nNq8djW64_Imo2HdyRAGdI34rJ7qeCfkWJmVbvPgEIbAdRU-KEk5ERrynohTDCs3qteJjD75sNmpGxNQYVJmphGl9A?key=FOpKAlLwLhYVlHz_DCq4KA) +![](AD_4nXdujOcrNYgocscIEtbLBPYjwE6VJ7Y4Ieb9-ae9145f1.png) Non-compliant resources in Atlas @@ -167,14 +167,14 @@ Below are some visual examples of tests performed: ### **🚫 Attempt to create a cluster on Google Cloud Platform (GCP)** The policy allowed only AWS clusters. The operation was blocked as expected: -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXcq2s-go-k5tgvDUQ6HPSTLjtUNUEzQhYS0CGN_5fVErasvVtVEoFxyyBNZRJbKbYOo8_dHuux8qAifvsQtfqd-S03PVXPPqC0L95O3IkZBiyz9lSYVhiZUXV8V4r0fhjJQoxPbqA?key=FOpKAlLwLhYVlHz_DCq4KA) +![](AD_4nXcq2s-go-k5tgvDUQ6HPSTLjtUNUEzQhYS0-48b1937c.jpg) Cluster creation blocked by policy ### **🔒 Attempt to add a public IP (0.0.0.0/0)** The policy prevented the addition of a wildcard IP to the access list: -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXcPPLQVyrfCrA2YBUDLgj_MDv7hQa1gpTpEvub9UTJf6-eBptrjoZaFKu4GHo2oUuwi1gnyXBzH516lr17-4HyqqUmlsOdL5Nu_AJ1yqlp4TRl2mb0AqLYoA88Q1clCfJ91fZSr?key=FOpKAlLwLhYVlHz_DCq4KA) +![](AD_4nXcPPLQVyrfCrA2YBUDLgj_MDv7hQa1gpTpE-b9cfe036.png) Blocked: 0.0.0.0/0 not allowed diff --git a/content/posts/2025/08/15/domain-driven-design-in-java-a-practical-guide/AD_4nXdV6QfcM9LjeZjnl09UlO_xaD_oP1Mmei_a-b881c16d.jpg b/content/posts/2025/08/15/domain-driven-design-in-java-a-practical-guide/AD_4nXdV6QfcM9LjeZjnl09UlO_xaD_oP1Mmei_a-b881c16d.jpg new file mode 100644 index 000000000..0ac0c43d5 Binary files /dev/null and b/content/posts/2025/08/15/domain-driven-design-in-java-a-practical-guide/AD_4nXdV6QfcM9LjeZjnl09UlO_xaD_oP1Mmei_a-b881c16d.jpg differ diff --git a/content/posts/2025/08/15/domain-driven-design-in-java-a-practical-guide/index.md b/content/posts/2025/08/15/domain-driven-design-in-java-a-practical-guide/index.md index 3d867a5b3..2b1079095 100644 --- a/content/posts/2025/08/15/domain-driven-design-in-java-a-practical-guide/index.md +++ b/content/posts/2025/08/15/domain-driven-design-in-java-a-practical-guide/index.md @@ -41,7 +41,7 @@ Result: We would create a glossary for your domain (ubiquitous language) with te ## Modeling the core Airport domain in Java Open a new Spring Boot project (use Spring Initializr) in your IDE (like IntelliJ IDEA) and name it \`airport-domain-demo\` as a Maven project. -![Creating new Java Project using Spring Initializr](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdV6QfcM9LjeZjnl09UlO_xaD_oP1Mmei_aR_qUGhqGN1IAk0_vEAEDC_cOyh9LzE_In8_s4zZMBhTVt5m3-waXWiiOHwCWivEuFBYnmmqVW6RzqqXtLlcfsx3g96NJlno1hwLsXA?key=EKoTlsiGwMVY6pWycWj_Pg) +![Creating new Java Project using Spring Initializr](AD_4nXdV6QfcM9LjeZjnl09UlO_xaD_oP1Mmei_a-b881c16d.jpg) For the purpose of this demo, we will curtail our domain objects to a minimum, but in a real-world scenario, you would have a broader glossary of domain objects, their fields, and implementation than what's showcased in the demo. diff --git a/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXcHBlrf0iwb_08sugNXRXYFkOBN3AAn5kYb-b7885c8f.png b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXcHBlrf0iwb_08sugNXRXYFkOBN3AAn5kYb-b7885c8f.png new file mode 100644 index 000000000..a4a477add Binary files /dev/null and b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXcHBlrf0iwb_08sugNXRXYFkOBN3AAn5kYb-b7885c8f.png differ diff --git a/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXcOUJFtdcQjSY7m6B_S5OZMFTnbkfiGE_aV-18a6f385.png b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXcOUJFtdcQjSY7m6B_S5OZMFTnbkfiGE_aV-18a6f385.png new file mode 100644 index 000000000..187a65d6d Binary files /dev/null and b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXcOUJFtdcQjSY7m6B_S5OZMFTnbkfiGE_aV-18a6f385.png differ diff --git a/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXcXSEPB_M1PoAwHIF8KAds4wjFry4fnyhG8-0b0811d8.jpg b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXcXSEPB_M1PoAwHIF8KAds4wjFry4fnyhG8-0b0811d8.jpg new file mode 100644 index 000000000..1545140df Binary files /dev/null and b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXcXSEPB_M1PoAwHIF8KAds4wjFry4fnyhG8-0b0811d8.jpg differ diff --git a/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXdHZO7Y0SQdS3eA5oISfMG9kpkWJbaziO9O-73dd8169.png b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXdHZO7Y0SQdS3eA5oISfMG9kpkWJbaziO9O-73dd8169.png new file mode 100644 index 000000000..67714d8a4 Binary files /dev/null and b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXdHZO7Y0SQdS3eA5oISfMG9kpkWJbaziO9O-73dd8169.png differ diff --git a/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXdSDi6L2En8Oa8a3OlIRlT9ZdzXYA6woZwV-7f759932.jpg b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXdSDi6L2En8Oa8a3OlIRlT9ZdzXYA6woZwV-7f759932.jpg new file mode 100644 index 000000000..9d8684664 Binary files /dev/null and b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXdSDi6L2En8Oa8a3OlIRlT9ZdzXYA6woZwV-7f759932.jpg differ diff --git a/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXeVuZv0c29tZDdyYL4dNeMZ1vgSsm6DokhJ-a79a03fa.png b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXeVuZv0c29tZDdyYL4dNeMZ1vgSsm6DokhJ-a79a03fa.png new file mode 100644 index 000000000..08ebb72f3 Binary files /dev/null and b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXeVuZv0c29tZDdyYL4dNeMZ1vgSsm6DokhJ-a79a03fa.png differ diff --git a/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXevi6FN-4B5bR-LTWGjefrehLaoUnhblU-b-289c7aab.png b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXevi6FN-4B5bR-LTWGjefrehLaoUnhblU-b-289c7aab.png new file mode 100644 index 000000000..031c434f4 Binary files /dev/null and b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXevi6FN-4B5bR-LTWGjefrehLaoUnhblU-b-289c7aab.png differ diff --git a/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXezzrF-a6Yfbnrw0mIh1hRoZOyEh_35iyro-d4a22339.png b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXezzrF-a6Yfbnrw0mIh1hRoZOyEh_35iyro-d4a22339.png new file mode 100644 index 000000000..5bf609df9 Binary files /dev/null and b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXezzrF-a6Yfbnrw0mIh1hRoZOyEh_35iyro-d4a22339.png differ diff --git a/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXfg_G5VO7eKsxhOgrBV1hY6PsfJCvs8wptK-ef0ed9e2.jpg b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXfg_G5VO7eKsxhOgrBV1hY6PsfJCvs8wptK-ef0ed9e2.jpg new file mode 100644 index 000000000..e9e9caad1 Binary files /dev/null and b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXfg_G5VO7eKsxhOgrBV1hY6PsfJCvs8wptK-ef0ed9e2.jpg differ diff --git a/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXfoiUUy1S50hNIUGC05dgOEn0cWFCiRNPTn-46661f16.png b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXfoiUUy1S50hNIUGC05dgOEn0cWFCiRNPTn-46661f16.png new file mode 100644 index 000000000..d698e0643 Binary files /dev/null and b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/AD_4nXfoiUUy1S50hNIUGC05dgOEn0cWFCiRNPTn-46661f16.png differ diff --git a/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/index.md b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/index.md index ea5b00e5c..41a9a9afb 100644 --- a/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/index.md +++ b/content/posts/2025/08/20/managing-mongodb-database-changes-using-liquibase-pro/index.md @@ -59,7 +59,7 @@ Liquibase supports MongoDB versions starting from 5.0 onwards: 5.x, 6.x, 7.x, 8. 2. Place the above four JAR files in the specified path C:\\Program Files\\liquibase\\lib: -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdHZO7Y0SQdS3eA5oISfMG9kpkWJbaziO9O4s6cB34yOit-MbJY5i5sYcwkyz4GYUAqZ-U_sYTLvqDShXiVwx4xQHGpazKkYG1CZHwe8X-QKVpiwjjvz7sp-3yv0l_FY2wfViPA?key=kYj68YH2LkWKvX_ueHC8rQ)list of jarfiles required for this project +![](AD_4nXdHZO7Y0SQdS3eA5oISfMG9kpkWJbaziO9O-73dd8169.png)list of jarfiles required for this project ### Connection configuration @@ -98,7 +98,7 @@ Initialized empty Git repository in E:/temp/liquibase-mdb-demo/.git/ PS E:\temp\liquibase-mdb-demo> ``` -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdSDi6L2En8Oa8a3OlIRlT9ZdzXYA6woZwVhuPNpNwt-NSaWS4hsTcCm3j0qxuc4VpkvWXFfOWO4ouHaly5DstFEBVwnMWvIAxwc06JQ4dWLX41P1kPOIVJknGJ8AtZvUASrawfhA?key=kYj68YH2LkWKvX_ueHC8rQ) +![](AD_4nXdSDi6L2En8Oa8a3OlIRlT9ZdzXYA6woZwV-7f759932.jpg) Figure: Git project structure and its files @@ -206,12 +206,12 @@ PS E:\temp\liquibase-mdb-demo After successful execution, you will be redirected to HTML report generation for the same execution process for detailed audit process. This screenshot shows a **Liquibase Update Report** , confirming a successful database update. The report indicates that **two change sets** were executed with **no previous runs, no filters, and no deployment failures**, meaning all intended changes were applied cleanly. The message "Rows affected: 0" suggests schema-level updates (e.g., table creation or modification) rather than data changes. This ensures the changelog is working as expected and keeps the database schema version-controlled and consistent. -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXeVuZv0c29tZDdyYL4dNeMZ1vgSsm6DokhJB76uM8hguICmDqseOUPi-QaXdKZKm8cy42gGmHrU2usnIjAXUL9bGlBOuQVilelJnYXjY34QI-Hpv06dEgTEpIhZZ0JvR5BSOdvyew?key=kYj68YH2LkWKvX_ueHC8rQ) +![](AD_4nXeVuZv0c29tZDdyYL4dNeMZ1vgSsm6DokhJ-a79a03fa.png) Figure: Post deployment HTML report generated regarding deployed change. This Liquibase report shows that **two changesets** were successfully executed with **zero failures or skips** . The changeset with ID 2025062202 inserted multiple documents into a MongoDB collection named person, adding sample data. These changes were defined in a JSON changelog file (changelog.json) and executed by user *Ravindar*. It confirms that Liquibase is being used to version and track NoSQL schema/data changes reliably. -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXevi6FN-4B5bR-LTWGjefrehLaoUnhblU-blEyp2rlcb-fkcc9EiQvZHb52sxn3tVa6KH2CipygGwV3F2Rzd3EydHDUHYdu3fcvBk8IN6zomvn45G6rDbO58-kbbrosGYIt1Y8HBA?key=kYj68YH2LkWKvX_ueHC8rQ) +![](AD_4nXevi6FN-4B5bR-LTWGjefrehLaoUnhblU-b-289c7aab.png) Figure: HTML report with Changelog information @@ -220,7 +220,7 @@ It creates the collection named as **person**and inserts data as provided in the Log in to the MongoDB database and check the collection and data inside the collection for newly created ones. This screenshot from **MongoDB Compass** shows the successful insertion of four documents into the person collection in the testdb database. The data was pushed using **Liquibase**, as verified by the earlier changeset execution report, demonstrating how Liquibase can manage and apply structured NoSQL data changes to MongoDB collections in a controlled, versioned manner. -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXezzrF-a6Yfbnrw0mIh1hRoZOyEh_35iyroRND48O2wbsrzq62KqhBTOUyY5lRo97Hn-vXD4_6bM5sczubd1aXSFj9XroFManhkzfDrsWXc0zRCaLU1RmiMFMDxkxwTXcWCTbPesA?key=kYj68YH2LkWKvX_ueHC8rQ) +![](AD_4nXezzrF-a6Yfbnrw0mIh1hRoZOyEh_35iyro-d4a22339.png) Figure: Post deployment, documents reflected in the Person collection of testdb database. @@ -258,19 +258,19 @@ PS E:\temp\liquibase-mdb-demo> This screenshot demonstrates a successful **Liquibase rollback** operation and its effect on the **MongoDB** **person** **collection**. It confirms that one changeset (2025062202) was rolled back successfully using the rollbackCount command. This changeset originally inserted multiple documents into the person collection. -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXcHBlrf0iwb_08sugNXRXYFkOBN3AAn5kYbaQV4YKDkRY9W4PVsDsZ5Ujcwu2HZFNWGAeO1lJgFgIRKGOZcMfICTRBbLtfQKx3FUv2eAz2Hl32Rv-ta1PcO953cDJRpDmKUY-Fb8g?key=kYj68YH2LkWKvX_ueHC8rQ)Figure: HTML report after rollback changes completed +![](AD_4nXcHBlrf0iwb_08sugNXRXYFkOBN3AAn5kYb-b7885c8f.png)Figure: HTML report after rollback changes completed This screenshot from **MongoDB Compass** shows that the person collection is now empty, verifying that the rollback removed the inserted documents. This highlights how Liquibase can manage and reverse schema or data changes in MongoDB with precision and traceability. The database changes reflect in Compass for the same as shown below: -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXfoiUUy1S50hNIUGC05dgOEn0cWFCiRNPTnPZbNN2Bm-akFJcfyWfVsLF0vm8yhrmOF22Pf5jKgkGv8VY0pe64d-TeChkOwT_FO5pMPjjSX5gL_s_Trc_35ZgzN8FG_TIT1P_kqUA?key=kYj68YH2LkWKvX_ueHC8rQ) +![](AD_4nXfoiUUy1S50hNIUGC05dgOEn0cWFCiRNPTn-46661f16.png) Figure: Post rollback, collection is empty. In Liquibase with MongoDB, two special collections are automatically created and managed by Liquibase to track and control database changes: This table explains two important internal collections used by **Liquibase in MongoDB** to manage database change tracking and ensure safe deployments. The **databasechangelog** collection keeps a record of all applied changesets, including details like the id, author, filename, and dateExecuted, so Liquibase knows what has already been executed. The **databasechangeloglock** collection is used to **prevent concurrent updates** by managing a locking mechanism. It includes fields like locked, lockGranted, and lockedBy, ensuring that only one process can apply changes at a time, avoiding conflicts or duplicate executions. -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXcOUJFtdcQjSY7m6B_S5OZMFTnbkfiGE_aV9GOUbWfvdmVsxWyUIDYfmurFa8zSDFsUryBqv9z2BwoDwRmO-17tyBerjUVncma4G5y5QJZ3W1dKrk4Enf04484GvHCjDOFZ9GI1Ww?key=kYj68YH2LkWKvX_ueHC8rQ) +![](AD_4nXcOUJFtdcQjSY7m6B_S5OZMFTnbkfiGE_aV-18a6f385.png) Figure: Liquibase generated collections inside the MongoDB database. @@ -279,7 +279,7 @@ Figure: Liquibase generated collections inside the MongoDB database. * databasechangelog = "What changes have been applied?" * databasechangeloglock = "Is someone already running Liquibase right now?" -![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXfg_G5VO7eKsxhOgrBV1hY6PsfJCvs8wptKh3qnWsoFTpgdl1OuTubRQrE0GXKJP138ldkVylVp5jJkPPIbEjtlqgY44gSzTPLuhC9Vw5kgQgVww9hiFDNfBXhVV0S7hTewwgokgw?key=kYj68YH2LkWKvX_ueHC8rQ)Figure: Databasechangelog collection documents![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXcXSEPB_M1PoAwHIF8KAds4wjFry4fnyhG89JF_pNQcDwFAE-lG1NWAVu6Ix6Mp5Eu9uSv6YAWoAV-uxQQE17lL6B2KOUETl8-HXjFdMVAB0_SFFKOXvrBONuuJ3WVfF-SCmffryA?key=kYj68YH2LkWKvX_ueHC8rQ)Figure: Databasechangeloglock collection document +![](AD_4nXfg_G5VO7eKsxhOgrBV1hY6PsfJCvs8wptK-ef0ed9e2.jpg)Figure: Databasechangelog collection documents![](AD_4nXcXSEPB_M1PoAwHIF8KAds4wjFry4fnyhG8-0b0811d8.jpg)Figure: Databasechangeloglock collection document ### **5. Scripts used for this project** diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-02027ac4.png b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-02027ac4.png new file mode 100644 index 000000000..69efbab1e Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-02027ac4.png differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-08df74d7.png b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-08df74d7.png new file mode 100644 index 000000000..a620a3889 Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-08df74d7.png differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-101a6589.jpg b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-101a6589.jpg new file mode 100644 index 000000000..a5464a904 Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-101a6589.jpg differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-212a920a.png b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-212a920a.png new file mode 100644 index 000000000..7677829e4 Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-212a920a.png differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-59e9523f.png b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-59e9523f.png new file mode 100644 index 000000000..7968533e3 Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-59e9523f.png differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-62811c72.png b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-62811c72.png new file mode 100644 index 000000000..80cb123a5 Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-62811c72.png differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-635765cc.jpg b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-635765cc.jpg new file mode 100644 index 000000000..8db054b19 Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-635765cc.jpg differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-6d0bcc27.png b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-6d0bcc27.png new file mode 100644 index 000000000..98bf8770f Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-6d0bcc27.png differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-7fb1c1e3.png b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-7fb1c1e3.png new file mode 100644 index 000000000..656256bc7 Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-7fb1c1e3.png differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-89609a67.jpg b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-89609a67.jpg new file mode 100644 index 000000000..f85d29910 Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-89609a67.jpg differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-b9cfb119.jpg b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-b9cfb119.jpg new file mode 100644 index 000000000..fae678c03 Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-b9cfb119.jpg differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c0212e7d.png b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c0212e7d.png new file mode 100644 index 000000000..6d4731d5c Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c0212e7d.png differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c340a674.png b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c340a674.png new file mode 100644 index 000000000..366ac9119 Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c340a674.png differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-d1c4aa41.png b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-d1c4aa41.png new file mode 100644 index 000000000..c97bdfff9 Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-d1c4aa41.png differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-d2147212.png b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-d2147212.png new file mode 100644 index 000000000..7db6e2180 Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-d2147212.png differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-d7b2bedb.png b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-d7b2bedb.png new file mode 100644 index 000000000..2302bc60f Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-d7b2bedb.png differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-dc47bc3c.jpg b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-dc47bc3c.jpg new file mode 100644 index 000000000..d8c9b6e65 Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-dc47bc3c.jpg differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-fd7012e7.png b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-fd7012e7.png new file mode 100644 index 000000000..fadae1e77 Binary files /dev/null and b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/https-3A-2F-2Fdev-to-uploads.s3.amazonaw-fd7012e7.png differ diff --git a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/index.md b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/index.md index a1d8c20a9..d63eb22e9 100644 --- a/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/index.md +++ b/content/posts/2025/08/25/ai-gives-time-not-confidence-developer-productivity-toolkit/index.md @@ -46,7 +46,7 @@ Now, what about pointing the AI at a specific issue ticket and your actual codeb * **AI Tool integration**: MCP servers (more details below) connect your AI assistant directly to servers in order to add capabilities to the Agent. In this case it's the Github API that will give read or write information regarding the current repository issues. As an example, you can use Github Code Spaces [with Copilot Agent Mode](https://github.blog/changelog/2025-04-11-vscode-copilot-agent-mode-in-codespaces/) , and it will give us an explanation of the ticket and the changes to do. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwmiiobapci559gq7ddv.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwmiiobapci559gq7ddv.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-635765cc.jpg)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-635765cc.jpg) **Important Caveats:** @@ -61,7 +61,7 @@ Okay, let's talk about actually producing Java code. This is where tools like `G * **Generating Snippets and Methods:** Write a clear method signature and the AI will generate a surprisingly decent implementation. You can use different methods to generate code:. * **Inline chats** Ask the assistant to generate `"Java method to fetch data from API endpoint XYZ and parse the JSON response"` and wait a bit. The AI might suggest the entire method body using `HttpClient` or `RestTemplate`. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1oou6ymc7jo5n6egojjf.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1oou6ymc7jo5n6egojjf.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-dc47bc3c.jpg)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-dc47bc3c.jpg) * **Ghost text** : Start typing a typical Spring Boot controller method like `@GetMapping("/products/{id}") public ResponseEntity getProductById` ... The AI will likely suggest the code to call a service and return the response. @@ -73,7 +73,7 @@ These tools use the **context of your project** to tailor suggestions. But how d * **Chat \& Explicit Prompts:** Mentioning specific class/method names from your project or pasting relevant snippets guides the AI. For example: *"Using our `CustomerService` class, generate the boilerplate code for a new method `findCustomerByEmail(String email)` that calls the `customerRepository`."* * **Codebase Awareness:** Specialized tools using Agents can be set up to index your entire codebase. This allows for much deeper context, potentially leading to suggestions that understand your project's specific patterns even if the relevant files aren't currently open. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0zb3f80h0vgnr5vf9vz.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0zb3f80h0vgnr5vf9vz.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-fd7012e7.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-fd7012e7.png) List of context elements to add in a chat @@ -97,7 +97,7 @@ It takes a little getting used to, and you absolutely ***must*** review the gene **Integrating Specialized Agents and Reasoning in Agentic IDEs:** Agentic IDEs can significantly enhance code generation by employing various specialized agents, each tailored for specific tasks like API interaction, database querying, or UI component creation. Moreover, these IDEs can provide detailed reasoning behind the generated code, outlining the steps taken improving developer understanding and trust in the AI's output. In tools like *`VS Code with Github Copilot`* or *`Cursor`*, we can even tailor the behaviour of the agents when they generate code. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd16gjevpo423gmqu7ra7.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd16gjevpo423gmqu7ra7.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-02027ac4.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-02027ac4.png) Here we can specify to use the latest Java 24 features, or a specific version of Quarkus, or even which front end frameworks to use, among other particularities of your code. @@ -110,10 +110,10 @@ For instance, using an MCP server connected to a database tool, the assistant ca There are several places where we can get MCP servers for specific tasks and with a very easy installation process : , , , etc. This is an example of installation of a Docker MCP server implementing the GitHub tools, that will allow our assistant to connect to our GitHub repository and get issues, branches, PRs, etc. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft61rxfndt7g65xyyk6ob.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft61rxfndt7g65xyyk6ob.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c0212e7d.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c0212e7d.png) These MCP servers expose tools to be used by the agent. In this case the Github MCP Server share 36 tools : -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj1khjqdbiw4benug1ae0.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj1khjqdbiw4benug1ae0.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-62811c72.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-62811c72.png) Okay, so your Java code is looking good. Now, how about actually shipping it? Getting applications deployed to the cloud involves writing a *lot* of configuration – Dockerfiles to containerize your app, Kubernetes YAML for orchestration, and CI/CD pipeline definitions (`GitHub Actions`, `GitLab CI`, etc.). @@ -128,7 +128,7 @@ This is another area where AI assistants can save you significant time and effor **Agentic MCP AI is your friend:** Getting the logs or the configuration for running apps in your cluster can be crucial to produce more aligned code. For instance, getting the CRDs in your cluster can help you create a better Kubernetes operator that reacts to changes on them. You can rely on the multiple MCP servers with your Agentic AI assistant to consider that information when you are chatting with it. [Kubernetes MCP server](https://github.com/manusa/kubernetes-mcp-server) is a clear example of this and it gives you 15 tools to interact with your K8s cluster. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffesa1qjyfk42sibu1u7r.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffesa1qjyfk42sibu1u7r.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-89609a67.jpg)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-89609a67.jpg) VS Code with Github Copilot using Kubernetes MCP to interact with a local cluster @@ -161,10 +161,10 @@ Ah, testing. We all know it's crucial for catching regressions, ensuring correct * **Creating Mock Objects:** Setting up mocks can be tedious. AI assistants can often generate the necessary `@Mock` annotations, injection points (`@InjectMocks`), and `when(...).thenReturn(...)` statements based on how your class interacts with its dependencies. For example: *"Generate a JUnit test for this `OrderService` method, mocking the `ProductRepository`"* Copilot chat asking it to generate the test methods -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhr6k7k2vst9u1cxqlnm.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhr6k7k2vst9u1cxqlnm.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-b9cfb119.jpg)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-b9cfb119.jpg) Tests generated by Copilot for this method -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffypfw3639irjd6a4ceun.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffypfw3639irjd6a4ceun.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-6d0bcc27.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-6d0bcc27.png) **⚠️ HUGE WARNING: Review Generated Tests Like Crazy! ⚠️** @@ -174,7 +174,7 @@ This is possibly even more critical than reviewing generated application code: * * **AI Doesn't Understand Intent:** AI tests the code *as it's written* . It doesn't know the *business requirements* or the *intended behavior*. If your code has a bug, the AI might happily generate a test that confirms the buggy behavior!. In this case it doesn't make any sense to have a total tax of -1000 , and AI has tested that the test is really verifying what the code is doing, including the bug. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1b191ybskalf6niaerx.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1b191ybskalf6niaerx.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-7fb1c1e3.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-7fb1c1e3.png) * **Trivial and Meaningless Tests:** AI often generates tests for simple getters/setters or very basic logic that might not provide much value. It might miss the truly complex or critical paths. * **Incorrect Assertions:** The assertions generated might be wrong, incomplete, or nonsensical. Don't assume they are correct. @@ -189,7 +189,7 @@ This is possibly even more critical than reviewing generated application code: * * **Don't Chase Coverage Blindly:** AI can quickly increase test coverage numbers, but coverage isn't the same as quality. A few meaningful tests are better than hundreds of trivial ones. * **Provide the right context:** including functional testing information, or feature requirements will help AI assistants to tailor the test to what it's supposed to be tested and not what it is written in the code. In this case we are asking to create the tests but considering the requirements specified in a github issue. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh0r1h1w4wg7usbkpwqji.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh0r1h1w4wg7usbkpwqji.png) [![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flb3lnc9f7bshzjxtajpi.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flb3lnc9f7bshzjxtajpi.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-101a6589.jpg)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-101a6589.jpg) [![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-212a920a.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-212a920a.png) **Don't Forget Static Analysis for Test Code:** @@ -209,7 +209,7 @@ Alright, let's talk about pull requests (PRs) and code reviews. They're super im * **Quick Summaries:** Tools like `GitHub Copilot` can automatically generate summaries of the changes in a PR. This helps reviewers quickly grasp the purpose and scope of the changes before diving into the code details. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwvjw8eqlk26i4lx5su6.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwvjw8eqlk26i4lx5su6.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-d2147212.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-d2147212.png) They can even interact with the PR using extensions in order to provide functionalities that are out of the scope of the LLM like creating Mermaid diagrams for the classes. @@ -227,7 +227,7 @@ This is crucial: **AI is a code review *assistant*, not a replacement for human * **Context is King:** AI often lacks the deep understanding of the project's history, overall architecture, business requirements, and long-term goals that experienced human reviewers bring. Add the proper context for each prompt. You can even guide AI answers with the Personal instructions directly in the Github Pull Request page. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24d93kyk1yodjq1jyvie.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24d93kyk1yodjq1jyvie.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-d1c4aa41.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-d1c4aa41.png) * **Design \& Logic Still Need Humans:** AI is generally poor at evaluating the *appropriateness* of a design choice or the correctness of complex business logic. That requires human critical thinking. * **Knowledge Sharing:** Code reviews are vital for team learning and knowledge sharing – something AI assistance doesn't replace. @@ -246,7 +246,7 @@ Where AI *can* be a valuable assistant is in helping *you*, the developer, under * **Learning Best Practices:** Use AI to ask questions about secure coding practices (`"What are common pitfalls with Java serialization?"`) . **⚠️ THE GIANT RED FLAG: AI IS NOT RELIABLE FOR ISSUE DETECTION ⚠️** -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9y1fj6ey71lony7m4yg2.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9y1fj6ey71lony7m4yg2.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-d7b2bedb.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-d7b2bedb.png) @@ -263,17 +263,17 @@ Because AI cannot be trusted for reliable issue detection, you **must** use dedi * **Best practices:** * Use tooling as soon as possible in your SDLC. Incorporate these SAST tools in the IDE to analyze the quality of your code at the same time you are introducing new changes. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7j0nqcmad39jj7wc3umu.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7j0nqcmad39jj7wc3umu.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-59e9523f.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-59e9523f.png) SonarQube IDE view with an issue and its explanation * Connect your CI/CD pipeline with a Quality Gate tool in order to ensure no bad code is going to be merged to your main branch. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhvfup7i13i8gfv4jxz0t.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhvfup7i13i8gfv4jxz0t.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-08df74d7.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-08df74d7.png) * Use Quality Gate messages in your Pull Requests through PR decoration. -[![Image description](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6tlhpzwolf8lmsa54n40.png)](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6tlhpzwolf8lmsa54n40.png) +[![Image description](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c340a674.png)](https-3A-2F-2Fdev-to-uploads.s3.amazonaw-c340a674.png) **Essential Supporting Pillars: Testing and Reviews using Human skills** diff --git a/content/posts/2025/08/26/what-happens-when-a-primary-fails-in-a-mongodb-replica-set-automatic-failovers/index.md b/content/posts/2025/08/26/what-happens-when-a-primary-fails-in-a-mongodb-replica-set-automatic-failovers/index.md index 5117d0dad..4c9fd1456 100644 --- a/content/posts/2025/08/26/what-happens-when-a-primary-fails-in-a-mongodb-replica-set-automatic-failovers/index.md +++ b/content/posts/2025/08/26/what-happens-when-a-primary-fails-in-a-mongodb-replica-set-automatic-failovers/index.md @@ -5,7 +5,7 @@ lastmod: "2025-08-26T15:16:01+00:00" description: "Whether you're designing scalable backend systems or just dividing your database into distributed databases, understanding how automatic failover works is key." authors: - "shrey-batra" -image: "shrey.png" +image: "shrey.jpg" categories: - "Databases" - "Mongo" diff --git a/content/posts/2025/08/26/what-happens-when-a-primary-fails-in-a-mongodb-replica-set-automatic-failovers/shrey.jpg b/content/posts/2025/08/26/what-happens-when-a-primary-fails-in-a-mongodb-replica-set-automatic-failovers/shrey.jpg new file mode 100644 index 000000000..9f1fcdce3 Binary files /dev/null and b/content/posts/2025/08/26/what-happens-when-a-primary-fails-in-a-mongodb-replica-set-automatic-failovers/shrey.jpg differ diff --git a/content/posts/2025/08/26/what-happens-when-a-primary-fails-in-a-mongodb-replica-set-automatic-failovers/shrey.png b/content/posts/2025/08/26/what-happens-when-a-primary-fails-in-a-mongodb-replica-set-automatic-failovers/shrey.png deleted file mode 100644 index 561ea0ca4..000000000 Binary files a/content/posts/2025/08/26/what-happens-when-a-primary-fails-in-a-mongodb-replica-set-automatic-failovers/shrey.png and /dev/null differ diff --git a/content/posts/2025/08/31/javafx-links-of-august-2025/index.md b/content/posts/2025/08/31/javafx-links-of-august-2025/index.md index fe385d833..f5e2e87ed 100644 --- a/content/posts/2025/08/31/javafx-links-of-august-2025/index.md +++ b/content/posts/2025/08/31/javafx-links-of-august-2025/index.md @@ -5,7 +5,7 @@ description: "Here are the links shared on jfx-central.com in the August summary canonical: "https://www.jfx-central.com/links" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2025/08/31/javafx-links-of-august-2025/jfxcentral.jpg b/content/posts/2025/08/31/javafx-links-of-august-2025/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2025/08/31/javafx-links-of-august-2025/jfxcentral.jpg differ diff --git a/content/posts/2025/08/31/javafx-links-of-august-2025/jfxcentral.png b/content/posts/2025/08/31/javafx-links-of-august-2025/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2025/08/31/javafx-links-of-august-2025/jfxcentral.png and /dev/null differ diff --git a/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/AVvXsEgUY4KFBmiVd1c2UOHjvjaxx_cZC5LyyN67-9bd39d81.jpg b/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/AVvXsEgUY4KFBmiVd1c2UOHjvjaxx_cZC5LyyN67-9bd39d81.jpg new file mode 100644 index 000000000..98ee2a1d8 Binary files /dev/null and b/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/AVvXsEgUY4KFBmiVd1c2UOHjvjaxx_cZC5LyyN67-9bd39d81.jpg differ diff --git a/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/AVvXsEgdrHJagJ8mTUfYjICR7XmoWcxNa0sCNIjY-2d510350.jpg b/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/AVvXsEgdrHJagJ8mTUfYjICR7XmoWcxNa0sCNIjY-2d510350.jpg new file mode 100644 index 000000000..eb1bea081 Binary files /dev/null and b/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/AVvXsEgdrHJagJ8mTUfYjICR7XmoWcxNa0sCNIjY-2d510350.jpg differ diff --git a/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/AVvXsEgrL2SF6gKWQG6_n7P7y7GqR_zR7FFb6oTs-e008e35c.jpg b/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/AVvXsEgrL2SF6gKWQG6_n7P7y7GqR_zR7FFb6oTs-e008e35c.jpg new file mode 100644 index 000000000..db6405e66 Binary files /dev/null and b/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/AVvXsEgrL2SF6gKWQG6_n7P7y7GqR_zR7FFb6oTs-e008e35c.jpg differ diff --git a/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/AVvXsEh3SRQqyIQq-vygd2VoFPj4Zv7F2oXY3are-1471312d.png b/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/AVvXsEh3SRQqyIQq-vygd2VoFPj4Zv7F2oXY3are-1471312d.png new file mode 100644 index 000000000..a4e233af3 Binary files /dev/null and b/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/AVvXsEh3SRQqyIQq-vygd2VoFPj4Zv7F2oXY3are-1471312d.png differ diff --git a/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/AVvXsEjDimhjVS4ZmDe_PbtdYrYJ7BGn7Va4Z7s6-2b44e223.jpg b/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/AVvXsEjDimhjVS4ZmDe_PbtdYrYJ7BGn7Va4Z7s6-2b44e223.jpg new file mode 100644 index 000000000..f0415634f Binary files /dev/null and b/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/AVvXsEjDimhjVS4ZmDe_PbtdYrYJ7BGn7Va4Z7s6-2b44e223.jpg differ diff --git a/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/index.md b/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/index.md index 05aca10c5..a2a70f894 100644 --- a/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/index.md +++ b/content/posts/2025/09/10/stochastic-ai-agility-breaking-cycles-of-debt/index.md @@ -24,7 +24,7 @@ frozen: false This article examines the observed changes in project management practices. These observations are govern by Role 17: Stochastic AI Agility. Over past two decades, the industry has actively pursued the implementation of agile methodologies to enable iterative product delivery. -[![Figure 1. : Agile process schema connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)](https://blogger.googleusercontent.com/img/a/AVvXsEgdrHJagJ8mTUfYjICR7XmoWcxNa0sCNIjYKa8gAh8slhfHBgVyqIKYvs0kQq1oZAoZRAHX3d86YN2bmBSOLaes_antODoow7MwcIrf9Zdq2TXjwHLBAXpbPmCeKL1wxB0YhSxFBFI4iBTV0I5tffaHLboHIYhjnxuUtpdoPv4R1yxbUf2U0ZfgvmCAdXBN "Figure 1. : Agile process schema connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)")](https://blogger.googleusercontent.com/img/a/AVvXsEgdrHJagJ8mTUfYjICR7XmoWcxNa0sCNIjYKa8gAh8slhfHBgVyqIKYvs0kQq1oZAoZRAHX3d86YN2bmBSOLaes_antODoow7MwcIrf9Zdq2TXjwHLBAXpbPmCeKL1wxB0YhSxFBFI4iBTV0I5tffaHLboHIYhjnxuUtpdoPv4R1yxbUf2U0ZfgvmCAdXBN "Figure 1. : Agile process schema connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)") +[![Figure 1. : Agile process schema connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)](AVvXsEgdrHJagJ8mTUfYjICR7XmoWcxNa0sCNIjY-2d510350.jpg "Figure 1. : Agile process schema connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)")](AVvXsEgdrHJagJ8mTUfYjICR7XmoWcxNa0sCNIjY-2d510350.jpg "Figure 1. : Agile process schema connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)") *Figure 1. : Agile process schema connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)* The fundamental principle involves decomposing all processes into smaller, manageable units that teams strive to execute with optimal efficiency. While this approach is particularly prevalent in information technology, its application extend beyond this sector. Throughout agile implementation, teams develop the capability to provide accurate delivery estimates--a notable challenging endeavor due to numerous contributing variables. These variables typically generate both visible and invisible technical debts that teams must address, potentially leading to diverse operational scenarios. @@ -54,16 +54,16 @@ The articles suggest to add one additional point which may be called The designation "**Stochastic AI Agility**" indicates that the AI-LLM implementation consistently contributes toward project objectives, though the precise impact remains inherently unpredictable. The normal distribution curve may represent the degree of AI-LLM contribution across the most established phases --specifically, the core functional areas -- of product development. -[![Figure 2.: Agile Kandban schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)](https://blogger.googleusercontent.com/img/a/AVvXsEgUY4KFBmiVd1c2UOHjvjaxx_cZC5LyyN67dwcsy3KywfhZ8pM6NmvtcJF1JjkkN3vPzSEH8IkRS4TFEKoVxjYLi_stnVMnehtU5T8COqNpdqX2rRTfr3hz-jmD1jTcH2UU10JZWEGpXIXrLhKIC7T7KgLiKBVmoqbjPxRGJjyamAlFB4l56z0jgV8AQgqX "Figure 2.: Agile Kandban schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)")](https://blogger.googleusercontent.com/img/a/AVvXsEgUY4KFBmiVd1c2UOHjvjaxx_cZC5LyyN67dwcsy3KywfhZ8pM6NmvtcJF1JjkkN3vPzSEH8IkRS4TFEKoVxjYLi_stnVMnehtU5T8COqNpdqX2rRTfr3hz-jmD1jTcH2UU10JZWEGpXIXrLhKIC7T7KgLiKBVmoqbjPxRGJjyamAlFB4l56z0jgV8AQgqX "Figure 2.: Agile Kandban schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)") +[![Figure 2.: Agile Kandban schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)](AVvXsEgUY4KFBmiVd1c2UOHjvjaxx_cZC5LyyN67-9bd39d81.jpg "Figure 2.: Agile Kandban schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)")](AVvXsEgUY4KFBmiVd1c2UOHjvjaxx_cZC5LyyN67-9bd39d81.jpg "Figure 2.: Agile Kandban schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)") *Figure 2.: Agile Kandban schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)* These scenarios are subsequently evaluated by management and technical staff with the objective of enhancing future iteration processes. The goal is to implement improved methodologies and alternative approaches in subsequent development cycles. -[![Figure 3.: Agile Scrum framework schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)](https://blogger.googleusercontent.com/img/a/AVvXsEgrL2SF6gKWQG6_n7P7y7GqR_zR7FFb6oTsJ8tQQPC-7guZnnH-vCQbb5xIHQsSc7cQPVuqHAuIzYnebLt5ctbL8hu--29GIYb_Y5emeOyTToUyl-37bmm8Qi4RjnBC7mMicA7mOya1DZsHnJkiJ49jqrScsD6v8sSx_fQSB8SP94KHL-FCrZbHxJrNiYko "Figure 3.: Agile Scrum framework schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)")](https://blogger.googleusercontent.com/img/a/AVvXsEgrL2SF6gKWQG6_n7P7y7GqR_zR7FFb6oTsJ8tQQPC-7guZnnH-vCQbb5xIHQsSc7cQPVuqHAuIzYnebLt5ctbL8hu--29GIYb_Y5emeOyTToUyl-37bmm8Qi4RjnBC7mMicA7mOya1DZsHnJkiJ49jqrScsD6v8sSx_fQSB8SP94KHL-FCrZbHxJrNiYko "Figure 3.: Agile Scrum framework schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)") +[![Figure 3.: Agile Scrum framework schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)](AVvXsEgrL2SF6gKWQG6_n7P7y7GqR_zR7FFb6oTs-e008e35c.jpg "Figure 3.: Agile Scrum framework schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)")](AVvXsEgrL2SF6gKWQG6_n7P7y7GqR_zR7FFb6oTs-e008e35c.jpg "Figure 3.: Agile Scrum framework schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)") *Figure 3.: Agile Scrum framework schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)* This represents a sound strategic approach for future implementation. With the advancement and proliferation of Large Language Models (LLMs) solutions, virtually every stage of development or organizational evaluation may exhibit inherent bias, even when such bias is not immediately apparent. -[![Figure 4.: Waterfall schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)](https://blogger.googleusercontent.com/img/a/AVvXsEjDimhjVS4ZmDe_PbtdYrYJ7BGn7Va4Z7s6OXX5pxhyuXiurImFRQCbDs72uM_uZhsBrGb2fgNgGeLORzT8y1AHkZWSu9D_PeNF9pI2z5UGmcN6sGz5jc1ZpdIxHqeY3IUa2f_Mjf08lMC_ZoTk7uEO0_I-j_Rqcznij4xnNJVbqHxPIjQ9VADpNHyXzdUt "Figure 4.: Waterfall schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)")](https://blogger.googleusercontent.com/img/a/AVvXsEjDimhjVS4ZmDe_PbtdYrYJ7BGn7Va4Z7s6OXX5pxhyuXiurImFRQCbDs72uM_uZhsBrGb2fgNgGeLORzT8y1AHkZWSu9D_PeNF9pI2z5UGmcN6sGz5jc1ZpdIxHqeY3IUa2f_Mjf08lMC_ZoTk7uEO0_I-j_Rqcznij4xnNJVbqHxPIjQ9VADpNHyXzdUt "Figure 4.: Waterfall schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)") +[![Figure 4.: Waterfall schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)](AVvXsEjDimhjVS4ZmDe_PbtdYrYJ7BGn7Va4Z7s6-2b44e223.jpg "Figure 4.: Waterfall schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)")](AVvXsEjDimhjVS4ZmDe_PbtdYrYJ7BGn7Va4Z7s6-2b44e223.jpg "Figure 4.: Waterfall schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)") *Figure 4.: Waterfall schema with each stages connected to the AI-LLMs (blue lines and circles) and human knowledge based on experiences (blue bricks)* In my assessment, regardless of whether organizations currently employ agile methodologies (Figures 1-3) or traditional approaches (Figure 4), AI-LLM technology influences every phase of project development and methodological implementation. I recommend comprehensive research into agile frameworks, as the integration of LLM technologies, AI-assisted coding, or LLM-informed managerial decision-making may produce suboptimal outcomes with far-reaching consequences. @@ -72,7 +72,7 @@ Point 17, **Stochastic AI agility**, represents a fundamentally stochastic proce Each inconsistency introduces technical debt of varying magnitudes. While this may not be immediately apparent, every project or objective constitutes a deterministic process with defined variance parameters, where incremental components are systematically constructed to achieve the desired outcome. Success depends on the level of granular complexity teams can effectively manage to develop these fundamental building blocks (Figure 6). -[![Figure 6.: Every debt and challenge can be broken down into small batches, bricks, to achieve a goal.](https://blogger.googleusercontent.com/img/a/AVvXsEh3SRQqyIQq-vygd2VoFPj4Zv7F2oXY3areM_gFaF_rSmY4y9Gp_CP_KwI_GMJUBH9UxplZBYZoKfdTXYfENS4KdTxO16R_02CUzRnCHvhmQNGu7qYsgGKPN-8vOjQIf0A94gx_GADuXNz1jYCrEm3GgSv9251Olbge1iMiwkX9Hfs3jJCuB6mKtwp6Xm5m "Figure 6.: Every debt and challenge can be broken down into small batches, bricks, to achieve a goal.")](// "Figure 6.: Every debt and challenge can be broken down into small batches, bricks, to achieve a goal.") +[![Figure 6.: Every debt and challenge can be broken down into small batches, bricks, to achieve a goal.](AVvXsEh3SRQqyIQq-vygd2VoFPj4Zv7F2oXY3are-1471312d.png "Figure 6.: Every debt and challenge can be broken down into small batches, bricks, to achieve a goal.")](// "Figure 6.: Every debt and challenge can be broken down into small batches, bricks, to achieve a goal.") *Figure 6.: Complex challenge and technical debt can be decomposed into manageable incremental units to facilitate goal achievement.* *PS: If you are experiencing challenges or considering revision to current methodologies, I welcome the opportunity for collaborative discussion.* diff --git a/content/posts/2025/09/30/javafx-links-of-september-2025/index.md b/content/posts/2025/09/30/javafx-links-of-september-2025/index.md index e842d7f52..fa831a814 100644 --- a/content/posts/2025/09/30/javafx-links-of-september-2025/index.md +++ b/content/posts/2025/09/30/javafx-links-of-september-2025/index.md @@ -5,7 +5,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of September 20 canonical: "https://webtechie.be/post/2025-09-26-javafx-links-of-september-2025/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2025/09/30/javafx-links-of-september-2025/jfxcentral.jpg b/content/posts/2025/09/30/javafx-links-of-september-2025/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2025/09/30/javafx-links-of-september-2025/jfxcentral.jpg differ diff --git a/content/posts/2025/09/30/javafx-links-of-september-2025/jfxcentral.png b/content/posts/2025/09/30/javafx-links-of-september-2025/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2025/09/30/javafx-links-of-september-2025/jfxcentral.png and /dev/null differ diff --git a/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.21.29-PM-1024x458.jpg b/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.21.29-PM-1024x458.jpg new file mode 100644 index 000000000..efb5fec64 Binary files /dev/null and b/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.21.29-PM-1024x458.jpg differ diff --git a/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.21.29-PM-1024x458.png b/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.21.29-PM-1024x458.png deleted file mode 100644 index bbf45fcb0..000000000 Binary files a/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.21.29-PM-1024x458.png and /dev/null differ diff --git a/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.22.21-PM-1024x641.jpg b/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.22.21-PM-1024x641.jpg new file mode 100644 index 000000000..a030bd549 Binary files /dev/null and b/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.22.21-PM-1024x641.jpg differ diff --git a/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.22.21-PM-1024x641.png b/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.22.21-PM-1024x641.png deleted file mode 100644 index 163c05be0..000000000 Binary files a/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.22.21-PM-1024x641.png and /dev/null differ diff --git a/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.25.45-PM-1024x468.jpg b/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.25.45-PM-1024x468.jpg new file mode 100644 index 000000000..d3e6e8c5b Binary files /dev/null and b/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.25.45-PM-1024x468.jpg differ diff --git a/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.25.45-PM-1024x468.png b/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.25.45-PM-1024x468.png deleted file mode 100644 index ebec47a84..000000000 Binary files a/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.25.45-PM-1024x468.png and /dev/null differ diff --git a/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.26.06-PM-1024x578.jpg b/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.26.06-PM-1024x578.jpg new file mode 100644 index 000000000..1e3a7a7f2 Binary files /dev/null and b/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.26.06-PM-1024x578.jpg differ diff --git a/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.26.06-PM-1024x578.png b/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.26.06-PM-1024x578.png deleted file mode 100644 index fa0e2ac25..000000000 Binary files a/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.26.06-PM-1024x578.png and /dev/null differ diff --git a/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.26.46-PM-1024x650.jpg b/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.26.46-PM-1024x650.jpg new file mode 100644 index 000000000..edd729a2b Binary files /dev/null and b/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.26.46-PM-1024x650.jpg differ diff --git a/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.26.46-PM-1024x650.png b/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.26.46-PM-1024x650.png deleted file mode 100644 index f1a6bf0a9..000000000 Binary files a/content/posts/2025/10/07/working-with-geo-location-data/Screenshot-2025-10-06-at-1.26.46-PM-1024x650.png and /dev/null differ diff --git a/content/posts/2025/10/07/working-with-geo-location-data/index.md b/content/posts/2025/10/07/working-with-geo-location-data/index.md index 63b53ef6b..3ccdfe330 100644 --- a/content/posts/2025/10/07/working-with-geo-location-data/index.md +++ b/content/posts/2025/10/07/working-with-geo-location-data/index.md @@ -113,7 +113,7 @@ This will bring us back two of locations around London within 2,000 meters of Th ``` Obviously within that close of a range it might not always match a lot of major landmarks, but if you were looking for a restaurant within a 1 mile walk that might be perfect! -![](Screenshot-2025-10-06-at-1.21.29-PM-1024x458.png) +![](Screenshot-2025-10-06-at-1.21.29-PM-1024x458.jpg) **Searching within an area** @@ -135,7 +135,7 @@ Let's break this down a little: * The first value \[-0.0761, 51.508\] is the center in \[lng, lat\] (The Tower of London) * The second value is the radius in radians. 5 / 6378.1 converts 5 km to radians by dividing by Earth's mean radius in kilometers (6378.1 km). -![](Screenshot-2025-10-06-at-1.22.21-PM-1024x641.png) +![](Screenshot-2025-10-06-at-1.22.21-PM-1024x641.jpg) **Search Within a Custom Area** @@ -203,14 +203,14 @@ There are a number of ways you can map this data, including some ways build dire If you haven't used MongoDB Charts it is a pretty cool charting platform built directly into MongoDB Atlas (MongoDB's Cloud Service) that you can use to make all sorts of charts and even maps! Below is an interactive map generated with all the location points from our collection (go ahead, zoom in)! -![](Screenshot-2025-10-06-at-1.25.45-PM-1024x468.png) +![](Screenshot-2025-10-06-at-1.25.45-PM-1024x468.jpg) This example is showing all the locations, but you can use a query when you build your map to get just a subset as well as add the map along with other charts to create a Dashboard. As a bit of a preview this is what Charts look like in edit mode. -![](Screenshot-2025-10-06-at-1.26.06-PM-1024x578.png) +![](Screenshot-2025-10-06-at-1.26.06-PM-1024x578.jpg) **MongoDB Compass** You can also view a map like this within MongoDB Compass if you click on the Schema tab and Analyze your documents: -![](Screenshot-2025-10-06-at-1.26.46-PM-1024x650.png) +![](Screenshot-2025-10-06-at-1.26.46-PM-1024x650.jpg) Of course you can also use the Google Maps API or maybe Mapbox. What sort of ideas can you think of to use your new geo location knowledge? Have fun! diff --git a/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.07.32_PM_rzb9-fb1b3743.png b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.07.32_PM_rzb9-fb1b3743.png new file mode 100644 index 000000000..f7b004ed1 Binary files /dev/null and b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.07.32_PM_rzb9-fb1b3743.png differ diff --git a/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.08.12_PM_tb14-287db13f.jpg b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.08.12_PM_tb14-287db13f.jpg new file mode 100644 index 000000000..302802217 Binary files /dev/null and b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.08.12_PM_tb14-287db13f.jpg differ diff --git a/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.08.33_PM_k1z4-908b03ca.png b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.08.33_PM_k1z4-908b03ca.png new file mode 100644 index 000000000..bb970fa0a Binary files /dev/null and b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.08.33_PM_k1z4-908b03ca.png differ diff --git a/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.08.53_PM_ci7d-56c016ba.jpg b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.08.53_PM_ci7d-56c016ba.jpg new file mode 100644 index 000000000..5ad353e8c Binary files /dev/null and b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.08.53_PM_ci7d-56c016ba.jpg differ diff --git a/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.09.17_PM_dbds-8ef73233.png b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.09.17_PM_dbds-8ef73233.png new file mode 100644 index 000000000..945d0db19 Binary files /dev/null and b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.09.17_PM_dbds-8ef73233.png differ diff --git a/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.09.38_PM_ae8g-a9cfe0df.png b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.09.38_PM_ae8g-a9cfe0df.png new file mode 100644 index 000000000..1bfa020f6 Binary files /dev/null and b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/Screenshot_2025-08-14_at_1.09.38_PM_ae8g-a9cfe0df.png differ diff --git a/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/cars.jpg b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/cars.jpg new file mode 100644 index 000000000..70677e5a9 Binary files /dev/null and b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/cars.jpg differ diff --git a/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/cars.png b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/cars.png deleted file mode 100644 index 4d4ddf5ba..000000000 Binary files a/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/cars.png and /dev/null differ diff --git a/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/index.md b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/index.md index ed7cf0ddc..e1a74000f 100644 --- a/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/index.md +++ b/content/posts/2025/10/16/how-chat-memory-manipulation-can-ruin-your-ai-system/index.md @@ -6,7 +6,7 @@ description: "Did you know that by tampering with chat history, you're able to m canonical: "https://snyk.io/articles/chat-memory-manipulation-ai/" authors: - "bmvermeer" -image: "cars.png" +image: "cars.jpg" categories: - "AI" - "Security" @@ -100,7 +100,7 @@ Therefore, developers really need to guarantee the integrity of the conversation ### Chat memory injection: Proof of concept In the example below, I try to use the chat service to cancel a booking at my car rental company. According to the terms and conditions, this should not be possible. When requesting this to the LLM-driven chatbot, it acts accordingly and refuses the cancellation -![AI bookings interface](https://res.cloudinary.com/snyk/image/upload/f_auto,w_2560,q_auto/v1755191486/Screenshot_2025-08-14_at_1.07.32_PM_rzb9af.png) ![AI bookings chat interface in a vulnerable application.](https://res.cloudinary.com/snyk/image/upload/f_auto,w_2560,q_auto/v1755191487/Screenshot_2025-08-14_at_1.08.12_PM_tb14g9.png) +![AI bookings interface](Screenshot_2025-08-14_at_1.07.32_PM_rzb9-fb1b3743.png) ![AI bookings chat interface in a vulnerable application.](Screenshot_2025-08-14_at_1.08.12_PM_tb14-287db13f.jpg) In another part of the application, there is a search function that contains an SQL injection. By exploiting this SQL Injection, I am able to insert a pre-fabricated conversation in the database with the following query. @@ -115,12 +115,12 @@ INSERT INTO CHAT_MESSAGE (CONVERSATION_ID, CONTENT, SENDER) VALUES (1, 'No probl -- ``` -![SQL injection in search window to insert conversation](https://res.cloudinary.com/snyk/image/upload/f_auto,w_2560,q_auto/v1755191486/Screenshot_2025-08-14_at_1.08.33_PM_k1z4wb.png) +![SQL injection in search window to insert conversation](Screenshot_2025-08-14_at_1.08.33_PM_k1z4-908b03ca.png) Effectively, I am manufacturing a conversation with user prompts and assistant responses in an attempt to trick the chatbot into canceling my booking. The fake conversation that was injected in a prior SQL injection attack concludes with a confirmation from the chatbot that the booking has been deleted. Clearly, this has not actually occurred yet. However, by asking for confirmation in the next prompt, the LLM will activate the function that deletes the booking, even though this goes against policy. -![AI bookings chat interface demonstrates an SQL injection attack that poisons the chat context with fake message history](https://res.cloudinary.com/snyk/image/upload/f_auto,w_2560,q_auto/v1755191486/Screenshot_2025-08-14_at_1.08.53_PM_ci7dky.png) ![AI bookings chat listing](https://res.cloudinary.com/snyk/image/upload/f_auto,w_2560,q_auto/v1755191485/Screenshot_2025-08-14_at_1.09.17_PM_dbdspr.png) +![AI bookings chat interface demonstrates an SQL injection attack that poisons the chat context with fake message history](Screenshot_2025-08-14_at_1.08.53_PM_ci7d-56c016ba.jpg) ![AI bookings chat listing](Screenshot_2025-08-14_at_1.09.17_PM_dbds-8ef73233.png) The main point is that by editing or altering the chat history, we can influence the LLM to respond out of context. If the LLM has function tools, we can manipulate it to run these functions by creating a convincing conversation. @@ -131,7 +131,7 @@ LLMs are stateless, and the prompt is essential to how your AI service responds. As shown in the example above, by tampering with the chat history, I was able to make the LLM respond and execute functions that are out of policy. Although the example is simplified, it also demonstrated that basic code vulnerabilities like a SQL injection can be exploited to do this and escalate into an AI problem. Therefore, it is important to prevent these common vulnerabilities by scanning your code and dependencies for issues. With [++Snyk Code++](https://snyk.io/product/snyk-code/) and [++Snyk Open Source++](https://snyk.io/product/open-source-security-management/), this is very straightforward. Additionally, you should consider implementing a mechanism to ensure integrity, such as storing a hashed fingerprint of the conversation. -![Snyk Code plugin in IntelliJ IDEA warning for a SQL Injection](https://res.cloudinary.com/snyk/image/upload/f_auto,w_2560,q_auto/v1755191486/Screenshot_2025-08-14_at_1.09.38_PM_ae8gm2.png) +![Snyk Code plugin in IntelliJ IDEA warning for a SQL Injection](Screenshot_2025-08-14_at_1.09.38_PM_ae8g-a9cfe0df.png) Ultimately, we now understand that chat memory can serve as an attack vector to manipulate your AI system or AI agent into running functions that should not be executed. Make sure you guard against chat memory attacks when building your own AI agents. diff --git a/content/posts/2025/10/29/explore-spring-framework-7-features-api-versioning/apiversioning.jpg b/content/posts/2025/10/29/explore-spring-framework-7-features-api-versioning/apiversioning.jpg new file mode 100644 index 000000000..f77f55d87 Binary files /dev/null and b/content/posts/2025/10/29/explore-spring-framework-7-features-api-versioning/apiversioning.jpg differ diff --git a/content/posts/2025/10/29/explore-spring-framework-7-features-api-versioning/apiversioning.png b/content/posts/2025/10/29/explore-spring-framework-7-features-api-versioning/apiversioning.png deleted file mode 100644 index 961517cb5..000000000 Binary files a/content/posts/2025/10/29/explore-spring-framework-7-features-api-versioning/apiversioning.png and /dev/null differ diff --git a/content/posts/2025/10/29/explore-spring-framework-7-features-api-versioning/index.md b/content/posts/2025/10/29/explore-spring-framework-7-features-api-versioning/index.md index 3d4dd9475..d1ac42c63 100644 --- a/content/posts/2025/10/29/explore-spring-framework-7-features-api-versioning/index.md +++ b/content/posts/2025/10/29/explore-spring-framework-7-features-api-versioning/index.md @@ -5,7 +5,7 @@ lastmod: "2025-10-29T06:45:54+00:00" description: "Discover how Spring Framework 7 introduces powerful API versioning support. Learn configuration options to manage multiple API versions effectively in your Spring Boot applications." authors: - "mahendra1413" -image: "apiversioning.png" +image: "apiversioning.jpg" categories: - "IntelliJ IDEA" - "Java" diff --git a/content/posts/2025/10/31/javafx-links-of-october-2025/index.md b/content/posts/2025/10/31/javafx-links-of-october-2025/index.md index f6f56dbd3..1001403f8 100644 --- a/content/posts/2025/10/31/javafx-links-of-october-2025/index.md +++ b/content/posts/2025/10/31/javafx-links-of-october-2025/index.md @@ -6,7 +6,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of October 2025 canonical: "https://webtechie.be/post/2025-10-31-javafx-links-of-october-2025/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2025/10/31/javafx-links-of-october-2025/jfxcentral.jpg b/content/posts/2025/10/31/javafx-links-of-october-2025/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2025/10/31/javafx-links-of-october-2025/jfxcentral.jpg differ diff --git a/content/posts/2025/10/31/javafx-links-of-october-2025/jfxcentral.png b/content/posts/2025/10/31/javafx-links-of-october-2025/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2025/10/31/javafx-links-of-october-2025/jfxcentral.png and /dev/null differ diff --git a/content/posts/2025/11/03/lets-talk-about-mcp/Screenshot-2025-11-03-at-15.07.27-1024x484.jpg b/content/posts/2025/11/03/lets-talk-about-mcp/Screenshot-2025-11-03-at-15.07.27-1024x484.jpg new file mode 100644 index 000000000..0cb189f32 Binary files /dev/null and b/content/posts/2025/11/03/lets-talk-about-mcp/Screenshot-2025-11-03-at-15.07.27-1024x484.jpg differ diff --git a/content/posts/2025/11/03/lets-talk-about-mcp/Screenshot-2025-11-03-at-15.07.27-1024x484.png b/content/posts/2025/11/03/lets-talk-about-mcp/Screenshot-2025-11-03-at-15.07.27-1024x484.png deleted file mode 100644 index 3ce71c059..000000000 Binary files a/content/posts/2025/11/03/lets-talk-about-mcp/Screenshot-2025-11-03-at-15.07.27-1024x484.png and /dev/null differ diff --git a/content/posts/2025/11/03/lets-talk-about-mcp/index.md b/content/posts/2025/11/03/lets-talk-about-mcp/index.md index ed4e668b2..6e7859ca7 100644 --- a/content/posts/2025/11/03/lets-talk-about-mcp/index.md +++ b/content/posts/2025/11/03/lets-talk-about-mcp/index.md @@ -5,7 +5,7 @@ lastmod: "2025-11-03T17:30:09+00:00" description: "MCP overview, benefits and challenges and a concrete example of creation of an MCP server using Quarkus and using it from the IDE." authors: - "jonathan-vila" -image: "Screenshot-2025-11-03-at-15.07.27-1024x484.png" +image: "Screenshot-2025-11-03-at-15.07.27-1024x484.jpg" categories: - "AI" - "Java" diff --git a/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.53.24.jpg b/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.53.24.jpg new file mode 100644 index 000000000..59394fed9 Binary files /dev/null and b/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.53.24.jpg differ diff --git a/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.53.24.png b/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.53.24.png deleted file mode 100644 index 7b3bc7181..000000000 Binary files a/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.53.24.png and /dev/null differ diff --git a/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.53.43.jpg b/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.53.43.jpg new file mode 100644 index 000000000..fcc31b5ea Binary files /dev/null and b/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.53.43.jpg differ diff --git a/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.53.43.png b/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.53.43.png deleted file mode 100644 index ca2d295ba..000000000 Binary files a/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.53.43.png and /dev/null differ diff --git a/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.54.39.jpg b/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.54.39.jpg new file mode 100644 index 000000000..15c9514d2 Binary files /dev/null and b/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.54.39.jpg differ diff --git a/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.54.39.png b/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.54.39.png deleted file mode 100644 index 4f5d18447..000000000 Binary files a/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-16.54.39.png and /dev/null differ diff --git a/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-17.57.47-1024x709.jpg b/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-17.57.47-1024x709.jpg new file mode 100644 index 000000000..8ab397a5a Binary files /dev/null and b/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-17.57.47-1024x709.jpg differ diff --git a/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-17.57.47-1024x709.png b/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-17.57.47-1024x709.png deleted file mode 100644 index d59b1103b..000000000 Binary files a/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/Screenshot-2025-11-07-at-17.57.47-1024x709.png and /dev/null differ diff --git a/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/index.md b/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/index.md index 10867c756..ffa2fd8ed 100644 --- a/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/index.md +++ b/content/posts/2025/11/07/your-new-ai-powered-coding-buddy-a-guide-to-sonarqube-mcp-server-on-intellij/index.md @@ -4,7 +4,7 @@ date: "2025-11-07T17:00:24+00:00" description: "You have an AI-powered assistant to help you out. SonarQube MCP Server comes in. Let's dive into how this cool new MCP can supercharge your daily coding routine. 🚀." authors: - "jonathan-vila" -image: "Screenshot-2025-11-07-at-17.57.47-1024x709.png" +image: "Screenshot-2025-11-07-at-17.57.47-1024x709.jpg" categories: - "AI" - "GenAI" @@ -90,7 +90,7 @@ The Agent will follow a series of steps in order to create the code but also to ![](Screenshot-2025-11-07-at-16.53.16.png) At the end, the Agent will show (using the model GTP5-mini) a list of tasks done, and we see the result of the SonarQube analysis to specifically the snippet created : -![](Screenshot-2025-11-07-at-16.53.24.png) +![](Screenshot-2025-11-07-at-16.53.24.jpg) Yes, I know, you are thinking 🤔 `Do I have to explicitly tell the agent to use SonarQube every time?` And I totally understand you…. Well, the answer is no 🥳 @@ -142,7 +142,7 @@ But before you continue with your work, let's analyze the code and dependencies, We will get a summarized answer with the dependencies in our project and the vulnerabilities included, with a reference to the CVEs and the rate for each vulnerability. -![](Screenshot-2025-11-07-at-16.53.43.png) +![](Screenshot-2025-11-07-at-16.53.43.jpg) Eyy ‼️Do you see that our new Jackson dependency that we added above appears here and includes several HIGH and MEDIUM vulnerabilities in multiple CVEs 😱?. Well, fortunately enough we have our friend SonarQube MCP server that is warning us 🙏 @@ -198,7 +198,7 @@ And in a very natural way, we will ask the Assistant to do whatever is needed to ![](Screenshot-2025-11-07-at-16.54.34.png) And the Assistant with the help of the MCP Server will bring a nice table to reflect the issues we have in the Pull Request : -![](Screenshot-2025-11-07-at-16.54.39.png)![](Screenshot-2025-11-07-at-16.54.45.png) +![](Screenshot-2025-11-07-at-16.54.39.jpg)![](Screenshot-2025-11-07-at-16.54.45.png) **Tips and tricks : how to get the best out of Agent-MCP relationship 🤝** diff --git a/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-1.58.35-PM.jpg b/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-1.58.35-PM.jpg new file mode 100644 index 000000000..1163ba133 Binary files /dev/null and b/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-1.58.35-PM.jpg differ diff --git a/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-1.58.35-PM.png b/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-1.58.35-PM.png deleted file mode 100644 index 73e3b75e3..000000000 Binary files a/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-1.58.35-PM.png and /dev/null differ diff --git a/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-2.01.23-PM.jpg b/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-2.01.23-PM.jpg new file mode 100644 index 000000000..6eba36aa6 Binary files /dev/null and b/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-2.01.23-PM.jpg differ diff --git a/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-2.01.23-PM.png b/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-2.01.23-PM.png deleted file mode 100644 index 32279841a..000000000 Binary files a/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-2.01.23-PM.png and /dev/null differ diff --git a/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-2.05.52-PM.jpg b/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-2.05.52-PM.jpg new file mode 100644 index 000000000..2f7c528ee Binary files /dev/null and b/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-2.05.52-PM.jpg differ diff --git a/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-2.05.52-PM.png b/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-2.05.52-PM.png deleted file mode 100644 index 26f55dde2..000000000 Binary files a/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/Screenshot-2025-11-11-at-2.05.52-PM.png and /dev/null differ diff --git a/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/index.md b/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/index.md index 3bb7f4d29..e5594911d 100644 --- a/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/index.md +++ b/content/posts/2025/11/13/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/index.md @@ -5,7 +5,7 @@ lastmod: "2025-12-12T21:19:43+00:00" description: "Bringing together semantic vectors and exact keyword matching with $rankFusionIf you’ve been following along this series, you already know we started by giving our movie search app the ability to understand meaning—not just keywords—using semantic search, as discussed in Part 1: Implementing Semantic Search in Java With Spring Data. Then, we made it even smarter by adding filters and optimizing performance with embedding strategies in Part 2: Optimizing Vector Search With Filters and Caching.Now, in this final installment, we’re taking our search capability to its ultimate form: combining the precision of full-text search with the semantic understanding of vector search. Welcome to hybrid search." authors: - "ricardo-mello" -image: "Screenshot-2025-11-11-at-1.58.35-PM.png" +image: "Screenshot-2025-11-11-at-1.58.35-PM.jpg" categories: - "AI" - "Databases" @@ -541,7 +541,7 @@ Open your browser at[**http://localhost:8080**](http://localhost:8080), and appl * **Genres** = (Drama, Action) Just like in the screenshot below: -![](Screenshot-2025-11-11-at-1.58.35-PM.png) +![](Screenshot-2025-11-11-at-1.58.35-PM.jpg) If we look closely at the results, we notice that some movies don't satisfy the pre-filters—for example, ***Night at the Museum*** is being returned even though it's from 2006, outside the requested year range of 1980–2003. @@ -707,7 +707,7 @@ public List searchMovies(MovieSearchRequest req) { #### Case 1: Including genres Let's run the same query again with our new pipeline. -![](Screenshot-2025-11-11-at-2.01.23-PM.png) +![](Screenshot-2025-11-11-at-2.01.23-PM.jpg) As you can see in the results, the filters look correct. @@ -843,7 +843,7 @@ public List searchMovies(MovieSearchRequest req) { ``` Then, run the search again with the same inputs: -![](Screenshot-2025-11-11-at-2.05.52-PM.png) +![](Screenshot-2025-11-11-at-2.05.52-PM.jpg) Now, we can see that the top results make more sense for this descriptive query. Try yourself by changing the weights and boost, and see the results. diff --git a/content/posts/2025/11/14/micrometer-prometheus-in-spring-boot-kafka-burger-orders/Untitled-1024x683.jpg b/content/posts/2025/11/14/micrometer-prometheus-in-spring-boot-kafka-burger-orders/Untitled-1024x683.jpg new file mode 100644 index 000000000..d25f0f3ca Binary files /dev/null and b/content/posts/2025/11/14/micrometer-prometheus-in-spring-boot-kafka-burger-orders/Untitled-1024x683.jpg differ diff --git a/content/posts/2025/11/14/micrometer-prometheus-in-spring-boot-kafka-burger-orders/Untitled-1024x683.png b/content/posts/2025/11/14/micrometer-prometheus-in-spring-boot-kafka-burger-orders/Untitled-1024x683.png deleted file mode 100644 index 488147ecc..000000000 Binary files a/content/posts/2025/11/14/micrometer-prometheus-in-spring-boot-kafka-burger-orders/Untitled-1024x683.png and /dev/null differ diff --git a/content/posts/2025/11/14/micrometer-prometheus-in-spring-boot-kafka-burger-orders/index.md b/content/posts/2025/11/14/micrometer-prometheus-in-spring-boot-kafka-burger-orders/index.md index 05ec05088..482fd7c5d 100644 --- a/content/posts/2025/11/14/micrometer-prometheus-in-spring-boot-kafka-burger-orders/index.md +++ b/content/posts/2025/11/14/micrometer-prometheus-in-spring-boot-kafka-burger-orders/index.md @@ -5,7 +5,7 @@ lastmod: "2025-11-14T10:13:04+00:00" description: "Learn Micrometer and Prometheus in Spring Boot by building a Kafka Burger Orders app that emits metrics. Step-by-step guide with code and takeaways." authors: - "vincent-vauban" -image: "Untitled-1024x683.png" +image: "Untitled-1024x683.jpg" categories: - "DevOps" - "Java" diff --git a/content/posts/2025/11/20/goodbye-payara-community-6-on-to-the-next-chapter-with-payara-community-7/Blog-Images-_Moving-forward-with-Payara-Platform-Community-7.jpg b/content/posts/2025/11/20/goodbye-payara-community-6-on-to-the-next-chapter-with-payara-community-7/Blog-Images-_Moving-forward-with-Payara-Platform-Community-7.jpg new file mode 100644 index 000000000..9a74fe6b0 Binary files /dev/null and b/content/posts/2025/11/20/goodbye-payara-community-6-on-to-the-next-chapter-with-payara-community-7/Blog-Images-_Moving-forward-with-Payara-Platform-Community-7.jpg differ diff --git a/content/posts/2025/11/20/goodbye-payara-community-6-on-to-the-next-chapter-with-payara-community-7/Blog-Images-_Moving-forward-with-Payara-Platform-Community-7.png b/content/posts/2025/11/20/goodbye-payara-community-6-on-to-the-next-chapter-with-payara-community-7/Blog-Images-_Moving-forward-with-Payara-Platform-Community-7.png deleted file mode 100644 index d4509b08b..000000000 Binary files a/content/posts/2025/11/20/goodbye-payara-community-6-on-to-the-next-chapter-with-payara-community-7/Blog-Images-_Moving-forward-with-Payara-Platform-Community-7.png and /dev/null differ diff --git a/content/posts/2025/11/20/goodbye-payara-community-6-on-to-the-next-chapter-with-payara-community-7/index.md b/content/posts/2025/11/20/goodbye-payara-community-6-on-to-the-next-chapter-with-payara-community-7/index.md index 200572e6d..f84c37978 100644 --- a/content/posts/2025/11/20/goodbye-payara-community-6-on-to-the-next-chapter-with-payara-community-7/index.md +++ b/content/posts/2025/11/20/goodbye-payara-community-6-on-to-the-next-chapter-with-payara-community-7/index.md @@ -5,7 +5,7 @@ description: "Payara 6 Community has reached its final release, and the platform canonical: "https://payara.fish/blog/payara-6-community-end-of-life/" authors: - "dominika-tasarz" -image: "Blog-Images-_Moving-forward-with-Payara-Platform-Community-7.png" +image: "Blog-Images-_Moving-forward-with-Payara-Platform-Community-7.jpg" categories: - "Jakarta EE" - "Java" diff --git a/content/posts/2025/11/25/the-art-of-performance-tuning-why-saving-30-in-the-cloud-means-nothing-if-your-code-wastes-1000x-more/fj_art1_results_5.jpg b/content/posts/2025/11/25/the-art-of-performance-tuning-why-saving-30-in-the-cloud-means-nothing-if-your-code-wastes-1000x-more/fj_art1_results_5.jpg new file mode 100644 index 000000000..8ab5a0a84 Binary files /dev/null and b/content/posts/2025/11/25/the-art-of-performance-tuning-why-saving-30-in-the-cloud-means-nothing-if-your-code-wastes-1000x-more/fj_art1_results_5.jpg differ diff --git a/content/posts/2025/11/25/the-art-of-performance-tuning-why-saving-30-in-the-cloud-means-nothing-if-your-code-wastes-1000x-more/fj_art1_results_5.png b/content/posts/2025/11/25/the-art-of-performance-tuning-why-saving-30-in-the-cloud-means-nothing-if-your-code-wastes-1000x-more/fj_art1_results_5.png deleted file mode 100644 index d789f0c2a..000000000 Binary files a/content/posts/2025/11/25/the-art-of-performance-tuning-why-saving-30-in-the-cloud-means-nothing-if-your-code-wastes-1000x-more/fj_art1_results_5.png and /dev/null differ diff --git a/content/posts/2025/11/25/the-art-of-performance-tuning-why-saving-30-in-the-cloud-means-nothing-if-your-code-wastes-1000x-more/index.md b/content/posts/2025/11/25/the-art-of-performance-tuning-why-saving-30-in-the-cloud-means-nothing-if-your-code-wastes-1000x-more/index.md index 9cb9b6ef3..0b7f30bfe 100644 --- a/content/posts/2025/11/25/the-art-of-performance-tuning-why-saving-30-in-the-cloud-means-nothing-if-your-code-wastes-1000x-more/index.md +++ b/content/posts/2025/11/25/the-art-of-performance-tuning-why-saving-30-in-the-cloud-means-nothing-if-your-code-wastes-1000x-more/index.md @@ -4,7 +4,7 @@ date: "2025-11-25T06:46:00+00:00" description: "The Hidden Cost of “Good Enough” Code A few weeks ago, Kirk Pepperdine published a fascinating performance challenge — a small Java code snippet that…" authors: - "daniel-witkowski" -image: "fj_art1_results_5.png" +image: "fj_art1_results_5.jpg" categories: - "Debugging" - "Design Patterns" diff --git a/content/posts/2025/11/26/will-openjfx-be-merged-into-openjdk-it-would-be-a-perfect-match-with-java-on-mobile/index.md b/content/posts/2025/11/26/will-openjfx-be-merged-into-openjdk-it-would-be-a-perfect-match-with-java-on-mobile/index.md index 1e8af3aef..b52fb455f 100644 --- a/content/posts/2025/11/26/will-openjfx-be-merged-into-openjdk-it-would-be-a-perfect-match-with-java-on-mobile/index.md +++ b/content/posts/2025/11/26/will-openjfx-be-merged-into-openjdk-it-would-be-a-perfect-match-with-java-on-mobile/index.md @@ -5,7 +5,7 @@ description: "While looking for articles for the JFX Central Links Of The Week, canonical: "https://webtechie.be/post/2025-11-05-openjfx-returning-to-openjdk/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2025/11/26/will-openjfx-be-merged-into-openjdk-it-would-be-a-perfect-match-with-java-on-mobile/jfxcentral.jpg b/content/posts/2025/11/26/will-openjfx-be-merged-into-openjdk-it-would-be-a-perfect-match-with-java-on-mobile/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2025/11/26/will-openjfx-be-merged-into-openjdk-it-would-be-a-perfect-match-with-java-on-mobile/jfxcentral.jpg differ diff --git a/content/posts/2025/11/26/will-openjfx-be-merged-into-openjdk-it-would-be-a-perfect-match-with-java-on-mobile/jfxcentral.png b/content/posts/2025/11/26/will-openjfx-be-merged-into-openjdk-it-would-be-a-perfect-match-with-java-on-mobile/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2025/11/26/will-openjfx-be-merged-into-openjdk-it-would-be-a-perfect-match-with-java-on-mobile/jfxcentral.png and /dev/null differ diff --git a/content/posts/2025/11/30/javafx-links-of-november-2025/index.md b/content/posts/2025/11/30/javafx-links-of-november-2025/index.md index b493ede8e..1bc5c7834 100644 --- a/content/posts/2025/11/30/javafx-links-of-november-2025/index.md +++ b/content/posts/2025/11/30/javafx-links-of-november-2025/index.md @@ -5,7 +5,7 @@ description: "Here is the overview of the JavaFX LinksOfTheMonth of November 202 canonical: "https://webtechie.be/post/2025-11-28-javafx-links-of-november-2025/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2025/11/30/javafx-links-of-november-2025/jfxcentral.jpg b/content/posts/2025/11/30/javafx-links-of-november-2025/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2025/11/30/javafx-links-of-november-2025/jfxcentral.jpg differ diff --git a/content/posts/2025/11/30/javafx-links-of-november-2025/jfxcentral.png b/content/posts/2025/11/30/javafx-links-of-november-2025/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2025/11/30/javafx-links-of-november-2025/jfxcentral.png and /dev/null differ diff --git a/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.11.26-AM.jpg b/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.11.26-AM.jpg new file mode 100644 index 000000000..4ffdb5539 Binary files /dev/null and b/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.11.26-AM.jpg differ diff --git a/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.11.26-AM.png b/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.11.26-AM.png deleted file mode 100644 index 8efe922a8..000000000 Binary files a/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.11.26-AM.png and /dev/null differ diff --git a/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.12.21-AM.jpg b/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.12.21-AM.jpg new file mode 100644 index 000000000..7102cd980 Binary files /dev/null and b/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.12.21-AM.jpg differ diff --git a/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.12.21-AM.png b/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.12.21-AM.png deleted file mode 100644 index f3112f120..000000000 Binary files a/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.12.21-AM.png and /dev/null differ diff --git a/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.12.53-AM.jpg b/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.12.53-AM.jpg new file mode 100644 index 000000000..8b53628a7 Binary files /dev/null and b/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.12.53-AM.jpg differ diff --git a/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.12.53-AM.png b/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.12.53-AM.png deleted file mode 100644 index f27e031e7..000000000 Binary files a/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.12.53-AM.png and /dev/null differ diff --git a/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.14.25-AM.jpg b/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.14.25-AM.jpg new file mode 100644 index 000000000..152e832bb Binary files /dev/null and b/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.14.25-AM.jpg differ diff --git a/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.14.25-AM.png b/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.14.25-AM.png deleted file mode 100644 index f0c8342b2..000000000 Binary files a/content/posts/2025/12/02/atlas-searching-with-the-java-driver/Screenshot-2025-11-18-at-9.14.25-AM.png and /dev/null differ diff --git a/content/posts/2025/12/02/atlas-searching-with-the-java-driver/index.md b/content/posts/2025/12/02/atlas-searching-with-the-java-driver/index.md index 2221b02d3..78858b6d1 100644 --- a/content/posts/2025/12/02/atlas-searching-with-the-java-driver/index.md +++ b/content/posts/2025/12/02/atlas-searching-with-the-java-driver/index.md @@ -49,13 +49,13 @@ Here's what the Search section should now look like for you: ![Search indexes](Screenshot-2025-11-18-at-9.10.47-AM.png) Voila, now you've got the movie data indexed into Atlas Search and can perform sophisticated full text queries against it. Go ahead and give it a try using the handy Search Tester, by clicking the "Query" button. Try typing in some of your favorite movie titles or actor names, or even words that would appear in the plot or genre. -![Search Tester](Screenshot-2025-11-18-at-9.11.26-AM.png) +![Search Tester](Screenshot-2025-11-18-at-9.11.26-AM.jpg) Behind the scenes of the Search Tester lurks the $search pipeline stage. Clicking "Edit $search Query" exposes the full $search stage in all its JSON glory, allowing you to experiment with the syntax and behavior. -![Search Tester Query Editor](Screenshot-2025-11-18-at-9.12.21-AM.png) +![Search Tester Query Editor](Screenshot-2025-11-18-at-9.12.21-AM.jpg) This is our first glimpse into the $search syntax. The handy "copy" (the top right of the code editor side panel) button copies the code to your clipboard so you can paste it into your favorite MongoDB aggregation pipeline tools like Compass, [MongoDB shell](https://www.mongodb.com/products/shell/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=atlas-search-foojay&utm_term=tony.kim), or the Atlas UI aggregation tool (shown below). There's an "aggregation pipeline" link there that will link you directly to the aggregation tool on the current collection. -![Using $search in Compass](Screenshot-2025-11-18-at-9.12.53-AM.png) +![Using $search in Compass](Screenshot-2025-11-18-at-9.12.53-AM.jpg) At this point, your environment is set up and your collection is Atlas search-able. Now it's time to do some coding! @@ -99,7 +99,7 @@ At this point, go ahead and copy the above JSON aggregation pipeline and paste i {{< img src="Screenshot-2026-01-23-at-4.24.49-PM.png" class="aligncenter size-full is-resized" width="164" height="50" style="width:208px;height:auto" >}} Here's what the results should look like for you: -![three-stage aggregation pipeline in Compass](Screenshot-2025-11-18-at-9.14.25-AM.png) +![three-stage aggregation pipeline in Compass](Screenshot-2025-11-18-at-9.14.25-AM.jpg) As we adapt the three-stage aggregation pipeline to Java, we'll explain things in more detail. diff --git a/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/04467ffa-0ffa-40c8-aaa9-2e39f3729048-497f4709.png b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/04467ffa-0ffa-40c8-aaa9-2e39f3729048-497f4709.png new file mode 100644 index 000000000..8e56f870b Binary files /dev/null and b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/04467ffa-0ffa-40c8-aaa9-2e39f3729048-497f4709.png differ diff --git a/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/1e13090d-cb04-467a-97d1-0e39a48a584d-4cd4f8c0.jpg b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/1e13090d-cb04-467a-97d1-0e39a48a584d-4cd4f8c0.jpg new file mode 100644 index 000000000..81076024f Binary files /dev/null and b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/1e13090d-cb04-467a-97d1-0e39a48a584d-4cd4f8c0.jpg differ diff --git a/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/39ea9e7c-da40-4bb2-9462-011aea5f5855-d0ba23e2.jpg b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/39ea9e7c-da40-4bb2-9462-011aea5f5855-d0ba23e2.jpg new file mode 100644 index 000000000..f53336029 Binary files /dev/null and b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/39ea9e7c-da40-4bb2-9462-011aea5f5855-d0ba23e2.jpg differ diff --git a/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/470609c8-ac04-40f4-8406-efdd62c734f2-0e92b886.jpg b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/470609c8-ac04-40f4-8406-efdd62c734f2-0e92b886.jpg new file mode 100644 index 000000000..05920b70c Binary files /dev/null and b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/470609c8-ac04-40f4-8406-efdd62c734f2-0e92b886.jpg differ diff --git a/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/669a2b39-d1b7-453d-90bb-d1c0304394a5-f9f39405.png b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/669a2b39-d1b7-453d-90bb-d1c0304394a5-f9f39405.png new file mode 100644 index 000000000..37b6eb22d Binary files /dev/null and b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/669a2b39-d1b7-453d-90bb-d1c0304394a5-f9f39405.png differ diff --git a/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/6ad5aea0-625a-4f7f-bf4c-a0b3c8a4903f-67920532.png b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/6ad5aea0-625a-4f7f-bf4c-a0b3c8a4903f-67920532.png new file mode 100644 index 000000000..2bddc6f99 Binary files /dev/null and b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/6ad5aea0-625a-4f7f-bf4c-a0b3c8a4903f-67920532.png differ diff --git a/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/6dc6960a-397f-45eb-bc56-1e206c895ee9-073066f4.jpg b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/6dc6960a-397f-45eb-bc56-1e206c895ee9-073066f4.jpg new file mode 100644 index 000000000..06f446269 Binary files /dev/null and b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/6dc6960a-397f-45eb-bc56-1e206c895ee9-073066f4.jpg differ diff --git a/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/7993c838-7e2a-40c2-8a9a-6f7c5fe7bcbb-0aa4f962.jpg b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/7993c838-7e2a-40c2-8a9a-6f7c5fe7bcbb-0aa4f962.jpg new file mode 100644 index 000000000..ff6155724 Binary files /dev/null and b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/7993c838-7e2a-40c2-8a9a-6f7c5fe7bcbb-0aa4f962.jpg differ diff --git a/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/index.md b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/index.md index f5fd37ad8..e4e58af5b 100644 --- a/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/index.md +++ b/content/posts/2025/12/07/how-coderabbits-agentic-code-validation-helps-with-code-reviews/index.md @@ -20,7 +20,7 @@ frozen: false --- The [2025 Stack Overflow survey](https://survey.stackoverflow.co/2025/) reveals a paradox: while 84% of developers express confidence in adopting AI tools, nearly half (48%) still distrust the accuracy of their outputs. This tension between optimism and skepticism has reshaped how teams think about quality assurance. -![](https://cdn.hashnode.com/res/hashnode/image/upload/v1764049813672/6ad5aea0-625a-4f7f-bf4c-a0b3c8a4903f.png?auto=compress,format&format=webp) +![](6ad5aea0-625a-4f7f-bf4c-a0b3c8a4903f-67920532.png) ## **From PRD to PR in days (not weeks)** @@ -34,7 +34,7 @@ Reviewing AI-generated code also takes much more time. The bottleneck isn't writ ## **The AI-generated code crisis nobody's talking about** -![](https://cdn.hashnode.com/res/hashnode/image/upload/v1764050727379/470609c8-ac04-40f4-8406-efdd62c734f2.png?auto=compress,format&format=webp) +![](470609c8-ac04-40f4-8406-efdd62c734f2-0e92b886.jpg) Engineers are right to be skeptical, since [**over 40% of AI-generated code still contains security flaws**](https://cyber.nyu.edu/2021/10/15/ccs-researchers-find-github-copilot-generates-vulnerable-code-40-of-the-time/) and here is what AI-generated code often gets wrong: @@ -63,16 +63,16 @@ To effectively counter that, we developed techniques to engineer and manage the Here are some examples from the open-source PRs. **Static analysis**: AST parsing with tools like ast-grep to understand code smells. -![](https://cdn.hashnode.com/res/hashnode/image/upload/v1764049990279/6dc6960a-397f-45eb-bc56-1e206c895ee9.png?auto=compress,format&format=webp) ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1764049974691/04467ffa-0ffa-40c8-aaa9-2e39f3729048.png?auto=compress,format&format=webp) +![](6dc6960a-397f-45eb-bc56-1e206c895ee9-073066f4.jpg) ![](04467ffa-0ffa-40c8-aaa9-2e39f3729048-497f4709.png) **Incremental analysis**: Only validating wAgentiAgenhat changed, not your entire codebase. -![](https://cdn.hashnode.com/res/hashnode/image/upload/v1764050007622/669a2b39-d1b7-453d-90bb-d1c0304394a5.png?auto=compress,format&format=webp) ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1764050040318/39ea9e7c-da40-4bb2-9462-011aea5f5855.png?auto=compress,format&format=webp) +![](669a2b39-d1b7-453d-90bb-d1c0304394a5-f9f39405.png) ![](39ea9e7c-da40-4bb2-9462-011aea5f5855-d0ba23e2.jpg) **Security issues**: Prompt injection attacks and edge case generation. -![](https://cdn.hashnode.com/res/hashnode/image/upload/v1764050064236/1e13090d-cb04-467a-97d1-0e39a48a584d.png?auto=compress,format&format=webp) +![](1e13090d-cb04-467a-97d1-0e39a48a584d-4cd4f8c0.jpg) **Name refactoring**: Suggesting better variable and function names based on usage. -![](https://cdn.hashnode.com/res/hashnode/image/upload/v1764050080527/7993c838-7e2a-40c2-8a9a-6f7c5fe7bcbb.png?auto=compress,format&format=webp) +![](7993c838-7e2a-40c2-8a9a-6f7c5fe7bcbb-0aa4f962.jpg) The "agentic" part means the AI decides which tools to run, interprets the results, and takes action. Think of it like having a senior engineer who knows when to dig deeper and when something is *not* fine. diff --git a/content/posts/2025/12/10/more-java-from-azul/index.md b/content/posts/2025/12/10/more-java-from-azul/index.md index a26ec69cd..456555841 100644 --- a/content/posts/2025/12/10/more-java-from-azul/index.md +++ b/content/posts/2025/12/10/more-java-from-azul/index.md @@ -5,7 +5,7 @@ lastmod: "2025-12-11T09:50:58+00:00" description: "Strategic acquisition bolsters Azul’s Java platform with complementary products, deep Java expertise and accelerated go-to-market capabilities!" authors: - "simonritter" -image: "payara.png" +image: "payara.jpg" categories: - "Performance" - "Press" @@ -51,7 +51,7 @@ We see many synergies between how Payara supports Jakarta EE applications and ho We also see opportunities to help customers optimise the performance of their Jakarta EE applications through Azul's Platform Prime. As such, Azul has announced that it is acquiring Payara to extend our Java support offerings. The diagram below shows how the various components fit together in a broader enterprise Java market. -![](payara-1024x599.png) +![](payara-1024x599.jpg) These are exciting times, so stay tuned for more updates as we move forward! diff --git a/content/posts/2025/12/10/more-java-from-azul/payara-1024x599.jpg b/content/posts/2025/12/10/more-java-from-azul/payara-1024x599.jpg new file mode 100644 index 000000000..d194d040a Binary files /dev/null and b/content/posts/2025/12/10/more-java-from-azul/payara-1024x599.jpg differ diff --git a/content/posts/2025/12/10/more-java-from-azul/payara-1024x599.png b/content/posts/2025/12/10/more-java-from-azul/payara-1024x599.png deleted file mode 100644 index acebfe8c4..000000000 Binary files a/content/posts/2025/12/10/more-java-from-azul/payara-1024x599.png and /dev/null differ diff --git a/content/posts/2025/12/10/more-java-from-azul/payara.jpg b/content/posts/2025/12/10/more-java-from-azul/payara.jpg new file mode 100644 index 000000000..f04ed6827 Binary files /dev/null and b/content/posts/2025/12/10/more-java-from-azul/payara.jpg differ diff --git a/content/posts/2025/12/10/more-java-from-azul/payara.png b/content/posts/2025/12/10/more-java-from-azul/payara.png deleted file mode 100644 index 1554bac01..000000000 Binary files a/content/posts/2025/12/10/more-java-from-azul/payara.png and /dev/null differ diff --git a/content/posts/2025/12/11/first-experiments-with-java-on-the-lattepanda-iota/index.md b/content/posts/2025/12/11/first-experiments-with-java-on-the-lattepanda-iota/index.md index 234a10c67..aeac2589b 100644 --- a/content/posts/2025/12/11/first-experiments-with-java-on-the-lattepanda-iota/index.md +++ b/content/posts/2025/12/11/first-experiments-with-java-on-the-lattepanda-iota/index.md @@ -113,7 +113,7 @@ The simple "Hello World" example ran perfectly. There's also an extended example Since I installed the Java version from Azul with JavaFX included, I could also run a JavaFX demo application. It uses Pi4J to detect the board type, though this only contains methods to detect Raspberry Pi board versions at this moment, so it didn't recognize the LattePanda. But the application **ran smoothly**! It showed we're running on a Linux 64-bit system with Java 25. The board wasn't recognized yet as expected, maybe we can in the future add detection tools in the Pi4J library to show the brand or manufacturer information. -![](javafx-demo-1024x576.png) +![](javafx-demo-1024x576.jpg) Without any extra work, we have a JavaFX application running very smoothly on this board! diff --git a/content/posts/2025/12/11/first-experiments-with-java-on-the-lattepanda-iota/javafx-demo-1024x576.jpg b/content/posts/2025/12/11/first-experiments-with-java-on-the-lattepanda-iota/javafx-demo-1024x576.jpg new file mode 100644 index 000000000..3aea75ef9 Binary files /dev/null and b/content/posts/2025/12/11/first-experiments-with-java-on-the-lattepanda-iota/javafx-demo-1024x576.jpg differ diff --git a/content/posts/2025/12/11/first-experiments-with-java-on-the-lattepanda-iota/javafx-demo-1024x576.png b/content/posts/2025/12/11/first-experiments-with-java-on-the-lattepanda-iota/javafx-demo-1024x576.png deleted file mode 100644 index f3578f019..000000000 Binary files a/content/posts/2025/12/11/first-experiments-with-java-on-the-lattepanda-iota/javafx-demo-1024x576.png and /dev/null differ diff --git a/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.52.44.jpg b/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.52.44.jpg new file mode 100644 index 000000000..08ba61b47 Binary files /dev/null and b/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.52.44.jpg differ diff --git a/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.52.44.png b/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.52.44.png deleted file mode 100644 index a807a0663..000000000 Binary files a/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.52.44.png and /dev/null differ diff --git a/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.14.jpg b/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.14.jpg new file mode 100644 index 000000000..17db1151b Binary files /dev/null and b/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.14.jpg differ diff --git a/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.14.png b/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.14.png deleted file mode 100644 index 058d7f227..000000000 Binary files a/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.14.png and /dev/null differ diff --git a/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.22.jpg b/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.22.jpg new file mode 100644 index 000000000..eb8fcca35 Binary files /dev/null and b/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.22.jpg differ diff --git a/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.22.png b/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.22.png deleted file mode 100644 index c0510cde7..000000000 Binary files a/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.22.png and /dev/null differ diff --git a/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.31.jpg b/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.31.jpg new file mode 100644 index 000000000..e7e25ece1 Binary files /dev/null and b/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.31.jpg differ diff --git a/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.31.png b/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.31.png deleted file mode 100644 index af0d21398..000000000 Binary files a/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/Screenshot-2025-12-12-at-15.53.31.png and /dev/null differ diff --git a/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/index.md b/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/index.md index 890147b2c..334dc9726 100644 --- a/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/index.md +++ b/content/posts/2025/12/12/developers-guide-to-sonarqube-part-1/index.md @@ -38,7 +38,7 @@ This is **Part 1** of our series. Today, we focus on the **Standalone Mode** — We are busy. We don't want to spend 2 hours configuring a linter script or messing with XML files. **The Solution:** [SonarQube for IDE](https://www.sonarsource.com/products/sonarqube/ide/) is plug-and-play. It works locally, analyzing your code *as you type*. -![](Screenshot-2025-12-12-at-15.52.44.png) +![](Screenshot-2025-12-12-at-15.52.44.jpg) 1. Open **IntelliJ IDEA**. 2. Go to **Settings** -\> **Plugins**. @@ -101,7 +101,7 @@ This is the main reason developers uninstall quality tools. You open a class wri In the tool settings window, enable the setting **"Focus on New Code"**. This is a mental health saver. It ignores technical debt older than 30 days (this is the default time window when not using the Connected Mode). Then in the analysis -![](Screenshot-2025-12-12-at-15.53.14.png) +![](Screenshot-2025-12-12-at-15.53.14.jpg) ## **Problem #6: "I know it's bad, but how do I fix it?"** @@ -124,7 +124,7 @@ String name = user.get().getName(); ``` **The Educational Fix:** When you select an issue, SonarQube for IDE opens a **Rule Description** tab. This is my favorite part. It doesn't just say "fix this." It gives you a mini-article explaining **why** this is an issue and provides clear "Non-Compliant" vs "Compliant" code examples. It effectively trains you to be a better developer while you work. -![](Screenshot-2025-12-12-at-15.53.22.png) +![](Screenshot-2025-12-12-at-15.53.22.jpg) **The Quick Fix:** Once you understand the issue, you can often (applicable to a subgroup of rules) just hit Alt + Enter (or Option + Enter) and let the tool rewrite the code for you. @@ -171,7 +171,7 @@ You can go to **Settings** -\> **Tools** -\> **SonarQube for IDE** -\> **Rules** * **Disable** rules that don't make sense for you. * **Configure thresholds** (e.g., allow 15 lines instead of 10). -![](Screenshot-2025-12-12-at-15.53.31.png) +![](Screenshot-2025-12-12-at-15.53.31.jpg) ## **Summary** diff --git a/content/posts/2025/12/12/jakarta-data-makes-persistence-a-breeze/Blog_Jakarta-Data.jpg b/content/posts/2025/12/12/jakarta-data-makes-persistence-a-breeze/Blog_Jakarta-Data.jpg new file mode 100644 index 000000000..30a3c68f4 Binary files /dev/null and b/content/posts/2025/12/12/jakarta-data-makes-persistence-a-breeze/Blog_Jakarta-Data.jpg differ diff --git a/content/posts/2025/12/12/jakarta-data-makes-persistence-a-breeze/Blog_Jakarta-Data.png b/content/posts/2025/12/12/jakarta-data-makes-persistence-a-breeze/Blog_Jakarta-Data.png deleted file mode 100644 index ac6168432..000000000 Binary files a/content/posts/2025/12/12/jakarta-data-makes-persistence-a-breeze/Blog_Jakarta-Data.png and /dev/null differ diff --git a/content/posts/2025/12/12/jakarta-data-makes-persistence-a-breeze/index.md b/content/posts/2025/12/12/jakarta-data-makes-persistence-a-breeze/index.md index 25d5d8f02..e67870a8a 100644 --- a/content/posts/2025/12/12/jakarta-data-makes-persistence-a-breeze/index.md +++ b/content/posts/2025/12/12/jakarta-data-makes-persistence-a-breeze/index.md @@ -6,7 +6,7 @@ canonical: "https://payara.fish/downloads/payara-platform-community-edition/" authors: - "alfonso-altamirano" - "dominika-tasarz" -image: "Blog_Jakarta-Data.png" +image: "Blog_Jakarta-Data.jpg" categories: - "Jakarta EE" - "Java" diff --git a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.22.56.jpg b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.22.56.jpg new file mode 100644 index 000000000..e1a759128 Binary files /dev/null and b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.22.56.jpg differ diff --git a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.22.56.png b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.22.56.png deleted file mode 100644 index 1a46215f4..000000000 Binary files a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.22.56.png and /dev/null differ diff --git a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.13-1024x675.jpg b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.13-1024x675.jpg new file mode 100644 index 000000000..033590087 Binary files /dev/null and b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.13-1024x675.jpg differ diff --git a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.13-1024x675.png b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.13-1024x675.png deleted file mode 100644 index 03f9deabe..000000000 Binary files a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.13-1024x675.png and /dev/null differ diff --git a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.23.jpg b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.23.jpg new file mode 100644 index 000000000..fa62efa17 Binary files /dev/null and b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.23.jpg differ diff --git a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.23.png b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.23.png deleted file mode 100644 index 429ea4096..000000000 Binary files a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.23.png and /dev/null differ diff --git a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.33.jpg b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.33.jpg new file mode 100644 index 000000000..81e6e329a Binary files /dev/null and b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.33.jpg differ diff --git a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.33.png b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.33.png deleted file mode 100644 index 7eac2107d..000000000 Binary files a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.33.png and /dev/null differ diff --git a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.44.jpg b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.44.jpg new file mode 100644 index 000000000..338181d64 Binary files /dev/null and b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.44.jpg differ diff --git a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.44.png b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.44.png deleted file mode 100644 index ebeb138aa..000000000 Binary files a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.44.png and /dev/null differ diff --git a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.53.jpg b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.53.jpg new file mode 100644 index 000000000..a0de1c192 Binary files /dev/null and b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.53.jpg differ diff --git a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.53.png b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.53.png deleted file mode 100644 index 2b698b5ae..000000000 Binary files a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.24.53.png and /dev/null differ diff --git a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.25.03.jpg b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.25.03.jpg new file mode 100644 index 000000000..96dd08315 Binary files /dev/null and b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.25.03.jpg differ diff --git a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.25.03.png b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.25.03.png deleted file mode 100644 index 212b634a5..000000000 Binary files a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/Screenshot-2025-12-16-at-10.25.03.png and /dev/null differ diff --git a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/index.md b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/index.md index c882fce82..40a3cd585 100644 --- a/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/index.md +++ b/content/posts/2025/12/16/developers-guide-to-sonarqube-part-2/index.md @@ -59,7 +59,7 @@ No more surprises in the pipeline. You see the error *before* you commit. Open IntelliJ **Settings** (or Preferences) -\> **Tools** -\> **SonarQube for IDE** . Click the **+** icon under "Connections" to start, or on the SonarQube IDE plugin window click on the **configure** button. -{{< img src="Screenshot-2025-12-16-at-10.22.56.png" class="size-full is-resized" width="660" height="606" style="width:369px;height:auto" >}} +{{< img src="Screenshot-2025-12-16-at-10.22.56.jpg" class="size-full is-resized" width="660" height="606" style="width:369px;height:auto" >}} Click on the tool icon to open the settings dialog. ![](Screenshot-2025-12-16-at-10.23.05-1024x265.png) @@ -115,7 +115,7 @@ Your IDE needs to be snappy. If the plugin paused your typing to trace how userN 1. **IDE:** Catches logic errors and local code smells instantly. 2. **SonarQube Cloud:** Performs complex issue detection, such as **Taint Analysis,** to detect that userName is an untrusted input ending up in a SQL query (Sink). -![](Screenshot-2025-12-16-at-10.24.13-1024x675.png) +![](Screenshot-2025-12-16-at-10.24.13-1024x675.jpg) ## **Problem #3: "I hate switching windows to check why the build failed"** @@ -126,10 +126,10 @@ You pushed your code. The GitHub Actions build failed. Now you have to log in to When you use SonarQube Cloud, it talks directly to your Git provider. If your Quality Gate fails, SonarQube will **post a comment** right inside your PR conversation, exactly on the line of code that failed. It feels like a senior Java dev reviewing your code: *"Hey, this concatenation allows SQL Injection. Use parameters instead."* -![](Screenshot-2025-12-16-at-10.24.23.png) +![](Screenshot-2025-12-16-at-10.24.23.jpg) SonarQube Cloud checks on the CI/CD -![](Screenshot-2025-12-16-at-10.24.33.png) +![](Screenshot-2025-12-16-at-10.24.33.jpg) Comments from SonarQube Cloud directly appearing in the PR changes @@ -146,14 +146,14 @@ SonarQube Cloud allows you to define what "New Code" means for *your* specific s * *Result:* You can merge if *your* changes are tested, even if the rest of the app is a mess. 2. **Custom Profiles:** Your Tech Lead can clone the "Sonar way (Java)" profile and disable rules that don't fit your style (e.g., maybe you don't care about "Trailing comments" or specific naming conventions). -{{< img src="Screenshot-2025-12-16-at-10.24.44.png" class="size-full is-resized" width="910" height="570" style="width:581px;height:auto" >}} +{{< img src="Screenshot-2025-12-16-at-10.24.44.jpg" class="size-full is-resized" width="910" height="570" style="width:581px;height:auto" >}} We can inherit the Sonar default profile, and modify it -![](Screenshot-2025-12-16-at-10.24.53.png) +![](Screenshot-2025-12-16-at-10.24.53.jpg) We see in our profile we have one more rule activated -{{< img src="Screenshot-2025-12-16-at-10.25.03.png" class="size-full is-resized" width="804" height="628" style="width:618px;height:auto" >}} +{{< img src="Screenshot-2025-12-16-at-10.25.03.jpg" class="size-full is-resized" width="804" height="628" style="width:618px;height:auto" >}} By tuning the gate, the tool becomes a helper, not a blocker. We can define our thresholds that resonate better with our maturity and goals. ![](Screenshot-2025-12-16-at-10.25.14-1024x703.png) diff --git a/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/Scalable-Enterprise-Java-for-the-Cloud-05.jpg b/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/Scalable-Enterprise-Java-for-the-Cloud-05.jpg new file mode 100644 index 000000000..fed7cbc69 Binary files /dev/null and b/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/Scalable-Enterprise-Java-for-the-Cloud-05.jpg differ diff --git a/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/Scalable-Enterprise-Java-for-the-Cloud-05.png b/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/Scalable-Enterprise-Java-for-the-Cloud-05.png deleted file mode 100644 index c514e1bbe..000000000 Binary files a/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/Scalable-Enterprise-Java-for-the-Cloud-05.png and /dev/null differ diff --git a/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/Scalable-Enterprise-Java-for-the-Cloud-cover-small.jpg b/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/Scalable-Enterprise-Java-for-the-Cloud-cover-small.jpg new file mode 100644 index 000000000..5a09c77e0 Binary files /dev/null and b/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/Scalable-Enterprise-Java-for-the-Cloud-cover-small.jpg differ diff --git a/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/Scalable-Enterprise-Java-for-the-Cloud-cover-small.png b/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/Scalable-Enterprise-Java-for-the-Cloud-cover-small.png deleted file mode 100644 index e80c7c5dd..000000000 Binary files a/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/Scalable-Enterprise-Java-for-the-Cloud-cover-small.png and /dev/null differ diff --git a/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/index.md b/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/index.md index 6dcba6aa7..49a965c20 100644 --- a/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/index.md +++ b/content/posts/2025/12/18/scalable-enterprise-java-for-the-cloud/index.md @@ -6,7 +6,7 @@ description: "This e-book introduces Jakarta EE as the modern foundation for bui canonical: "https://payara.fish/blog/scalable-enterprise-java-for-the-cloud/" authors: - "dominika-tasarz" -image: "Scalable-Enterprise-Java-for-the-Cloud-05.png" +image: "Scalable-Enterprise-Java-for-the-Cloud-05.jpg" categories: - "Jakarta EE" - "Java" @@ -25,7 +25,7 @@ We're excited to introduce [*Scalable Enterprise Java for the Cloud*,](https://p [**Download the free eBook here**](https://payara.fish/resource/scalable-enterprise-java-for-the-cloud/ "**Download the free eBook here**") (no form fill necessary). -[![Scalable Enterprise Java for the Cloud](Scalable-Enterprise-Java-for-the-Cloud-cover-small.png "Scalable Enterprise Java for the Cloud")](https://payara.fish/blog/scalable-enterprise-java-for-the-cloud/ "Scalable Enterprise Java for the Cloud") +[![Scalable Enterprise Java for the Cloud](Scalable-Enterprise-Java-for-the-Cloud-cover-small.jpg "Scalable Enterprise Java for the Cloud")](https://payara.fish/blog/scalable-enterprise-java-for-the-cloud/ "Scalable Enterprise Java for the Cloud") The eBook focuses on Jakarta EE as the foundation for scalable enterprise Java, showing how it continues to evolve to meet today's cloud requirements. It walks through running Jakarta EE in the cloud with Payara Micro, simplifying development workflows, and aligning enterprise Java with container-based and Kubernetes-friendly architectures. diff --git a/content/posts/2025/12/22/avoid-the-trojan-horse-in-your-pom-xml-sonarqube-advanced-security-part-3/Screenshot-2025-12-22-at-11.08.19.jpg b/content/posts/2025/12/22/avoid-the-trojan-horse-in-your-pom-xml-sonarqube-advanced-security-part-3/Screenshot-2025-12-22-at-11.08.19.jpg new file mode 100644 index 000000000..abe8801e0 Binary files /dev/null and b/content/posts/2025/12/22/avoid-the-trojan-horse-in-your-pom-xml-sonarqube-advanced-security-part-3/Screenshot-2025-12-22-at-11.08.19.jpg differ diff --git a/content/posts/2025/12/22/avoid-the-trojan-horse-in-your-pom-xml-sonarqube-advanced-security-part-3/Screenshot-2025-12-22-at-11.08.19.png b/content/posts/2025/12/22/avoid-the-trojan-horse-in-your-pom-xml-sonarqube-advanced-security-part-3/Screenshot-2025-12-22-at-11.08.19.png deleted file mode 100644 index a4586f1f6..000000000 Binary files a/content/posts/2025/12/22/avoid-the-trojan-horse-in-your-pom-xml-sonarqube-advanced-security-part-3/Screenshot-2025-12-22-at-11.08.19.png and /dev/null differ diff --git a/content/posts/2025/12/22/avoid-the-trojan-horse-in-your-pom-xml-sonarqube-advanced-security-part-3/index.md b/content/posts/2025/12/22/avoid-the-trojan-horse-in-your-pom-xml-sonarqube-advanced-security-part-3/index.md index 2da764a7b..e03120e33 100644 --- a/content/posts/2025/12/22/avoid-the-trojan-horse-in-your-pom-xml-sonarqube-advanced-security-part-3/index.md +++ b/content/posts/2025/12/22/avoid-the-trojan-horse-in-your-pom-xml-sonarqube-advanced-security-part-3/index.md @@ -244,7 +244,7 @@ You don't want to write this list by hand in Excel. SonarQube creates this for y You just click "Download," hand it to the auditor (or the automated compliance system), and go back to coding. -{{< img src="Screenshot-2025-12-22-at-11.08.19.png" class="size-full is-resized" width="710" height="590" style="width:426px;height:auto" >}} +{{< img src="Screenshot-2025-12-22-at-11.08.19.jpg" class="size-full is-resized" width="710" height="590" style="width:426px;height:auto" >}} ## **🎯 Summary** diff --git a/content/posts/2025/12/30/tornadoinsight-compatibility-with-tornadovm-sdk-2-0-configuration-guide/index.md b/content/posts/2025/12/30/tornadoinsight-compatibility-with-tornadovm-sdk-2-0-configuration-guide/index.md index 3c569b148..42e7d146a 100644 --- a/content/posts/2025/12/30/tornadoinsight-compatibility-with-tornadovm-sdk-2-0-configuration-guide/index.md +++ b/content/posts/2025/12/30/tornadoinsight-compatibility-with-tornadovm-sdk-2-0-configuration-guide/index.md @@ -44,7 +44,7 @@ TornadoInsight supports using the JDK defined in the IntelliJ project settings. When a compatible JDK (e.g., JDK 21) is configured here, TornadoInsight will automatically use it. -{{< img src="https://plugins.jetbrains.com/files/23309/screenshot_bd38c017-be77-49d6-a5b0-f9ca54069cd9" class="aligncenter size-large is-resized" style="width:738px;height:auto" >}} +{{< img src="screenshot_bd38c017-be77-49d6-a5b0-f9ca5-628e5f31.jpg" class="aligncenter size-large is-resized" style="width:738px;height:auto" >}} ## TornadoVM SDK Configuration (Recommended) @@ -126,7 +126,7 @@ If the variable is present, TornadoInsight will automatically detect the Tornado ## **Summary** If **TORNADOVM_HOME** is not recognized by the IntelliJ process, a warning is shown in the settings of the plugin, as shown in the picture below. -![](https://plugins.jetbrains.com/files/23309/screenshot_aa1940fc-c2d6-4120-95fc-2df46fc3d67f) +![](screenshot_aa1940fc-c2d6-4120-95fc-2df46-bb9c5e73.jpg) Some common issues are listed here: diff --git a/content/posts/2025/12/30/tornadoinsight-compatibility-with-tornadovm-sdk-2-0-configuration-guide/screenshot_aa1940fc-c2d6-4120-95fc-2df46-bb9c5e73.jpg b/content/posts/2025/12/30/tornadoinsight-compatibility-with-tornadovm-sdk-2-0-configuration-guide/screenshot_aa1940fc-c2d6-4120-95fc-2df46-bb9c5e73.jpg new file mode 100644 index 000000000..d4a5d439b Binary files /dev/null and b/content/posts/2025/12/30/tornadoinsight-compatibility-with-tornadovm-sdk-2-0-configuration-guide/screenshot_aa1940fc-c2d6-4120-95fc-2df46-bb9c5e73.jpg differ diff --git a/content/posts/2025/12/30/tornadoinsight-compatibility-with-tornadovm-sdk-2-0-configuration-guide/screenshot_bd38c017-be77-49d6-a5b0-f9ca5-628e5f31.jpg b/content/posts/2025/12/30/tornadoinsight-compatibility-with-tornadovm-sdk-2-0-configuration-guide/screenshot_bd38c017-be77-49d6-a5b0-f9ca5-628e5f31.jpg new file mode 100644 index 000000000..a31298a34 Binary files /dev/null and b/content/posts/2025/12/30/tornadoinsight-compatibility-with-tornadovm-sdk-2-0-configuration-guide/screenshot_bd38c017-be77-49d6-a5b0-f9ca5-628e5f31.jpg differ diff --git a/content/posts/2025/12/31/javafx-links-of-december-2025/index.md b/content/posts/2025/12/31/javafx-links-of-december-2025/index.md index 91d58fa80..9750b578d 100644 --- a/content/posts/2025/12/31/javafx-links-of-december-2025/index.md +++ b/content/posts/2025/12/31/javafx-links-of-december-2025/index.md @@ -5,7 +5,7 @@ description: "Here is the final JavaFX LinksOfTheMonth for 2025... Thank you all canonical: "https://webtechie.be/post/2025-12-19-javafx-links-of-december-2025/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2025/12/31/javafx-links-of-december-2025/jfxcentral.jpg b/content/posts/2025/12/31/javafx-links-of-december-2025/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2025/12/31/javafx-links-of-december-2025/jfxcentral.jpg differ diff --git a/content/posts/2025/12/31/javafx-links-of-december-2025/jfxcentral.png b/content/posts/2025/12/31/javafx-links-of-december-2025/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2025/12/31/javafx-links-of-december-2025/jfxcentral.png and /dev/null differ diff --git a/content/posts/2026/01/06/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/cloud_deploy_diagram-816f1eb6.svg b/content/posts/2026/01/06/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/cloud_deploy_diagram-816f1eb6.svg new file mode 100644 index 000000000..4051059cf --- /dev/null +++ b/content/posts/2026/01/06/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/cloud_deploy_diagram-816f1eb6.svg @@ -0,0 +1,459 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GitOps Nanos Unikernel → Multi-Cloud Deployment Pipeline + + + + + Build once • Deploy everywhere • Immutable • Secure by design + + + + + + + + + Git Repository + + + config.json + + + workflow.yml + + + + + + push + + + + + + + + GitHub Actions + + + QEMU • ops CLI + + + Download App Server + + + + + + + + + + + 🧱 Build Unikernel + + + ☕ Java Runtime + + + 📦 App Server + + + 🔐 Minimal filesystem + + + 🚀 ops image create + + + → image.img + + + + + + + + 📦 GitHub Artifact + + + payara-azul.img + + + + + + + + + + + 🚀 Deploy Stage + + + Convert e Upload + + + + + + + + + + + + + + + + + AWS EC2 + + + AMI • S3 + + + Launch instance + + + + + + + + + + + GCP Compute + + + GCE • GCS + + + Deploy VM + + + + + + + + + + + + + Azure VM + + + VHD • Blob + + + Create VM + + + + + + + + + + + + + Alibaba ECS + + + Image • OSS + + + Launch ECS + + + + + + + + + + + + + + Oracle Cloud + + + OCI Image + + + Compute + + + + + + + + + + + DigitalOcean + + + Custom • Spaces + + + Droplet + + + + + + + + + + + H + + + Hetzner Cloud + + + Snapshot + + + Create server + + + + + + + + + + + + IBM Cloud + + + VPC Image + + + Virtual Server + + + + + + + + + + + Scaleway + + + Instance Image + + + Deploy + + + + + + + + + + + UpCloud + + + Template + + + Launch Server + + + + + + + + + + Vultr + + + ISO/Snapshot + + + Deploy Instance + + + + + + + + + + + + + + + + + + + + + + + ✨ Key Benefits + + + + ⚡ Fast boot times + + + < 100ms startup + + + + 🔒 Minimal attack surface + + + No shell, no SSH + + + + 📦 Immutable deployment + + + Git = source of truth + + + + ☁️ Cloud agnostic + + + 11 providers supported + + + + 🎯 Simple rollback + + + Boot previous image + + + + 🧠 One image • 11 clouds • Zero containers • Pure hypervisor power + + + + + diff --git a/content/posts/2026/01/06/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/img2-b8ee2e2c.png b/content/posts/2026/01/06/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/img2-b8ee2e2c.png new file mode 100644 index 000000000..e3e3d833e Binary files /dev/null and b/content/posts/2026/01/06/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/img2-b8ee2e2c.png differ diff --git a/content/posts/2026/01/06/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/img3-7ec84f40.png b/content/posts/2026/01/06/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/img3-7ec84f40.png new file mode 100644 index 000000000..dc89e565a Binary files /dev/null and b/content/posts/2026/01/06/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/img3-7ec84f40.png differ diff --git a/content/posts/2026/01/06/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/index.md b/content/posts/2026/01/06/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/index.md index 309e21cb9..04a07949c 100644 --- a/content/posts/2026/01/06/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/index.md +++ b/content/posts/2026/01/06/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/index.md @@ -31,7 +31,7 @@ Nanos images are not just an alternative to containers: they are **lighter, fast VMs vs. Containers vs. Unikernels -{{< img src="https://nanos.org/static/img/vms-vs-unikernels.png" class="size-medium" width="600" height="379" >}} +{{< img src="vms-vs-unikernels.png" class="size-medium" width="600" height="379" >}} The Key Point: Cloud hypervisors already have everything you need... @@ -113,7 +113,7 @@ This not only increases security but also enables **higher application density** The CI/CD pipeline plays the same role it would with containers, but the final output is a **lightweight, immutable Unikernel Nanos Image**. -![](https://raw.githubusercontent.com/AngeloRubens/ci-cd-nanos-unikernel/main/cloud_deploy_diagram.svg) +![](cloud_deploy_diagram-816f1eb6.svg) The repository *AngeloRubens/ci-cd-nanos-unikernel* demonstrates how to: * build Nanos images with Azul JRE and Payara7 Full by GithubAction Pipeline @@ -183,7 +183,7 @@ Nanos security is **architectural**. | | | |-------------------------------------------------|-------------------------------------------------| -| ![](https://nanovms.com/static/images/img2.png) | ![](https://nanovms.com/static/images/img3.png) | +| ![](img2-b8ee2e2c.png) | ![](img3-7ec84f40.png) | And because there are no system processes, **all resources are dedicated to the JVM**, increasing performance and reducing costs. diff --git a/content/posts/2026/01/06/quarkus-a-runtime-and-framework-for-cloud-native-java/2-build-time-principle.jpg b/content/posts/2026/01/06/quarkus-a-runtime-and-framework-for-cloud-native-java/2-build-time-principle.jpg new file mode 100644 index 000000000..f606669b8 Binary files /dev/null and b/content/posts/2026/01/06/quarkus-a-runtime-and-framework-for-cloud-native-java/2-build-time-principle.jpg differ diff --git a/content/posts/2026/01/06/quarkus-a-runtime-and-framework-for-cloud-native-java/2-build-time-principle.png b/content/posts/2026/01/06/quarkus-a-runtime-and-framework-for-cloud-native-java/2-build-time-principle.png deleted file mode 100644 index 07aa8238e..000000000 Binary files a/content/posts/2026/01/06/quarkus-a-runtime-and-framework-for-cloud-native-java/2-build-time-principle.png and /dev/null differ diff --git a/content/posts/2026/01/06/quarkus-a-runtime-and-framework-for-cloud-native-java/index.md b/content/posts/2026/01/06/quarkus-a-runtime-and-framework-for-cloud-native-java/index.md index b145888d9..b198d5890 100644 --- a/content/posts/2026/01/06/quarkus-a-runtime-and-framework-for-cloud-native-java/index.md +++ b/content/posts/2026/01/06/quarkus-a-runtime-and-framework-for-cloud-native-java/index.md @@ -45,7 +45,7 @@ In this sense, Quarkus is a development framework and runtime for cloud-native J Beyond staple traits of modern frameworks, Quarkus introduces two platform-defining features: buildtime optimization and deep extensibility. * **Buildtime optimization** : Quarkus shifts work from runtime to build time wherever possible. - This approach reduces startup overhead and memory usage, resulting in a lean, fast, and efficient application tailored for production.![Buildtime principle in Quarkus: being fast by doing less at runtime](2-build-time-principle.png) + This approach reduces startup overhead and memory usage, resulting in a lean, fast, and efficient application tailored for production.![Buildtime principle in Quarkus: being fast by doing less at runtime](2-build-time-principle.jpg) Figure 1. Quarkus performs at build time what traditional frameworks do at runtime: reading configuration files, scanning annotations, and building a model of the application. diff --git a/content/posts/2026/01/14/why-is-my-talk-selected-reflections-from-a-program-committee-reviewer/index.md b/content/posts/2026/01/14/why-is-my-talk-selected-reflections-from-a-program-committee-reviewer/index.md index d8e4b1ab2..47a4a08dd 100644 --- a/content/posts/2026/01/14/why-is-my-talk-selected-reflections-from-a-program-committee-reviewer/index.md +++ b/content/posts/2026/01/14/why-is-my-talk-selected-reflections-from-a-program-committee-reviewer/index.md @@ -5,7 +5,7 @@ lastmod: "2026-01-15T13:44:23+00:00" description: "If you are like me, get the adrenaline rush of getting up on stage and can’t wait to share things that you experienced and learned, then submitting talks…" authors: - "soham-dasgupta" -image: "why.png" +image: "why.jpg" categories: - "Conference" - "Events" diff --git a/content/posts/2026/01/14/why-is-my-talk-selected-reflections-from-a-program-committee-reviewer/why.jpg b/content/posts/2026/01/14/why-is-my-talk-selected-reflections-from-a-program-committee-reviewer/why.jpg new file mode 100644 index 000000000..b7a983797 Binary files /dev/null and b/content/posts/2026/01/14/why-is-my-talk-selected-reflections-from-a-program-committee-reviewer/why.jpg differ diff --git a/content/posts/2026/01/14/why-is-my-talk-selected-reflections-from-a-program-committee-reviewer/why.png b/content/posts/2026/01/14/why-is-my-talk-selected-reflections-from-a-program-committee-reviewer/why.png deleted file mode 100644 index b31eadd90..000000000 Binary files a/content/posts/2026/01/14/why-is-my-talk-selected-reflections-from-a-program-committee-reviewer/why.png and /dev/null differ diff --git a/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/ffm-gradient-demo.jpg b/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/ffm-gradient-demo.jpg new file mode 100644 index 000000000..440f4e7cf Binary files /dev/null and b/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/ffm-gradient-demo.jpg differ diff --git a/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/ffm-gradient-demo.png b/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/ffm-gradient-demo.png deleted file mode 100644 index 551768d90..000000000 Binary files a/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/ffm-gradient-demo.png and /dev/null differ diff --git a/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/ffm-quote-simon-ritter-1024x390.jpg b/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/ffm-quote-simon-ritter-1024x390.jpg new file mode 100644 index 000000000..ee38d098d Binary files /dev/null and b/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/ffm-quote-simon-ritter-1024x390.jpg differ diff --git a/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/ffm-quote-simon-ritter-1024x390.png b/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/ffm-quote-simon-ritter-1024x390.png deleted file mode 100644 index 013a0f6fa..000000000 Binary files a/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/ffm-quote-simon-ritter-1024x390.png and /dev/null differ diff --git a/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/index.md b/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/index.md index 36421c1d4..6f53ff6de 100644 --- a/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/index.md +++ b/content/posts/2026/01/16/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/index.md @@ -69,7 +69,7 @@ JNI has been around since Java 1.1, and while it works, it has a few critical dr * **Complex implementation** requiring C headers and compilation steps. * **Hard to use by design**: As I learned from Simon Ritter, a Sun engineer once said JNI was deliberately made difficult to discourage people from using it! -![](ffm-quote-simon-ritter-1024x390.png) +![](ffm-quote-simon-ritter-1024x390.jpg) There were attempts to improve this situation with libraries such as JNA and [Java Native Runtime (JNR)](https://github.com/jnr), but they came with their own overhead and limitations. @@ -216,7 +216,7 @@ Also, for this example, you can find a more extended example [here in `FFMNative #### Performance Comparison Example I like demos that have a visual output. So I created a simple benchmark that generates moving gradients, which involves many memory writes. In both Java 11 and 25, I try to refresh the gradient every 5 milliseconds. -![](ffm-gradient-demo.png) +![](ffm-gradient-demo.jpg) The results speak for themselves (tested on a MacOS M2 with Azul Zulu 25): diff --git a/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.23.11.jpg b/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.23.11.jpg new file mode 100644 index 000000000..efc1b1929 Binary files /dev/null and b/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.23.11.jpg differ diff --git a/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.23.11.png b/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.23.11.png deleted file mode 100644 index 06fd573e1..000000000 Binary files a/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.23.11.png and /dev/null differ diff --git a/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.02.jpg b/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.02.jpg new file mode 100644 index 000000000..6e2b02441 Binary files /dev/null and b/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.02.jpg differ diff --git a/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.02.png b/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.02.png deleted file mode 100644 index 2151df20c..000000000 Binary files a/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.02.png and /dev/null differ diff --git a/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.15.jpg b/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.15.jpg new file mode 100644 index 000000000..29ee72259 Binary files /dev/null and b/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.15.jpg differ diff --git a/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.15.png b/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.15.png deleted file mode 100644 index b09b771e7..000000000 Binary files a/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.15.png and /dev/null differ diff --git a/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.38.jpg b/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.38.jpg new file mode 100644 index 000000000..c8c42cb27 Binary files /dev/null and b/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.38.jpg differ diff --git a/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.38.png b/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.38.png deleted file mode 100644 index 6b2f298fd..000000000 Binary files a/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/Screenshot-2026-01-19-at-15.24.38.png and /dev/null differ diff --git a/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/index.md b/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/index.md index d78f3c543..08673ec9a 100644 --- a/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/index.md +++ b/content/posts/2026/01/19/sonarqube-part-4-ai-code-assurance/index.md @@ -49,13 +49,13 @@ Whether you are in IntelliJ (via Connected Mode) or reviewing a Pull Request in * **Your Job:** You just review the diff and click **"Apply"**. What used to take 20 minutes of refactoring now takes 10 seconds of reviewing. -![](Screenshot-2026-01-19-at-15.23.11.png) +![](Screenshot-2026-01-19-at-15.23.11.jpg) We can see here the issue and the execution flow, and the "Generate AI Fix" button -![](Screenshot-2026-01-19-at-15.24.02.png) +![](Screenshot-2026-01-19-at-15.24.02.jpg) And the solution suggested by SonarQube AI CodeFix feature -![](Screenshot-2026-01-19-at-15.24.15.png) +![](Screenshot-2026-01-19-at-15.24.15.jpg) And finally this is the way we see the change coming from SonarQube AI CodeFix in IntelliJ IDE @@ -97,7 +97,7 @@ The "Black Box" of AI code is a major anxiety for Tech Leads. **The Solution:** [AI Code Assurance](https://www.sonarsource.com/solutions/ai/ai-code-assurance/). SonarQube allows you to tag projects that use Generative AI or Autodetects AI-generated content (at the moment only considering Github Copilot projects). It then enforces a specific, stricter **"AI Code Assurance"** process. -![](Screenshot-2026-01-19-at-15.24.38.png) +![](Screenshot-2026-01-19-at-15.24.38.jpg) It will assign the "Sonar way" quality profile to the project, that checks for: diff --git a/content/posts/2026/01/26/whats-new-in-the-january-2026-payara-platform-release/Payara-New-Release-Image-Square.jpg b/content/posts/2026/01/26/whats-new-in-the-january-2026-payara-platform-release/Payara-New-Release-Image-Square.jpg new file mode 100644 index 000000000..e732d1b7d Binary files /dev/null and b/content/posts/2026/01/26/whats-new-in-the-january-2026-payara-platform-release/Payara-New-Release-Image-Square.jpg differ diff --git a/content/posts/2026/01/26/whats-new-in-the-january-2026-payara-platform-release/Payara-New-Release-Image-Square.png b/content/posts/2026/01/26/whats-new-in-the-january-2026-payara-platform-release/Payara-New-Release-Image-Square.png deleted file mode 100644 index a48bd8dab..000000000 Binary files a/content/posts/2026/01/26/whats-new-in-the-january-2026-payara-platform-release/Payara-New-Release-Image-Square.png and /dev/null differ diff --git a/content/posts/2026/01/26/whats-new-in-the-january-2026-payara-platform-release/index.md b/content/posts/2026/01/26/whats-new-in-the-january-2026-payara-platform-release/index.md index 6878c34d3..cff20e5b5 100644 --- a/content/posts/2026/01/26/whats-new-in-the-january-2026-payara-platform-release/index.md +++ b/content/posts/2026/01/26/whats-new-in-the-january-2026-payara-platform-release/index.md @@ -5,7 +5,7 @@ description: "As we begin 2026, we’re pleased to announce new releases across authors: - "dominika-tasarz" - "luqman-saeed" -image: "Payara-New-Release-Image-Square.png" +image: "Payara-New-Release-Image-Square.jpg" categories: - "Jakarta EE" - "Java" diff --git a/content/posts/2026/01/28/first-test-of-java-on-the-orange-pi-arm-and-risc-v/geometric-mean-of-all-test-results-resul-22d2e7a7.svg b/content/posts/2026/01/28/first-test-of-java-on-the-orange-pi-arm-and-risc-v/geometric-mean-of-all-test-results-resul-22d2e7a7.svg new file mode 100644 index 000000000..96d0d34dd --- /dev/null +++ b/content/posts/2026/01/28/first-test-of-java-on-the-orange-pi-arm-and-risc-v/geometric-mean-of-all-test-results-resul-22d2e7a7.svg @@ -0,0 +1 @@ +Phoronix.comGeometric Mean, More Is BetterGeometric Mean Of All Test ResultsResult Composite - Orange Pi RV2 RISC-V Ky X1 CPU BenchmarksRaspberry Pi 500Raspberry Pi 400HiFive Premier P550Orange Pi RV2HiFive Unmatched102030405046.16119.06113.0469.3975.151 diff --git a/content/posts/2026/01/28/first-test-of-java-on-the-orange-pi-arm-and-risc-v/index.md b/content/posts/2026/01/28/first-test-of-java-on-the-orange-pi-arm-and-risc-v/index.md index cbb417536..9d553df77 100644 --- a/content/posts/2026/01/28/first-test-of-java-on-the-orange-pi-arm-and-risc-v/index.md +++ b/content/posts/2026/01/28/first-test-of-java-on-the-orange-pi-arm-and-risc-v/index.md @@ -130,7 +130,7 @@ I ran the same JBang examples that worked on the OrangePi 5 Ultra. Plain Java co [Phoronix](https://www.phoronix.com/) conducted comprehensive benchmarks comparing the OrangePi RV2 with Raspberry Pi boards. Their [Java SciMark 2.2 tests](https://www.phoronix.com/review/orange-pi-rv2-benchmarks/5) show the RV2 is 2-7 times slower than the Raspberry Pi 5 depending on the workload. The [overall benchmark results](https://www.phoronix.com/review/orange-pi-rv2-benchmarks/7) paint a clearer picture: -![Phoronix benchmark results](https://phoronix.com/benchmark/result/orange-pi-rv2-risc-v-ky-x1-cpu-benchmarks/geometric-mean-of-all-test-results-result-composite-oprrvkxcb.svgz) +![Phoronix benchmark results](geometric-mean-of-all-test-results-resul-22d2e7a7.svg) The RV2 scores lower than both the Raspberry Pi 4 and 5 across most tests. This isn't a surprise because RISC-V is still maturing, and the Ky X1 is an early implementation. The 8 cores help with parallel workloads, but single-threaded performance lags behind ARM equivalents. diff --git a/content/posts/2026/01/29/bootstrapping-a-java-file-system/gosling-507x510.jpg b/content/posts/2026/01/29/bootstrapping-a-java-file-system/gosling-507x510.jpg new file mode 100644 index 000000000..3a534f59c Binary files /dev/null and b/content/posts/2026/01/29/bootstrapping-a-java-file-system/gosling-507x510.jpg differ diff --git a/content/posts/2026/01/29/bootstrapping-a-java-file-system/gosling-507x510.png b/content/posts/2026/01/29/bootstrapping-a-java-file-system/gosling-507x510.png deleted file mode 100644 index b0cd44663..000000000 Binary files a/content/posts/2026/01/29/bootstrapping-a-java-file-system/gosling-507x510.png and /dev/null differ diff --git a/content/posts/2026/01/29/bootstrapping-a-java-file-system/index.md b/content/posts/2026/01/29/bootstrapping-a-java-file-system/index.md index 9562bcbbe..4040cfebe 100644 --- a/content/posts/2026/01/29/bootstrapping-a-java-file-system/index.md +++ b/content/posts/2026/01/29/bootstrapping-a-java-file-system/index.md @@ -28,7 +28,7 @@ In this post, I'll explain the basics of Java's file systems to get you started. ## History of File Systems Within Java A short, flippant, perhaps not even completely correct history of the Java APIs for [file systems](https://en.wikipedia.org/wiki/File_system). Not required reading, jump ahead if you're getting antsy to start actual work! -> ![](gosling-507x510.png) +> ![](gosling-507x510.jpg) > > *The initial release of [Java 1.0](https://en.wikipedia.org/wiki/Java_version_history#JDK_1.0) provided access to the operating system's file system via [java.io.File](https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/io/File.html), a simple implementation built on blocking I/O and single-threaded operations. Usable but limited, adequate performance but definitely not scalable. Acceptable for a small target audience, perhaps viewed as more proof-of-concept than anything; doubtful that [James Gosling](https://computerhistory.org/profile/james-gosling/) or anyone at [Sun](https://www.britannica.com/money/Sun-Microsystems-Inc) envisioned the boheimeth Java has since become.* > diff --git a/content/posts/2026/01/31/javafx-links-of-january-2026/index.md b/content/posts/2026/01/31/javafx-links-of-january-2026/index.md index e851476a0..25c43a091 100644 --- a/content/posts/2026/01/31/javafx-links-of-january-2026/index.md +++ b/content/posts/2026/01/31/javafx-links-of-january-2026/index.md @@ -5,7 +5,7 @@ description: "Here are the JavaFX LinksOfTheMonth of January 2026. You can find canonical: "https://webtechie.be/post/2026-01-30-javafx-links-of-january-2026/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2026/01/31/javafx-links-of-january-2026/jfxcentral.jpg b/content/posts/2026/01/31/javafx-links-of-january-2026/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2026/01/31/javafx-links-of-january-2026/jfxcentral.jpg differ diff --git a/content/posts/2026/01/31/javafx-links-of-january-2026/jfxcentral.png b/content/posts/2026/01/31/javafx-links-of-january-2026/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2026/01/31/javafx-links-of-january-2026/jfxcentral.png and /dev/null differ diff --git a/content/posts/2026/02/02/announcing-sustainability-for-java-developers-a-new-collaborative-guide-from-the-foojay-io-community/index.md b/content/posts/2026/02/02/announcing-sustainability-for-java-developers-a-new-collaborative-guide-from-the-foojay-io-community/index.md index 2afbfde5d..15505de31 100644 --- a/content/posts/2026/02/02/announcing-sustainability-for-java-developers-a-new-collaborative-guide-from-the-foojay-io-community/index.md +++ b/content/posts/2026/02/02/announcing-sustainability-for-java-developers-a-new-collaborative-guide-from-the-foojay-io-community/index.md @@ -27,7 +27,7 @@ Java developers from around the world are writing a book about a question that's *Sustainability for Java Developers: Towards an Understanding of Sustainable Java Software Development* is now freely available on Leanpub, bringing together Java Champions, architects, and technical writers to look at sustainability from every angle. -{{< img src="sustainabilitybook-793x1024.png" class="size-large is-resized" width="793" height="1024" style="width:277px;height:auto" >}} +{{< img src="sustainabilitybook-793x1024.jpg" class="size-large is-resized" width="793" height="1024" style="width:277px;height:auto" >}} The book covers everything from the environmental footprint of our data centers to the ethics of open source supply chains, from efficient data formats to the often-overlooked topic of career longevity. diff --git a/content/posts/2026/02/02/announcing-sustainability-for-java-developers-a-new-collaborative-guide-from-the-foojay-io-community/sustainabilitybook-793x1024.jpg b/content/posts/2026/02/02/announcing-sustainability-for-java-developers-a-new-collaborative-guide-from-the-foojay-io-community/sustainabilitybook-793x1024.jpg new file mode 100644 index 000000000..92dda2915 Binary files /dev/null and b/content/posts/2026/02/02/announcing-sustainability-for-java-developers-a-new-collaborative-guide-from-the-foojay-io-community/sustainabilitybook-793x1024.jpg differ diff --git a/content/posts/2026/02/02/announcing-sustainability-for-java-developers-a-new-collaborative-guide-from-the-foojay-io-community/sustainabilitybook-793x1024.png b/content/posts/2026/02/02/announcing-sustainability-for-java-developers-a-new-collaborative-guide-from-the-foojay-io-community/sustainabilitybook-793x1024.png deleted file mode 100644 index e63ff61e2..000000000 Binary files a/content/posts/2026/02/02/announcing-sustainability-for-java-developers-a-new-collaborative-guide-from-the-foojay-io-community/sustainabilitybook-793x1024.png and /dev/null differ diff --git a/content/posts/2026/02/02/bringing-java-closer-to-education-a-community-driven-initiative/catalog.jpg b/content/posts/2026/02/02/bringing-java-closer-to-education-a-community-driven-initiative/catalog.jpg new file mode 100644 index 000000000..316a6d9ad Binary files /dev/null and b/content/posts/2026/02/02/bringing-java-closer-to-education-a-community-driven-initiative/catalog.jpg differ diff --git a/content/posts/2026/02/02/bringing-java-closer-to-education-a-community-driven-initiative/catalog.png b/content/posts/2026/02/02/bringing-java-closer-to-education-a-community-driven-initiative/catalog.png deleted file mode 100644 index 053ef139e..000000000 Binary files a/content/posts/2026/02/02/bringing-java-closer-to-education-a-community-driven-initiative/catalog.png and /dev/null differ diff --git a/content/posts/2026/02/02/bringing-java-closer-to-education-a-community-driven-initiative/index.md b/content/posts/2026/02/02/bringing-java-closer-to-education-a-community-driven-initiative/index.md index e757347a1..1ca87752b 100644 --- a/content/posts/2026/02/02/bringing-java-closer-to-education-a-community-driven-initiative/index.md +++ b/content/posts/2026/02/02/bringing-java-closer-to-education-a-community-driven-initiative/index.md @@ -5,7 +5,7 @@ lastmod: "2026-02-03T07:20:29+00:00" description: "Over the past decades, Java has proven itself to be one of the most reliable, versatile, and widely used programming languages in the world. From…" authors: - "igor-de-souza" -image: "catalog.png" +image: "catalog.jpg" categories: - "Campaigns" - "Java" diff --git a/content/posts/2026/02/02/claude-code-sonarqube-mcp/Screenshot-2026-02-02-at-15.46.22.jpg b/content/posts/2026/02/02/claude-code-sonarqube-mcp/Screenshot-2026-02-02-at-15.46.22.jpg new file mode 100644 index 000000000..fe1782a8b Binary files /dev/null and b/content/posts/2026/02/02/claude-code-sonarqube-mcp/Screenshot-2026-02-02-at-15.46.22.jpg differ diff --git a/content/posts/2026/02/02/claude-code-sonarqube-mcp/Screenshot-2026-02-02-at-15.46.22.png b/content/posts/2026/02/02/claude-code-sonarqube-mcp/Screenshot-2026-02-02-at-15.46.22.png deleted file mode 100644 index 5fdfa4d49..000000000 Binary files a/content/posts/2026/02/02/claude-code-sonarqube-mcp/Screenshot-2026-02-02-at-15.46.22.png and /dev/null differ diff --git a/content/posts/2026/02/02/claude-code-sonarqube-mcp/index.md b/content/posts/2026/02/02/claude-code-sonarqube-mcp/index.md index 16afe0212..5391d5cdb 100644 --- a/content/posts/2026/02/02/claude-code-sonarqube-mcp/index.md +++ b/content/posts/2026/02/02/claude-code-sonarqube-mcp/index.md @@ -87,7 +87,7 @@ claude mcp add sonarqube \ Once this is running, Claude will have [25 SonarQube tools](https://github.com/SonarSource/sonarqube-mcp-server?tab=readme-ov-file#tools) in its belt that will allow the Agent to interact with SonarQube to get issues, quality gate status, analyze snippets, and more. -![](Screenshot-2026-02-02-at-15.46.22.png) +![](Screenshot-2026-02-02-at-15.46.22.jpg) ### **Step 2: The Action (Java Example) ☕** diff --git a/content/posts/2026/02/05/mongodb-8-0-migration-guide-what-you-need-to-know-before-upgrading/Screenshot-2025-12-30-at-10.22.59-PM.jpg b/content/posts/2026/02/05/mongodb-8-0-migration-guide-what-you-need-to-know-before-upgrading/Screenshot-2025-12-30-at-10.22.59-PM.jpg new file mode 100644 index 000000000..2ade84c9c Binary files /dev/null and b/content/posts/2026/02/05/mongodb-8-0-migration-guide-what-you-need-to-know-before-upgrading/Screenshot-2025-12-30-at-10.22.59-PM.jpg differ diff --git a/content/posts/2026/02/05/mongodb-8-0-migration-guide-what-you-need-to-know-before-upgrading/Screenshot-2025-12-30-at-10.22.59-PM.png b/content/posts/2026/02/05/mongodb-8-0-migration-guide-what-you-need-to-know-before-upgrading/Screenshot-2025-12-30-at-10.22.59-PM.png deleted file mode 100644 index 0ae514327..000000000 Binary files a/content/posts/2026/02/05/mongodb-8-0-migration-guide-what-you-need-to-know-before-upgrading/Screenshot-2025-12-30-at-10.22.59-PM.png and /dev/null differ diff --git a/content/posts/2026/02/05/mongodb-8-0-migration-guide-what-you-need-to-know-before-upgrading/index.md b/content/posts/2026/02/05/mongodb-8-0-migration-guide-what-you-need-to-know-before-upgrading/index.md index 87f2bffa2..f2a769ca8 100644 --- a/content/posts/2026/02/05/mongodb-8-0-migration-guide-what-you-need-to-know-before-upgrading/index.md +++ b/content/posts/2026/02/05/mongodb-8-0-migration-guide-what-you-need-to-know-before-upgrading/index.md @@ -232,7 +232,7 @@ No other place will contain more valuable information than the release notes of #### Check the driver compatibility Before upgrading anything MongoDB related, it's crucial to check the compatibility tables in the documentation for your driver. To **avoid** **breaking your application**, you should ensure that the MongoDB version is compatible with the MongoDB driver that you plan to use. Take a look at this image: -![](Screenshot-2025-12-30-at-10.22.59-PM.png) +![](Screenshot-2025-12-30-at-10.22.59-PM.jpg) *MongoDB Java Driver Compatibility Table* diff --git a/content/posts/2026/02/11/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/index.md b/content/posts/2026/02/11/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/index.md index 545415e82..93c80b051 100644 --- a/content/posts/2026/02/11/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/index.md +++ b/content/posts/2026/02/11/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/index.md @@ -208,7 +208,7 @@ Open JProfiler. ![immagine](jprofiler0-700x279.png) -![immagine](jprofiler1-694x510.png) +![immagine](jprofiler1-694x510.jpg) The GUI will attach to remote JVM running inside the unikernel(or connect to remote jvm running in you cloud provider or onprem). diff --git a/content/posts/2026/02/11/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/jprofiler1-694x510.jpg b/content/posts/2026/02/11/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/jprofiler1-694x510.jpg new file mode 100644 index 000000000..9a3ab084d Binary files /dev/null and b/content/posts/2026/02/11/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/jprofiler1-694x510.jpg differ diff --git a/content/posts/2026/02/11/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/jprofiler1-694x510.png b/content/posts/2026/02/11/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/jprofiler1-694x510.png deleted file mode 100644 index 414dbd8dd..000000000 Binary files a/content/posts/2026/02/11/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/jprofiler1-694x510.png and /dev/null differ diff --git a/content/posts/2026/02/16/windsurf-ai-java-code-quality/Screenshot-2026-02-16-at-09.06.32-1024x381.jpg b/content/posts/2026/02/16/windsurf-ai-java-code-quality/Screenshot-2026-02-16-at-09.06.32-1024x381.jpg new file mode 100644 index 000000000..700ed6033 Binary files /dev/null and b/content/posts/2026/02/16/windsurf-ai-java-code-quality/Screenshot-2026-02-16-at-09.06.32-1024x381.jpg differ diff --git a/content/posts/2026/02/16/windsurf-ai-java-code-quality/Screenshot-2026-02-16-at-09.06.32-1024x381.png b/content/posts/2026/02/16/windsurf-ai-java-code-quality/Screenshot-2026-02-16-at-09.06.32-1024x381.png deleted file mode 100644 index e04d77355..000000000 Binary files a/content/posts/2026/02/16/windsurf-ai-java-code-quality/Screenshot-2026-02-16-at-09.06.32-1024x381.png and /dev/null differ diff --git a/content/posts/2026/02/16/windsurf-ai-java-code-quality/index.md b/content/posts/2026/02/16/windsurf-ai-java-code-quality/index.md index e60768937..27c1cd12c 100644 --- a/content/posts/2026/02/16/windsurf-ai-java-code-quality/index.md +++ b/content/posts/2026/02/16/windsurf-ai-java-code-quality/index.md @@ -134,7 +134,7 @@ Or even easier, using the free extension [SonarQube for IDE](https://docs.sonars ## **Example: Analyzing a snippet with** **analyze_code_snippet** **tool** Once the SonarQube MCP server is active, Windsurf has a new "tool" called analyze_code_snippet, among other 24 tools to interact with SonarQube.You can highlight a Java method and tell Cascade: *"@Utils.java#L22-31 Analyze this with Sonar and fix it."* -![](Screenshot-2026-02-16-at-09.06.32-1024x381.png) +![](Screenshot-2026-02-16-at-09.06.32-1024x381.jpg) **The Agent does the following:** diff --git a/content/posts/2026/02/17/runtime-code-analysis-in-the-age-of-vibe-coding/index.md b/content/posts/2026/02/17/runtime-code-analysis-in-the-age-of-vibe-coding/index.md index 42bc83ffb..92d76e1e6 100644 --- a/content/posts/2026/02/17/runtime-code-analysis-in-the-age-of-vibe-coding/index.md +++ b/content/posts/2026/02/17/runtime-code-analysis-in-the-age-of-vibe-coding/index.md @@ -5,7 +5,7 @@ lastmod: "2026-02-17T18:33:34+00:00" description: "In the era of vibe coding—where large amounts of code are introduced or refactored in short bursts, often with the help of LLMs—you need immediate…" authors: - "suneet-kamath" -image: "what.png" +image: "what.jpg" categories: - "Java" - "Observability" diff --git a/content/posts/2026/02/17/runtime-code-analysis-in-the-age-of-vibe-coding/what.jpg b/content/posts/2026/02/17/runtime-code-analysis-in-the-age-of-vibe-coding/what.jpg new file mode 100644 index 000000000..4e748c786 Binary files /dev/null and b/content/posts/2026/02/17/runtime-code-analysis-in-the-age-of-vibe-coding/what.jpg differ diff --git a/content/posts/2026/02/17/runtime-code-analysis-in-the-age-of-vibe-coding/what.png b/content/posts/2026/02/17/runtime-code-analysis-in-the-age-of-vibe-coding/what.png deleted file mode 100644 index 99356181b..000000000 Binary files a/content/posts/2026/02/17/runtime-code-analysis-in-the-age-of-vibe-coding/what.png and /dev/null differ diff --git a/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/SoJ26-Download.jpg b/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/SoJ26-Download.jpg new file mode 100644 index 000000000..ce159e713 Binary files /dev/null and b/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/SoJ26-Download.jpg differ diff --git a/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/SoJ26-Download.png b/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/SoJ26-Download.png deleted file mode 100644 index 293efb92c..000000000 Binary files a/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/SoJ26-Download.png and /dev/null differ diff --git a/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/SofJ26-Infographic-1024x576.jpg b/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/SofJ26-Infographic-1024x576.jpg new file mode 100644 index 000000000..8e89491fb Binary files /dev/null and b/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/SofJ26-Infographic-1024x576.jpg differ diff --git a/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/SofJ26-Infographic-1024x576.png b/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/SofJ26-Infographic-1024x576.png deleted file mode 100644 index 544f04b44..000000000 Binary files a/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/SofJ26-Infographic-1024x576.png and /dev/null differ diff --git a/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/index.md b/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/index.md index 55ce9f5b8..3b31c658e 100644 --- a/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/index.md +++ b/content/posts/2026/02/17/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/index.md @@ -6,7 +6,7 @@ description: "Every year, I look forward to our State of Java Survey & Report  canonical: "https://www.azul.com/blog/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/" authors: - "scott-sellers" -image: "SoJ26-Download.png" +image: "SoJ26-Download.jpg" categories: - "Java" - "Java Core" @@ -22,7 +22,7 @@ Every year, I look forward to our [State of Java Survey \& Report](https://www.a > ***Java is evolving faster than ever. AI is accelerating that shift. And the pressure to optimize cloud spending and avoid unpredictable Java licensing costs is now shaping strategic decisions across the enterprise.*** As the only company 100% focused on Java, we get to see these changes up close. -![](SofJ26-Infographic-1024x576.png) +![](SofJ26-Infographic-1024x576.jpg) Here are the key takeaways and what they mean for your business. @@ -135,4 +135,4 @@ Today, 36% of the Fortune 100 and many of the world's most respected brands rely And we're just getting started. I invite you to [dive deeper into the full report](https://www.azul.com/state-of-java-2026/) and join the conversation about where Java is heading next. -[![](SoJ26-Download.png)](https://www.azul.com/state-of-java-2026/) +[![](SoJ26-Download.jpg)](https://www.azul.com/state-of-java-2026/) diff --git a/content/posts/2026/02/24/mongodb-and-the-raft-algorithm/0-CAtq0SjCCYL4gRBY-d187c60c.png b/content/posts/2026/02/24/mongodb-and-the-raft-algorithm/0-CAtq0SjCCYL4gRBY-d187c60c.png new file mode 100644 index 000000000..77950ef33 Binary files /dev/null and b/content/posts/2026/02/24/mongodb-and-the-raft-algorithm/0-CAtq0SjCCYL4gRBY-d187c60c.png differ diff --git a/content/posts/2026/02/24/mongodb-and-the-raft-algorithm/Screenshot-2025-12-30-at-10.34.23-PM.jpg b/content/posts/2026/02/24/mongodb-and-the-raft-algorithm/Screenshot-2025-12-30-at-10.34.23-PM.jpg new file mode 100644 index 000000000..4294aa8f7 Binary files /dev/null and b/content/posts/2026/02/24/mongodb-and-the-raft-algorithm/Screenshot-2025-12-30-at-10.34.23-PM.jpg differ diff --git a/content/posts/2026/02/24/mongodb-and-the-raft-algorithm/Screenshot-2025-12-30-at-10.34.23-PM.png b/content/posts/2026/02/24/mongodb-and-the-raft-algorithm/Screenshot-2025-12-30-at-10.34.23-PM.png deleted file mode 100644 index 3b04124c7..000000000 Binary files a/content/posts/2026/02/24/mongodb-and-the-raft-algorithm/Screenshot-2025-12-30-at-10.34.23-PM.png and /dev/null differ diff --git a/content/posts/2026/02/24/mongodb-and-the-raft-algorithm/index.md b/content/posts/2026/02/24/mongodb-and-the-raft-algorithm/index.md index c4c315c92..8d749f496 100644 --- a/content/posts/2026/02/24/mongodb-and-the-raft-algorithm/index.md +++ b/content/posts/2026/02/24/mongodb-and-the-raft-algorithm/index.md @@ -5,7 +5,7 @@ lastmod: "2026-02-24T15:47:29+00:00" description: "MongoDB’s replica set architecture uses distributed consensus to ensure consistency, availability, and fault tolerance across nodes. At the core of this architecture is the Raft consensus algorithm, which breaks the complexities of distributed consensus into manageable operations: leader election, log replication, and commitment. This document explores how MongoDB integrates and optimizes Raft for its high-performance replication needs." authors: - "elie-hannouch" -image: "Screenshot-2025-12-30-at-10.34.23-PM.png" +image: "Screenshot-2025-12-30-at-10.34.23-PM.jpg" categories: - "Databases" - "Mongo" @@ -18,7 +18,7 @@ frozen: false --- [MongoDB's replica](https://www.mongodb.com/docs/manual/replication/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=mongodb-raft-foojay&utm_term=tony.kim) set architecture uses distributed consensus to ensure consistency, availability, and fault tolerance across nodes. At the core of this architecture is the **Raft consensus algorithm**, which breaks the complexities of distributed consensus into manageable operations: leader election, log replication, and commitment. This document explores how MongoDB integrates and optimizes Raft for its high-performance replication needs. -![](https://miro.medium.com/v2/resize:fit:700/0*CAtq0SjCCYL4gRBY.png) +![](0-CAtq0SjCCYL4gRBY-d187c60c.png) ### Raft Roles and MongoDB's Replica Set diff --git a/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/beaglev-fire-boot-interrupt.jpg b/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/beaglev-fire-boot-interrupt.jpg new file mode 100644 index 000000000..e66a657b5 Binary files /dev/null and b/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/beaglev-fire-boot-interrupt.jpg differ diff --git a/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/beaglev-fire-boot-interrupt.png b/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/beaglev-fire-boot-interrupt.png deleted file mode 100644 index f6f834116..000000000 Binary files a/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/beaglev-fire-boot-interrupt.png and /dev/null differ diff --git a/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/beaglev-fire-usb-disc.jpg b/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/beaglev-fire-usb-disc.jpg new file mode 100644 index 000000000..94a517213 Binary files /dev/null and b/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/beaglev-fire-usb-disc.jpg differ diff --git a/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/beaglev-fire-usb-disc.png b/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/beaglev-fire-usb-disc.png deleted file mode 100644 index dc266c071..000000000 Binary files a/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/beaglev-fire-usb-disc.png and /dev/null differ diff --git a/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/index.md b/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/index.md index e65b19bff..0c5302e47 100644 --- a/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/index.md +++ b/content/posts/2026/02/25/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/index.md @@ -37,7 +37,7 @@ As described on the [BeagleBoard Documentation \> Boards \> BeagleV-Fire \> Quic {{< gallery >}} beaglev-fire-serial.jpg beaglev-fire-connected.jpg -beaglev-fire-usb-disc.png +beaglev-fire-usb-disc.jpg {{< /gallery >}} You also need a USB-to-USB cable to connect the board to your computer. @@ -82,7 +82,7 @@ $ sudo screen /dev/ttyUSB0 115200 ``` With the serial connection established, check the board output in the `screen` session and wait for the message `Press a key to enter CLI` to appear. You have one second to react, so be fast! 🙂 -![](beaglev-fire-boot-interrupt.png) +![](beaglev-fire-boot-interrupt.jpg) Then type in the following two commands: diff --git a/content/posts/2026/02/26/tomcat-tlsv13-cipher-configuration-spring-boot/index.md b/content/posts/2026/02/26/tomcat-tlsv13-cipher-configuration-spring-boot/index.md index a206d629e..65186be43 100644 --- a/content/posts/2026/02/26/tomcat-tlsv13-cipher-configuration-spring-boot/index.md +++ b/content/posts/2026/02/26/tomcat-tlsv13-cipher-configuration-spring-boot/index.md @@ -6,7 +6,7 @@ description: "A Tomcat update splits TLSv1.3 cipher configuration into a new att canonical: "https://www.herodevs.com/blog-posts/tomcats-tls-cipher-change-and-what-it-means-for-spring-boot-apps" authors: - "joe-kuhel" -image: "tomcat.png" +image: "tomcat.jpg" categories: - "Apache Tomcat" - "Java" diff --git a/content/posts/2026/02/26/tomcat-tlsv13-cipher-configuration-spring-boot/tomcat.jpg b/content/posts/2026/02/26/tomcat-tlsv13-cipher-configuration-spring-boot/tomcat.jpg new file mode 100644 index 000000000..f8e197c2b Binary files /dev/null and b/content/posts/2026/02/26/tomcat-tlsv13-cipher-configuration-spring-boot/tomcat.jpg differ diff --git a/content/posts/2026/02/26/tomcat-tlsv13-cipher-configuration-spring-boot/tomcat.png b/content/posts/2026/02/26/tomcat-tlsv13-cipher-configuration-spring-boot/tomcat.png deleted file mode 100644 index 9502f3c64..000000000 Binary files a/content/posts/2026/02/26/tomcat-tlsv13-cipher-configuration-spring-boot/tomcat.png and /dev/null differ diff --git a/content/posts/2026/02/26/translating-a-website-into-8-languages-with-ai-agents-in-one-night/index.md b/content/posts/2026/02/26/translating-a-website-into-8-languages-with-ai-agents-in-one-night/index.md index 4ebe473de..9f49acce8 100644 --- a/content/posts/2026/02/26/translating-a-website-into-8-languages-with-ai-agents-in-one-night/index.md +++ b/content/posts/2026/02/26/translating-a-website-into-8-languages-with-ai-agents-in-one-night/index.md @@ -98,7 +98,7 @@ The most impressive moment was the Arabic translation ([PR #91](https://github.c This was a genuinely thoughtful architectural change that I hadn't explicitly requested. The agent understood that Arabic support implies RTL layout and acted on it. -![Arabic localization on the Java Evolved website](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w3itxwxcyyoksvae22m3.png) +![Arabic localization on the Java Evolved website](w3itxwxcyyoksvae22m3-ac168c38.png) ### The One Bug diff --git a/content/posts/2026/02/26/translating-a-website-into-8-languages-with-ai-agents-in-one-night/w3itxwxcyyoksvae22m3-ac168c38.png b/content/posts/2026/02/26/translating-a-website-into-8-languages-with-ai-agents-in-one-night/w3itxwxcyyoksvae22m3-ac168c38.png new file mode 100644 index 000000000..cd1a2221e Binary files /dev/null and b/content/posts/2026/02/26/translating-a-website-into-8-languages-with-ai-agents-in-one-night/w3itxwxcyyoksvae22m3-ac168c38.png differ diff --git a/content/posts/2026/02/28/javafx-links-of-february-2026/index.md b/content/posts/2026/02/28/javafx-links-of-february-2026/index.md index 0f09d4db1..588ad68ae 100644 --- a/content/posts/2026/02/28/javafx-links-of-february-2026/index.md +++ b/content/posts/2026/02/28/javafx-links-of-february-2026/index.md @@ -5,7 +5,7 @@ description: "Here are the JavaFX LinksOfTheMonth of February 2026. You can find canonical: "https://webtechie.be/post/2026-02-26-javafx-links-of-february-2026/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2026/02/28/javafx-links-of-february-2026/jfxcentral.jpg b/content/posts/2026/02/28/javafx-links-of-february-2026/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2026/02/28/javafx-links-of-february-2026/jfxcentral.jpg differ diff --git a/content/posts/2026/02/28/javafx-links-of-february-2026/jfxcentral.png b/content/posts/2026/02/28/javafx-links-of-february-2026/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2026/02/28/javafx-links-of-february-2026/jfxcentral.png and /dev/null differ diff --git a/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/index.md b/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/index.md index 17c514783..84b1769ee 100644 --- a/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/index.md +++ b/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/index.md @@ -146,9 +146,9 @@ The "[Vanilla JavaScript](http://vanilla-js.com/)" (= no libraries, just HTML/CS The dashboard pulls the latest summary and other data files from the repository, so it's a living comparison that grows as more test reports become available. {{< gallery >}} -sbc-benchmarks-filters-1024x555.png -sbc-benchmarks-overall-1024x612.png -sbc-benchmarks-tests-1024x789.png +sbc-benchmarks-filters-1024x555.jpg +sbc-benchmarks-overall-1024x612.jpg +sbc-benchmarks-tests-1024x789.jpg {{< /gallery >}} These are screenshots from a first test round. Check the [actual last status at webtechie.be/sbc/](https://webtechie.be/sbc/). diff --git a/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-filters-1024x555.jpg b/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-filters-1024x555.jpg new file mode 100644 index 000000000..6d3271ba7 Binary files /dev/null and b/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-filters-1024x555.jpg differ diff --git a/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-filters-1024x555.png b/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-filters-1024x555.png deleted file mode 100644 index 67a4d7098..000000000 Binary files a/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-filters-1024x555.png and /dev/null differ diff --git a/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-overall-1024x612.jpg b/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-overall-1024x612.jpg new file mode 100644 index 000000000..cfe6cc312 Binary files /dev/null and b/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-overall-1024x612.jpg differ diff --git a/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-overall-1024x612.png b/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-overall-1024x612.png deleted file mode 100644 index a3399a141..000000000 Binary files a/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-overall-1024x612.png and /dev/null differ diff --git a/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-tests-1024x789.jpg b/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-tests-1024x789.jpg new file mode 100644 index 000000000..cb130f478 Binary files /dev/null and b/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-tests-1024x789.jpg differ diff --git a/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-tests-1024x789.png b/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-tests-1024x789.png deleted file mode 100644 index 14be41090..000000000 Binary files a/content/posts/2026/03/04/java-benchmarks-on-single-board-computers/sbc-benchmarks-tests-1024x789.png and /dev/null differ diff --git a/content/posts/2026/03/09/dpop-what-it-is-how-it-works-and-why-bearer-tokens-arent-enough/Screenshot-2026-03-09-at-09.33.06-scaled.jpg b/content/posts/2026/03/09/dpop-what-it-is-how-it-works-and-why-bearer-tokens-arent-enough/Screenshot-2026-03-09-at-09.33.06-scaled.jpg new file mode 100644 index 000000000..f05c0d48d Binary files /dev/null and b/content/posts/2026/03/09/dpop-what-it-is-how-it-works-and-why-bearer-tokens-arent-enough/Screenshot-2026-03-09-at-09.33.06-scaled.jpg differ diff --git a/content/posts/2026/03/09/dpop-what-it-is-how-it-works-and-why-bearer-tokens-arent-enough/Screenshot-2026-03-09-at-09.33.06-scaled.png b/content/posts/2026/03/09/dpop-what-it-is-how-it-works-and-why-bearer-tokens-arent-enough/Screenshot-2026-03-09-at-09.33.06-scaled.png deleted file mode 100644 index 931ef5207..000000000 Binary files a/content/posts/2026/03/09/dpop-what-it-is-how-it-works-and-why-bearer-tokens-arent-enough/Screenshot-2026-03-09-at-09.33.06-scaled.png and /dev/null differ diff --git a/content/posts/2026/03/09/dpop-what-it-is-how-it-works-and-why-bearer-tokens-arent-enough/index.md b/content/posts/2026/03/09/dpop-what-it-is-how-it-works-and-why-bearer-tokens-arent-enough/index.md index de7fd82c3..c752d6f97 100644 --- a/content/posts/2026/03/09/dpop-what-it-is-how-it-works-and-why-bearer-tokens-arent-enough/index.md +++ b/content/posts/2026/03/09/dpop-what-it-is-how-it-works-and-why-bearer-tokens-arent-enough/index.md @@ -5,7 +5,7 @@ lastmod: "2026-03-09T08:08:08+00:00" description: "DPoP is one of the most exciting developments in the IAM (Identity and Access Management) space in recent years. Yet many backend developers either have…" authors: - "huseyin-akdogan" -image: "Screenshot-2026-03-09-at-09.33.06-scaled.png" +image: "Screenshot-2026-03-09-at-09.33.06-scaled.jpg" categories: - "Security" related_posts: diff --git a/content/posts/2026/03/10/event-driven-architecture-in-java-and-kafka/Screenshot-2026-03-06-at-12.27.45-PM.jpg b/content/posts/2026/03/10/event-driven-architecture-in-java-and-kafka/Screenshot-2026-03-06-at-12.27.45-PM.jpg new file mode 100644 index 000000000..7613d1be0 Binary files /dev/null and b/content/posts/2026/03/10/event-driven-architecture-in-java-and-kafka/Screenshot-2026-03-06-at-12.27.45-PM.jpg differ diff --git a/content/posts/2026/03/10/event-driven-architecture-in-java-and-kafka/Screenshot-2026-03-06-at-12.27.45-PM.png b/content/posts/2026/03/10/event-driven-architecture-in-java-and-kafka/Screenshot-2026-03-06-at-12.27.45-PM.png deleted file mode 100644 index 85ca5575f..000000000 Binary files a/content/posts/2026/03/10/event-driven-architecture-in-java-and-kafka/Screenshot-2026-03-06-at-12.27.45-PM.png and /dev/null differ diff --git a/content/posts/2026/03/10/event-driven-architecture-in-java-and-kafka/index.md b/content/posts/2026/03/10/event-driven-architecture-in-java-and-kafka/index.md index 1bf52b71a..7fb16a727 100644 --- a/content/posts/2026/03/10/event-driven-architecture-in-java-and-kafka/index.md +++ b/content/posts/2026/03/10/event-driven-architecture-in-java-and-kafka/index.md @@ -31,7 +31,7 @@ As a key part of global initiatives to modernize national airspace systems, many The data is used both by ground based air-traffic controllers, and by pilots to display the location, direction, speed and altitude of nearby aircraft on moving map displays, providing a level of situational awareness that wasn't available with older, ground radar based systems. One of the coolest things for me, the pilot of a small private propeller aircraft, about the rollout of ADS-B has been that I have more location data of nearby aircraft than most commercial jet pilots had just 10 years ago, and I am only using an iPad app and a cheap data receiver (built using a Raspberry Pi, a USB radio receivers ordered from Amazon, and software from the excellent [Stratux](https://github.com/stratux/stratux) open-source project). This has been a huge boost for safety, helping to avoid aircraft collisions both in the air and on the ground at airports. -![iPad running the ForeFlight aviation application displaying nearby aircraft data received from a Raspberry Pi based ADS-B receiver.](Screenshot-2026-03-06-at-12.27.45-PM.png) +![iPad running the ForeFlight aviation application displaying nearby aircraft data received from a Raspberry Pi based ADS-B receiver.](Screenshot-2026-03-06-at-12.27.45-PM.jpg) From a data processing standpoint, ADS-B data is typical of modern streaming, event-driven systems. The messages themselves are relatively small and simple in structure, and are typically translated to JSON by most receiver systems, making MongoDB ideally suited to working with them. The following is an example message: diff --git a/content/posts/2026/03/10/introducing-lottie4j-a-javafx-library-to-parse-and-play-lottie-animation-files/github-repo-1024x793.jpg b/content/posts/2026/03/10/introducing-lottie4j-a-javafx-library-to-parse-and-play-lottie-animation-files/github-repo-1024x793.jpg new file mode 100644 index 000000000..7a113e6ed Binary files /dev/null and b/content/posts/2026/03/10/introducing-lottie4j-a-javafx-library-to-parse-and-play-lottie-animation-files/github-repo-1024x793.jpg differ diff --git a/content/posts/2026/03/10/introducing-lottie4j-a-javafx-library-to-parse-and-play-lottie-animation-files/github-repo-1024x793.png b/content/posts/2026/03/10/introducing-lottie4j-a-javafx-library-to-parse-and-play-lottie-animation-files/github-repo-1024x793.png deleted file mode 100644 index 58b914533..000000000 Binary files a/content/posts/2026/03/10/introducing-lottie4j-a-javafx-library-to-parse-and-play-lottie-animation-files/github-repo-1024x793.png and /dev/null differ diff --git a/content/posts/2026/03/10/introducing-lottie4j-a-javafx-library-to-parse-and-play-lottie-animation-files/index.md b/content/posts/2026/03/10/introducing-lottie4j-a-javafx-library-to-parse-and-play-lottie-animation-files/index.md index a0bb4bb40..411c93962 100644 --- a/content/posts/2026/03/10/introducing-lottie4j-a-javafx-library-to-parse-and-play-lottie-animation-files/index.md +++ b/content/posts/2026/03/10/introducing-lottie4j-a-javafx-library-to-parse-and-play-lottie-animation-files/index.md @@ -45,7 +45,7 @@ Lottie4J is organized into three main modules: {{< gallery >}} json-parsing.png fxfileviewer-1024x457.png -github-repo-1024x793.png +github-repo-1024x793.jpg {{< /gallery >}} ## Making Sense of the JSON diff --git a/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/hyper-in-intellij-700x439.jpg b/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/hyper-in-intellij-700x439.jpg new file mode 100644 index 000000000..1a5e7341e Binary files /dev/null and b/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/hyper-in-intellij-700x439.jpg differ diff --git a/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/hyper-in-intellij-700x439.png b/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/hyper-in-intellij-700x439.png deleted file mode 100644 index a716e35d8..000000000 Binary files a/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/hyper-in-intellij-700x439.png and /dev/null differ diff --git a/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/index.md b/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/index.md index 4ab8bcfae..431a507ab 100644 --- a/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/index.md +++ b/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/index.md @@ -39,7 +39,7 @@ Or install directly from the marketplace: 👉 -![](plugin-web-view-695x510.png) +![](plugin-web-view-695x510.jpg) ## Key Features @@ -55,7 +55,7 @@ Features include: * Language-aware formatting * Support for modern BoxLang syntax -![](hyper-in-intellij-700x439.png) +![](hyper-in-intellij-700x439.jpg) ### 🧰 BoxLang Project Creation diff --git a/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/plugin-web-view-695x510.jpg b/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/plugin-web-view-695x510.jpg new file mode 100644 index 000000000..d5736456b Binary files /dev/null and b/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/plugin-web-view-695x510.jpg differ diff --git a/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/plugin-web-view-695x510.png b/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/plugin-web-view-695x510.png deleted file mode 100644 index 453d4140e..000000000 Binary files a/content/posts/2026/03/10/introducing-the-boxlang-ide-plugin-for-intellij/plugin-web-view-695x510.png and /dev/null differ diff --git a/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.01.48-PM.jpg b/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.01.48-PM.jpg new file mode 100644 index 000000000..a2e124482 Binary files /dev/null and b/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.01.48-PM.jpg differ diff --git a/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.01.48-PM.png b/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.01.48-PM.png deleted file mode 100644 index 85219de40..000000000 Binary files a/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.01.48-PM.png and /dev/null differ diff --git a/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.02.23-PM.jpg b/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.02.23-PM.jpg new file mode 100644 index 000000000..0ea7511d6 Binary files /dev/null and b/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.02.23-PM.jpg differ diff --git a/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.02.23-PM.png b/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.02.23-PM.png deleted file mode 100644 index 2dc42c1d5..000000000 Binary files a/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.02.23-PM.png and /dev/null differ diff --git a/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.08.53-PM.jpg b/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.08.53-PM.jpg new file mode 100644 index 000000000..f5d1209eb Binary files /dev/null and b/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.08.53-PM.jpg differ diff --git a/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.08.53-PM.png b/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.08.53-PM.png deleted file mode 100644 index 08244a36b..000000000 Binary files a/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.08.53-PM.png and /dev/null differ diff --git a/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.09.17-PM.jpg b/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.09.17-PM.jpg new file mode 100644 index 000000000..49a028724 Binary files /dev/null and b/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.09.17-PM.jpg differ diff --git a/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.09.17-PM.png b/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.09.17-PM.png deleted file mode 100644 index 2f05b928b..000000000 Binary files a/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/Screenshot-2026-03-10-at-2.09.17-PM.png and /dev/null differ diff --git a/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/index.md b/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/index.md index fb322064e..9efa0a90b 100644 --- a/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/index.md +++ b/content/posts/2026/03/12/atlas-online-archive-efficiently-manage-the-data-lifecycle/index.md @@ -100,10 +100,10 @@ In this example, we are not purging any data as per business rules. Schedule archiving window: This feature enables you to customize schedules. For example, you can run archive jobs during non-business hours or downtime windows to make sure it has a low impact on applications. Step 4: You can add any further partition fields required. -![Configure online archive – partition query fields](Screenshot-2026-03-10-at-2.01.48-PM.png) +![Configure online archive – partition query fields](Screenshot-2026-03-10-at-2.01.48-PM.jpg) Step 5: Once the rule configuration is completed, the wizard prompts a detailed review of your archival rule. You can observe Namespace, service provider (AWS), Storage Region (Mumbai), Archive Field, Age Limit, etc. -![configure an online archive – Review and Confirm page](Screenshot-2026-03-10-at-2.02.23-PM.png) +![configure an online archive – Review and Confirm page](Screenshot-2026-03-10-at-2.02.23-PM.jpg) Step 6: Once the steps are reviewed, click on BeginArchiving to create data federation instances in the [DataFederation](https://www.mongodb.com/docs/atlas/data-federation/tutorial/getting-started/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=atlas-mongodb-foojay&utm_term=tony.kim) tab. Then, it will start archiving data based on the validation rule and move to [AWS S3 storage](https://www.mongodb.com/docs/atlas/billing/data-federation/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=atlas-mongodb-foojay&utm_term=tony.kim#data-federation-costs). One of the best features is you can modify, pause, and delete online archival rules any time around the clock. For instance, your archival criteria can change at any time. ![configure an online archive – Begin Archiving confirm page](Screenshot-2026-03-10-at-2.02.51-PM.png) @@ -199,10 +199,10 @@ Alternatively, with all three of these connection strings, you can fetch from th ![Three separate connection strings after online archive setup completed](Screenshot-2026-03-10-at-2.08.24-PM.png) MongoShell prompt: To connect both archived data from the Data Federation tab, you can view the difference between both archived data in the form of READ-ONLY mode. -![ShellPrompt → The left side is only an archived database view; the right side is an Atlas online archive cluster databases view.](Screenshot-2026-03-10-at-2.08.53-PM.png) +![ShellPrompt → The left side is only an archived database view; the right side is an Atlas online archive cluster databases view.](Screenshot-2026-03-10-at-2.08.53-PM.jpg) MongoShell prompt: Here in the main cluster, you can view a list of databases where you can access, read, and write frequent data through a cluster connection string. -![ShellPrompt → Base cluster list of databases where CRUD operations are performed from the application](Screenshot-2026-03-10-at-2.09.17-PM.png) +![ShellPrompt → Base cluster list of databases where CRUD operations are performed from the application](Screenshot-2026-03-10-at-2.09.17-PM.jpg) ## Conclusion diff --git a/content/posts/2026/03/17/java-26-is-here-and-with-it-a-solid-foundation-for-the-future/index.md b/content/posts/2026/03/17/java-26-is-here-and-with-it-a-solid-foundation-for-the-future/index.md index 5e14e847b..a1a6a4905 100644 --- a/content/posts/2026/03/17/java-26-is-here-and-with-it-a-solid-foundation-for-the-future/index.md +++ b/content/posts/2026/03/17/java-26-is-here-and-with-it-a-solid-foundation-for-the-future/index.md @@ -939,7 +939,7 @@ For more information on this feature, read [JEP 500](https://openjdk.org/jeps/50 ### JEP 504: Remove the Applet API When the Java Platform rose to fame in the late 1990s and early 2000s, one of its main catalysts were Java applets and the Applet API. Java applets were small Java programs that could be embedded in web pages and run in a web browser, allowing developers to create interactive web applications. They were widely used for things like games, animations, and other interactive content on the web. People who weren't Java programmers at all at least knew the name 'Java' from their browser because of applets! (in roughly the same way as kids these days know about Java's existence because of a game called Minecraft.) -![Hello! I am an applet!](https://hanno.codes/assets/images/blog/java-applet.png) +![Hello! I am an applet!](java-applet-a1600453.png) However, over time, Java applets became less popular due to security concerns and the rise of alternative technologies such as JavaScript and HTML5. As a result, many browser vendors have removed support for them. This is why the Applet API [was deprecated in Java 9](https://openjdk.org/jeps/289), [deprecated for removal in Java 17](https://openjdk.org/jeps/398) and it's one of the reasons why it will be removed in its entirety in Java 26. On top of that, a necessary foundation for running applets by sandboxing untrusted code, the Security Manager, [was permanently disabled in Java 24](https://openjdk.org/jeps/486), providing another reason to finally sunset the Applet API. diff --git a/content/posts/2026/03/17/java-26-is-here-and-with-it-a-solid-foundation-for-the-future/java-applet-a1600453.png b/content/posts/2026/03/17/java-26-is-here-and-with-it-a-solid-foundation-for-the-future/java-applet-a1600453.png new file mode 100644 index 000000000..c2d77c7ee Binary files /dev/null and b/content/posts/2026/03/17/java-26-is-here-and-with-it-a-solid-foundation-for-the-future/java-applet-a1600453.png differ diff --git a/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/0gsxbnd1s0wp17s6qpvh-95dcb25e.jpg b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/0gsxbnd1s0wp17s6qpvh-95dcb25e.jpg new file mode 100644 index 000000000..30a8f88ab Binary files /dev/null and b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/0gsxbnd1s0wp17s6qpvh-95dcb25e.jpg differ diff --git a/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/29sbgmnsw6ssl24c07nu-19c0328e.jpg b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/29sbgmnsw6ssl24c07nu-19c0328e.jpg new file mode 100644 index 000000000..2d3cc9149 Binary files /dev/null and b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/29sbgmnsw6ssl24c07nu-19c0328e.jpg differ diff --git a/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/4f0m21ugh7r831whoo7u-e939b97e.jpg b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/4f0m21ugh7r831whoo7u-e939b97e.jpg new file mode 100644 index 000000000..183da3c84 Binary files /dev/null and b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/4f0m21ugh7r831whoo7u-e939b97e.jpg differ diff --git a/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/dtk9g9m66vas1r9kjei7-9265a707.jpg b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/dtk9g9m66vas1r9kjei7-9265a707.jpg new file mode 100644 index 000000000..88756b0e3 Binary files /dev/null and b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/dtk9g9m66vas1r9kjei7-9265a707.jpg differ diff --git a/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/index.md b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/index.md index 668eb8c27..f70d6bf81 100644 --- a/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/index.md +++ b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/index.md @@ -105,7 +105,7 @@ By using the [Java AOT Cache Diagnostics Tool](https://github.com/Delawen/leyden | 1000 requests training | 60 000 requests training | |----------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------| -| ![Summary of the contents of the cache](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tgqbt6fjhvzn9hg4tuh9.png) | ![Summary of the contents of the cache](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0gsxbnd1s0wp17s6qpvh.png) | +| ![Summary of the contents of the cache](tgqbt6fjhvzn9hg4tuh9-83c6c159.jpg) | ![Summary of the contents of the cache](0gsxbnd1s0wp17s6qpvh-95dcb25e.jpg) | As expected, both trainings seem to have cached the same amount of metadata (slightly above 99% of classes used), because the code loaded into memory on both cases should be more or less the same (some timeout or runtime exception thrown may explain differences). This means that the startup time using any of the generated caches should be similar. @@ -113,7 +113,7 @@ The training with 60 000 requests has many more methods that are profiled and co Anyway, we should notice an improvement on startup time compared to the regular Java deployment, because we have a lot of metadata, profile and linkage data and some heap data already cached during AOT. And as we can see on the following graph, time to first response (which includes initialization) is already cut in half. -![Graph showing startup times](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qygejm886j7mbi7hmyeq.png) +![Graph showing startup times](qygejm886j7mbi7hmyeq-55f2d758.jpg) The other interesting measurement is how much and for how long response times are disrupted during the early stages of application execution. There is always some small variation in response times even when an app is fully warmed up – often referred to as *jitter*. @@ -121,7 +121,7 @@ However, during warmup the housekeeping work that the JVM has to do can signific In theory, this is where longer training sessions should have a bigger impact. Better training results in more cached classes and heap objects needed in production, more pre-linking of calls and accesses, more method profile data to allow earlier and better informed compilation. So, we should see not only an improvement compared to the regular java version, but also a difference between the two trained caches. -![Graph showing response times](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ye2msxg4ad4qtpx87949.png) +![Graph showing response times](ye2msxg4ad4qtpx87949-edb12a4a.jpg) The graph above shows individual response times for requests for each of the three deployments, Traditional Java (no AOT), AOT trained with 1000 requests, and AOT trained with 60 000 requests. @@ -132,9 +132,9 @@ However, it is also very clear that 1. There is a lot more JVM housework being performed in the non-AOT case than when using AOT, reaching peak performance later. 2. The well trained cache suffers less jitter, i.e. removes a lot more housework, than the weakly trained app. -![Response Peak Times](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/29sbgmnsw6ssl24c07nu.png) +![Response Peak Times](29sbgmnsw6ssl24c07nu-19c0328e.jpg) -![Response Peak Times](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kw0edxat8cv5ye1vgedq.png) +![Response Peak Times](kw0edxat8cv5ye1vgedq-cb0f73d6.jpg) Note that JDK26 does store training data on the cache, but does not store compiled code. This means, future versions of the JDK will show a much larger difference between weak and strong training regimes. @@ -146,13 +146,13 @@ We use a single training run with 10 000 requests, executing a test that calls t Let's take a look at the time to first response to see if it is improved by Leyden AOT: -![Graph with startup times](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4f0m21ugh7r831whoo7u.png) +![Graph with startup times](4f0m21ugh7r831whoo7u-e939b97e.jpg) Startup time in this example is slower than in the previous example because we have to initialize connections to the database and load the database model. Now, let's take a look at the response times and see if the warmup time is also improved thanks to the AOT cache. -![Response Times](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dtk9g9m66vas1r9kjei7.png) +![Response Times](dtk9g9m66vas1r9kjei7-9265a707.jpg) Both runs suffer jitter during the first requests, at which point most of the housekeeping work is completed. The dramatic drop off in jitter for the AOT run around request 45 indicates that at this point almost all loading, initialization and linking costs have been met and the necessary compiled code has been delivered. By contrast the non-AOT run is still suffering jitter even after 100 requests i.e. it has still not warmed up to reach peak performance. diff --git a/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/kw0edxat8cv5ye1vgedq-cb0f73d6.jpg b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/kw0edxat8cv5ye1vgedq-cb0f73d6.jpg new file mode 100644 index 000000000..b0c903f53 Binary files /dev/null and b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/kw0edxat8cv5ye1vgedq-cb0f73d6.jpg differ diff --git a/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/qygejm886j7mbi7hmyeq-55f2d758.jpg b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/qygejm886j7mbi7hmyeq-55f2d758.jpg new file mode 100644 index 000000000..83a56f67b Binary files /dev/null and b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/qygejm886j7mbi7hmyeq-55f2d758.jpg differ diff --git a/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/tgqbt6fjhvzn9hg4tuh9-83c6c159.jpg b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/tgqbt6fjhvzn9hg4tuh9-83c6c159.jpg new file mode 100644 index 000000000..1dbd76218 Binary files /dev/null and b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/tgqbt6fjhvzn9hg4tuh9-83c6c159.jpg differ diff --git a/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/ye2msxg4ad4qtpx87949-edb12a4a.jpg b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/ye2msxg4ad4qtpx87949-edb12a4a.jpg new file mode 100644 index 000000000..df5d96039 Binary files /dev/null and b/content/posts/2026/03/18/how-is-leyden-improving-java-performance-part-2-of-3/ye2msxg4ad4qtpx87949-edb12a4a.jpg differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/03a6piohlhtpe6o9pxu2-8e5b2851.jpg b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/03a6piohlhtpe6o9pxu2-8e5b2851.jpg new file mode 100644 index 000000000..7aa7d6a86 Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/03a6piohlhtpe6o9pxu2-8e5b2851.jpg differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/1qy162x59wrvcednnvj6-f6ff78b5.png b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/1qy162x59wrvcednnvj6-f6ff78b5.png new file mode 100644 index 000000000..33a10b5af Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/1qy162x59wrvcednnvj6-f6ff78b5.png differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/2uiwzejfxl06c1s6j52n-8a6045d1.jpg b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/2uiwzejfxl06c1s6j52n-8a6045d1.jpg new file mode 100644 index 000000000..c4879ae54 Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/2uiwzejfxl06c1s6j52n-8a6045d1.jpg differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/6giwwa05hkx45hzjgcao-f895c434.png b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/6giwwa05hkx45hzjgcao-f895c434.png new file mode 100644 index 000000000..33a10b5af Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/6giwwa05hkx45hzjgcao-f895c434.png differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/9p8uizqz0ykh6yhxhd6b-ba2994ef.jpg b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/9p8uizqz0ykh6yhxhd6b-ba2994ef.jpg new file mode 100644 index 000000000..9948c059a Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/9p8uizqz0ykh6yhxhd6b-ba2994ef.jpg differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/afd4p3y0b33anyhdphn3-d3a90f80.webp b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/afd4p3y0b33anyhdphn3-d3a90f80.webp new file mode 100644 index 000000000..2106b1e48 Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/afd4p3y0b33anyhdphn3-d3a90f80.webp differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/ap5aht7vkwb5z6ndw9ec-1eea071a.jpg b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/ap5aht7vkwb5z6ndw9ec-1eea071a.jpg new file mode 100644 index 000000000..f51584314 Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/ap5aht7vkwb5z6ndw9ec-1eea071a.jpg differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/auqd1030lo0ywgyksi9k-b9934104.jpg b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/auqd1030lo0ywgyksi9k-b9934104.jpg new file mode 100644 index 000000000..4ee39e467 Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/auqd1030lo0ywgyksi9k-b9934104.jpg differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/d0x89ecm3c7yfyxv17dh-7f0ec28c.jpg b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/d0x89ecm3c7yfyxv17dh-7f0ec28c.jpg new file mode 100644 index 000000000..a97a67b71 Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/d0x89ecm3c7yfyxv17dh-7f0ec28c.jpg differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/g6z2lwbnno5gy8jti0wj-5758d589.webp b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/g6z2lwbnno5gy8jti0wj-5758d589.webp new file mode 100644 index 000000000..8497ac569 Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/g6z2lwbnno5gy8jti0wj-5758d589.webp differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/index.md b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/index.md index abdabcfd7..c71970a31 100644 --- a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/index.md +++ b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/index.md @@ -39,7 +39,7 @@ Dynamic assets are data that get generated, or are collected, at runtime as a si Finally, they include training data, created as a training run progresses to track what the JVM has done and why. Training data identify what JVM assets need to be stored into the cache when it is created. They are also installed in the cache, indexing the other assets and helping identify how to use them in production. -![Types of assets on the AOT Cache](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9d94n4orpjxb2gyr6tgy.png) +![Types of assets on the AOT Cache](9d94n4orpjxb2gyr6tgy.png) We can also distinguish two types of data depending on their purpose: @@ -95,7 +95,7 @@ The first thing we need to do is to compile this application on the root folder: ***$ mvn clean package*** -![mvn clean package](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tm6pz4hlp6od2017a0s7.gif) +![mvn clean package](tm6pz4hlp6od2017a0s7-ca7451ce.webp) ## Training the application @@ -113,7 +113,7 @@ The arguments we are going to use are the following: ***$ oha --urls-from-file src/main/resources/urls.txt -n 100*** -![Training run](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vwsfv1ms80rzxo5rrkxg.gif) +![Training run](vwsfv1ms80rzxo5rrkxg-cd7f2c34.gif) Now that we have trained the application, let's stop it with *ctrl+c*. It will take some time to stop while it builds the cache. It will do both the training and assembly steps at once. @@ -134,7 +134,7 @@ The arguments we are going to use are the following: And we can use the application normally. Let's play a bit on -![Production Run](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g6z2lwbnno5gy8jti0wj.gif) +![Production Run](g6z2lwbnno5gy8jti0wj-5758d589.webp) On this run, we created the *production.log* file. @@ -150,27 +150,27 @@ The first step is loading all the information into the tool, to run a proper ana \***\\\> load productionLog --background target/production.log\*\*** -![Analysis](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v72kofa8l5sqihzox336.gif) +![Analysis](v72kofa8l5sqihzox336-0d481502.webp) Now we are ready to start our analysis. A good place to start is the info command that shows a summarized version of what is inside the cache: -![Info](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2uiwzejfxl06c1s6j52n.png) +![Info](2uiwzejfxl06c1s6j52n-8a6045d1.jpg) ### Are we training the right thing? The first thing that should catch our attention is that there's more than 10% of classes that were used on the production run but were not cached. That's not usual, so let's dig into whatImage description those classes are. There are hundreds of them, so if we filter by our package name, that would make our exploration easier: -![ls --loaded=production](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1qy162x59wrvcednnvj6.png) +![ls --loaded=production](1qy162x59wrvcednnvj6-f6ff78b5.png) What does this mean? Let's take a closer look: -![describe -i org.cutecats.rest.json.CatPhotoGenerator -hints](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/auqd1030lo0ywgyksi9k.png) +![describe -i org.cutecats.rest.json.CatPhotoGenerator -hints](auqd1030lo0ywgyksi9k-b9934104.jpg) This class was not loaded during training but it was loaded during production. Something went wrong with our training. We can explore the class *org.cutecats.rest.json.CatPhotoGenerator* by looking at the source code. There, we discover that it should be used by *org.cutecats.rest.json.CatResource*. -![describe -i org.cutecats.rest.json.CatResource](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tsmt7f8c5m6drge89zlu.png) +![describe -i org.cutecats.rest.json.CatResource](tsmt7f8c5m6drge89zlu-f3f0fd7a.jpg) So, this class was loaded both on training and production runs, and the metadata is included in the AOT Cache. But for some reason, none of its methods were profiled during the training run. This means that our training run did not make extensive use of this class. Maybe we should take a look at our training run. @@ -180,13 +180,13 @@ Let's run again the training, changing the url to the Java endpoints instead of Don't forget to remove the log and aot files from target/ after each try to have clean runs (the clean on the maven command should do that). -![Training 2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/itlu30hylyznb4tf4kez.gif) +![Training 2](itlu30hylyznb4tf4kez-51f4674f.gif) If we analyze the results again with our tool, we should see a different result: -![Analysis 2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/touldogey5247oofxhzh.gif) +![Analysis 2](touldogey5247oofxhzh-ffe9c6a9.gif) -![Info](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/odglwgkgke1f6iylhqqv.png) +![Info](odglwgkgke1f6iylhqqv-df9b376a.jpg) We have increased the percentage of the classes used (96%) in production that were cached compared to our last attempt (89%). That's an improvement. @@ -194,13 +194,13 @@ We have increased the percentage of the classes used (96%) in production that we Let's check again for classes loaded in production that were not cached: -![ls --loaded=production](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6giwwa05hkx45hzjgcao.png) +![ls --loaded=production](6giwwa05hkx45hzjgcao-f895c434.png) Something is still not working as intended. Maybe we should approach this from the other side: are we executing some testing code that replaces the real production code that should be executed during training? Let's check if there's something being stored in the cache that we don't really need: -![ls -pn=org.cutecats.rest.json -t=Class](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nc8op283birg0li59uue.png) +![ls -pn=org.cutecats.rest.json -t=Class](nc8op283birg0li59uue-78a469d0.jpg) We can see a suspicious class called *DummyPhotoGenerator*. That's supposed to be used only for testing purposes, not for real training and production. Using DummyPhotoGenerator instead of the CatPhotoGenerator class is making the code and classes used by CatPhotoGenerator not being used. If we explore our source code, we will discover that there is a "test" argument on the /cats endpoint that distinguishes between testing and production. @@ -210,7 +210,7 @@ The training run has to be as close to production as possible. If we use test cl Let's try again, now using in the urls.txt file. -![Analysis 3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ap5aht7vkwb5z6ndw9ec.png) +![Analysis 3](ap5aht7vkwb5z6ndw9ec-1eea071a.jpg) We have increased a bit more the percentage of classes loaded, which is always a good sign. @@ -220,7 +220,7 @@ Do we have any other classes loaded during production that were not cached durin Are there any testing classes loaded during training or production runs? -![Looking for classes](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/03a6piohlhtpe6o9pxu2.png) +![Looking for classes](03a6piohlhtpe6o9pxu2-8e5b2851.jpg) We made sure that: @@ -236,18 +236,18 @@ Maybe you already noticed another important information we have been ignoring un Profiling is done on each method independently, so let's take a look at one of our methods that we know should be well trained. The describe command is pretty self explanatory on this case: -![describe -t=Method](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d0x89ecm3c7yfyxv17dh.png) +![describe -t=Method](d0x89ecm3c7yfyxv17dh-7f0ec28c.jpg) Let's follow the recommendation and do more requests during the training run. ***$ oha --urls-from-file src/main/resources/urls.txt -n 10k*** -![Training](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/afd4p3y0b33anyhdphn3.gif) +![Training](afd4p3y0b33anyhdphn3-d3a90f80.webp) And with 10 000 requests done, we can see that we got our method completely profiled and compiled to the higher level: -![Info](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o7cys8sp4ut7i9pj4lvy.png) +![Info](o7cys8sp4ut7i9pj4lvy-0f689f9d.jpg) -![describe trained method](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9p8uizqz0ykh6yhxhd6b.png) +![describe trained method](9p8uizqz0ykh6yhxhd6b-ba2994ef.jpg) There's still more improvements that can be done to the training that will greatly depend on your application, but now we have all the basics covered. diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/itlu30hylyznb4tf4kez-51f4674f.gif b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/itlu30hylyznb4tf4kez-51f4674f.gif new file mode 100644 index 000000000..4ed51ea18 Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/itlu30hylyznb4tf4kez-51f4674f.gif differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/nc8op283birg0li59uue-78a469d0.jpg b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/nc8op283birg0li59uue-78a469d0.jpg new file mode 100644 index 000000000..f43ec6fee Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/nc8op283birg0li59uue-78a469d0.jpg differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/o7cys8sp4ut7i9pj4lvy-0f689f9d.jpg b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/o7cys8sp4ut7i9pj4lvy-0f689f9d.jpg new file mode 100644 index 000000000..726ecd034 Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/o7cys8sp4ut7i9pj4lvy-0f689f9d.jpg differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/odglwgkgke1f6iylhqqv-df9b376a.jpg b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/odglwgkgke1f6iylhqqv-df9b376a.jpg new file mode 100644 index 000000000..00330c4e3 Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/odglwgkgke1f6iylhqqv-df9b376a.jpg differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/tm6pz4hlp6od2017a0s7-ca7451ce.webp b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/tm6pz4hlp6od2017a0s7-ca7451ce.webp new file mode 100644 index 000000000..f36bca3d1 Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/tm6pz4hlp6od2017a0s7-ca7451ce.webp differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/touldogey5247oofxhzh-ffe9c6a9.gif b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/touldogey5247oofxhzh-ffe9c6a9.gif new file mode 100644 index 000000000..558d14109 Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/touldogey5247oofxhzh-ffe9c6a9.gif differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/tsmt7f8c5m6drge89zlu-f3f0fd7a.jpg b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/tsmt7f8c5m6drge89zlu-f3f0fd7a.jpg new file mode 100644 index 000000000..6c5d9814e Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/tsmt7f8c5m6drge89zlu-f3f0fd7a.jpg differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/v72kofa8l5sqihzox336-0d481502.webp b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/v72kofa8l5sqihzox336-0d481502.webp new file mode 100644 index 000000000..97bf1515a Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/v72kofa8l5sqihzox336-0d481502.webp differ diff --git a/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/vwsfv1ms80rzxo5rrkxg-cd7f2c34.gif b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/vwsfv1ms80rzxo5rrkxg-cd7f2c34.gif new file mode 100644 index 000000000..5f9c18c6c Binary files /dev/null and b/content/posts/2026/03/19/how-is-leyden-improving-java-performance-part-3-of-3/vwsfv1ms80rzxo5rrkxg-cd7f2c34.gif differ diff --git a/content/posts/2026/03/23/java-for-scripting/index.md b/content/posts/2026/03/23/java-for-scripting/index.md index 10a38e920..70303b5b3 100644 --- a/content/posts/2026/03/23/java-for-scripting/index.md +++ b/content/posts/2026/03/23/java-for-scripting/index.md @@ -6,7 +6,7 @@ description: "Discover how Java has evolved into a powerful scripting language, canonical: "https://lomagnette.github.io/posts/javascript-no-not-that-one-modern-automation-with-java/" authors: - "loic-magnette" -image: "java-script-cover-700x467-1.png" +image: "java-script-cover-700x467-1.jpg" categories: - "Java" - "Java Core" @@ -21,7 +21,7 @@ related_posts: frozen: false --- -![](java-script-cover-700x467.png) +![](java-script-cover-700x467.jpg) ## The Scripting Dilemma diff --git a/content/posts/2026/03/23/java-for-scripting/java-script-cover-700x467-1.jpg b/content/posts/2026/03/23/java-for-scripting/java-script-cover-700x467-1.jpg new file mode 100644 index 000000000..653a42623 Binary files /dev/null and b/content/posts/2026/03/23/java-for-scripting/java-script-cover-700x467-1.jpg differ diff --git a/content/posts/2026/03/23/java-for-scripting/java-script-cover-700x467-1.png b/content/posts/2026/03/23/java-for-scripting/java-script-cover-700x467-1.png deleted file mode 100644 index 52141f51f..000000000 Binary files a/content/posts/2026/03/23/java-for-scripting/java-script-cover-700x467-1.png and /dev/null differ diff --git a/content/posts/2026/03/23/java-for-scripting/java-script-cover-700x467.jpg b/content/posts/2026/03/23/java-for-scripting/java-script-cover-700x467.jpg new file mode 100644 index 000000000..653a42623 Binary files /dev/null and b/content/posts/2026/03/23/java-for-scripting/java-script-cover-700x467.jpg differ diff --git a/content/posts/2026/03/23/java-for-scripting/java-script-cover-700x467.png b/content/posts/2026/03/23/java-for-scripting/java-script-cover-700x467.png deleted file mode 100644 index 52141f51f..000000000 Binary files a/content/posts/2026/03/23/java-for-scripting/java-script-cover-700x467.png and /dev/null differ diff --git a/content/posts/2026/03/24/clean-architecture-with-spring-boot-and-mongodb/Screenshot-2026-03-18-at-8.36.30-AM.jpg b/content/posts/2026/03/24/clean-architecture-with-spring-boot-and-mongodb/Screenshot-2026-03-18-at-8.36.30-AM.jpg new file mode 100644 index 000000000..b38c7a426 Binary files /dev/null and b/content/posts/2026/03/24/clean-architecture-with-spring-boot-and-mongodb/Screenshot-2026-03-18-at-8.36.30-AM.jpg differ diff --git a/content/posts/2026/03/24/clean-architecture-with-spring-boot-and-mongodb/Screenshot-2026-03-18-at-8.36.30-AM.png b/content/posts/2026/03/24/clean-architecture-with-spring-boot-and-mongodb/Screenshot-2026-03-18-at-8.36.30-AM.png deleted file mode 100644 index 15ed70e35..000000000 Binary files a/content/posts/2026/03/24/clean-architecture-with-spring-boot-and-mongodb/Screenshot-2026-03-18-at-8.36.30-AM.png and /dev/null differ diff --git a/content/posts/2026/03/24/clean-architecture-with-spring-boot-and-mongodb/index.md b/content/posts/2026/03/24/clean-architecture-with-spring-boot-and-mongodb/index.md index 5b1830ce0..c00713b46 100644 --- a/content/posts/2026/03/24/clean-architecture-with-spring-boot-and-mongodb/index.md +++ b/content/posts/2026/03/24/clean-architecture-with-spring-boot-and-mongodb/index.md @@ -5,7 +5,7 @@ lastmod: "2026-03-24T16:43:15+00:00" description: "In this article, you will build a product catalog with orders. Products have names, prices, and stock quantities. Orders reference products and enforce rules like \"you can't order more than what's in stock.\" The domain is small enough to follow in one sitting, but it has real business rules that benefit from the architecture. The tech stack is Java 17+, Spring Boot 3.x, and Spring Data MongoDB. By the end, you will have a project structure where the domain and application layers compile without Spring or MongoDB on the classpath." authors: - "farhan-chowdhury" -image: "Screenshot-2026-03-18-at-8.36.30-AM.png" +image: "Screenshot-2026-03-18-at-8.36.30-AM.jpg" categories: - "Databases" - "Java" @@ -35,7 +35,7 @@ Robert C. Martin introduced Clean Architecture to keep business rules independen The architecture is usually drawn as four concentric rings. Each ring is a layer. Dependencies always point inward, from the outermost frameworks ring toward the innermost domain ring: -{{< img src="Screenshot-2026-03-18-at-8.36.30-AM.png" class="aligncenter size-full is-resized" width="756" height="758" style="width:579px;height:auto" >}} +{{< img src="Screenshot-2026-03-18-at-8.36.30-AM.jpg" class="aligncenter size-full is-resized" width="756" height="758" style="width:579px;height:auto" >}} Starting from the inside: diff --git a/content/posts/2026/03/25/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/ClawRunr-Onboarding-5fb1be1e.jpg b/content/posts/2026/03/25/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/ClawRunr-Onboarding-5fb1be1e.jpg new file mode 100644 index 000000000..9492678c3 Binary files /dev/null and b/content/posts/2026/03/25/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/ClawRunr-Onboarding-5fb1be1e.jpg differ diff --git a/content/posts/2026/03/25/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/ClawRunr-Telegram-Schedule-Job-73bd3648.jpg b/content/posts/2026/03/25/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/ClawRunr-Telegram-Schedule-Job-73bd3648.jpg new file mode 100644 index 000000000..76379bfd3 Binary files /dev/null and b/content/posts/2026/03/25/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/ClawRunr-Telegram-Schedule-Job-73bd3648.jpg differ diff --git a/content/posts/2026/03/25/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/clawRunr-RecuringJob-677a1380.jpg b/content/posts/2026/03/25/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/clawRunr-RecuringJob-677a1380.jpg new file mode 100644 index 000000000..50275d839 Binary files /dev/null and b/content/posts/2026/03/25/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/clawRunr-RecuringJob-677a1380.jpg differ diff --git a/content/posts/2026/03/25/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/index.md b/content/posts/2026/03/25/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/index.md index 9f85dff4c..adc1de20a 100644 --- a/content/posts/2026/03/25/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/index.md +++ b/content/posts/2026/03/25/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/index.md @@ -21,7 +21,7 @@ Everyone assumes you need Python to build AI agents. But the Java ecosystem alre The result is [ClawRunr](https://ClawRunr.io) (everyone calls it JavaClaw, and we've stopped correcting them). An open-source AI agent runtime, written in pure Java. You can chat with it on Telegram or in the browser, ask it to summarize your emails every morning, schedule reminders, browse websites, run shell commands, connect external tools via MCP, and teach it new skills at runtime by dropping a Markdown file into a folder. In this article I'll walk you through how each part of the Spring ecosystem maps to what an AI agent actually needs. -![](https://www.jobrunr.io/blog/ClawRunr-Onboarding.png) *ClawRunr Onboarding Wizard* +![](ClawRunr-Onboarding-5fb1be1e.jpg) *ClawRunr Onboarding Wizard* ## What does an AI agent need? @@ -140,7 +140,7 @@ public class ChannelRegistry { ``` The agent itself doesn't know or care where a message came from. It processes the request, returns a response, and the runtime routes it back through the same channel. Want to add Discord? Implement the `Channel` interface. The agent code stays untouched. -![](https://www.jobrunr.io/blog/ClawRunr-Telegram-Schedule-Job.png) +![](ClawRunr-Telegram-Schedule-Job-73bd3648.jpg) ## JobRunr: the piece nobody thinks about @@ -151,7 +151,7 @@ Most agent frameworks don't have a good answer. Maybe you wire up a cron job sep This is what surprised us most when building ClawRunr. The hardest problem in an AI agent isn't the LLM part. It's reliable task execution. Agents need to schedule recurring checks, run delayed tasks, process things in the background, retry when something fails, and give you full visibility into what happened. That's not an AI problem. That's a background job problem. And [JobRunr](https://www.jobrunr.io) has been solving it since 2020. -![](https://www.jobrunr.io/blog/clawRunr-RecuringJob.png) +![](clawRunr-RecuringJob-677a1380.jpg) Here's how task execution looks in ClawRunr. The `TaskHandler` is annotated with `@Job(retries = 3)`: diff --git a/content/posts/2026/03/27/the-java-in-education-catalog-now-has-a-beautiful-home/index.md b/content/posts/2026/03/27/the-java-in-education-catalog-now-has-a-beautiful-home/index.md index c44001ab9..758a6fdd3 100644 --- a/content/posts/2026/03/27/the-java-in-education-catalog-now-has-a-beautiful-home/index.md +++ b/content/posts/2026/03/27/the-java-in-education-catalog-now-has-a-beautiful-home/index.md @@ -22,7 +22,7 @@ frozen: false A few weeks ago, Igor De Souza shared [Bringing Java Closer to Education: A Community-Driven Initiative](https://foojay.io/today/bringing-java-closer-to-education-a-community-driven-initiative/) here on Foojay. It's something we started together to gather Java educational resources in one place, making it easier for mentors, educators, and learners to discover what's out there. But let's be honest: a GitHub README, while perfectly functional, is not exactly the most inviting front door for educators who aren't already deep in the coding ecosystem. That's now fixed... -![](java-in-education-site-1024x745.png) +![](java-in-education-site-1024x745.jpg) ## Inspired by a Great Idea from James Ward diff --git a/content/posts/2026/03/27/the-java-in-education-catalog-now-has-a-beautiful-home/java-in-education-site-1024x745.jpg b/content/posts/2026/03/27/the-java-in-education-catalog-now-has-a-beautiful-home/java-in-education-site-1024x745.jpg new file mode 100644 index 000000000..b77351384 Binary files /dev/null and b/content/posts/2026/03/27/the-java-in-education-catalog-now-has-a-beautiful-home/java-in-education-site-1024x745.jpg differ diff --git a/content/posts/2026/03/27/the-java-in-education-catalog-now-has-a-beautiful-home/java-in-education-site-1024x745.png b/content/posts/2026/03/27/the-java-in-education-catalog-now-has-a-beautiful-home/java-in-education-site-1024x745.png deleted file mode 100644 index 910ef34ac..000000000 Binary files a/content/posts/2026/03/27/the-java-in-education-catalog-now-has-a-beautiful-home/java-in-education-site-1024x745.png and /dev/null differ diff --git a/content/posts/2026/03/31/javafx-links-of-march-2026/index.md b/content/posts/2026/03/31/javafx-links-of-march-2026/index.md index b25ae3fbd..782952060 100644 --- a/content/posts/2026/03/31/javafx-links-of-march-2026/index.md +++ b/content/posts/2026/03/31/javafx-links-of-march-2026/index.md @@ -5,7 +5,7 @@ description: "Here are the JavaFX LinksOfTheMonth of March 2026. You can find th canonical: "https://webtechie.be/post/2026-03-27-javafx-links-of-march-2026/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2026/03/31/javafx-links-of-march-2026/jfxcentral.jpg b/content/posts/2026/03/31/javafx-links-of-march-2026/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2026/03/31/javafx-links-of-march-2026/jfxcentral.jpg differ diff --git a/content/posts/2026/03/31/javafx-links-of-march-2026/jfxcentral.png b/content/posts/2026/03/31/javafx-links-of-march-2026/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2026/03/31/javafx-links-of-march-2026/jfxcentral.png and /dev/null differ diff --git a/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-1.39.50-PM.jpg b/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-1.39.50-PM.jpg new file mode 100644 index 000000000..26d46d0fc Binary files /dev/null and b/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-1.39.50-PM.jpg differ diff --git a/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-1.39.50-PM.png b/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-1.39.50-PM.png deleted file mode 100644 index 80d4d039c..000000000 Binary files a/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-1.39.50-PM.png and /dev/null differ diff --git a/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-2.01.40-PM.jpg b/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-2.01.40-PM.jpg new file mode 100644 index 000000000..38cb0f147 Binary files /dev/null and b/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-2.01.40-PM.jpg differ diff --git a/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-2.01.40-PM.png b/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-2.01.40-PM.png deleted file mode 100644 index 32c59f682..000000000 Binary files a/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-2.01.40-PM.png and /dev/null differ diff --git a/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-2.02.28-PM.jpg b/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-2.02.28-PM.jpg new file mode 100644 index 000000000..c46fec156 Binary files /dev/null and b/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-2.02.28-PM.jpg differ diff --git a/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-2.02.28-PM.png b/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-2.02.28-PM.png deleted file mode 100644 index 03a933aa5..000000000 Binary files a/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/Screenshot-2026-03-12-at-2.02.28-PM.png and /dev/null differ diff --git a/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/index.md b/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/index.md index e3de3fd7e..8ec23d3a5 100644 --- a/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/index.md +++ b/content/posts/2026/04/02/java-faceted-full-text-search-api-using-mongodb-atlas-search/index.md @@ -39,7 +39,7 @@ Then, you can try it out with the little sample UI: ![](Screenshot-2026-03-24-at-12.49.46-PM.png) Or directly use the API: http://localhost:8222/image/search?text=kite\&animal=dog -![](Screenshot-2026-03-12-at-1.39.50-PM.png) +![](Screenshot-2026-03-12-at-1.39.50-PM.jpg) ## Let's build! @@ -631,7 +631,7 @@ Save this as a new record in your project alongside Image and Category. This rec ![](Screenshot-2026-03-12-at-2.01.11-PM.png) Knowing this would allow you to further filter the results like: [](http://localhost:8080/images?caption=dog&sports=surfboard)[http://localhost:8080/images?caption=dog\&sports=surfboard](http://localhost:8080/images?caption=dog&sports=surfboard) -![](Screenshot-2026-03-12-at-2.01.40-PM.png) +![](Screenshot-2026-03-12-at-2.01.40-PM.jpg) Or at least, it will! Let's implement the image search API. Because there is a bit of complexity in this query, let's create a new method in the Main class to handle the search. Insert the following after your main method: @@ -749,7 +749,7 @@ ImageSearchResult images = search(imageCollection, ``` This will take the query parameters passed to the API and call our search function. Let's give it a spin, and then we'll come back and break down the search method piece by piece. You can now start to see how the facets work. Let's search for the term "riding" in our image caption, and further filter down to only images having a horse and a suitcase: [](http://localhost:8080/images?caption=riding&accessory=suitcase&animal=horse)[http://localhost:8080/images?caption=riding\&accessory=suitcase\&animal=horse](http://localhost:8080/images?caption=riding&accessory=suitcase&animal=horse) -![](Screenshot-2026-03-12-at-2.02.28-PM.png) +![](Screenshot-2026-03-12-at-2.02.28-PM.jpg) Amazing. 🙂 If you had any trouble following the steps, [refer to the tutorial code](https://github.com/luketn/atlas-search-coco-tutorial). So, let's go through the search method and explain each part piece by piece. Our aggregate search on the image MongoDB collection will have the following stages: diff --git a/content/posts/2026/04/04/from-zero-to-full-observability-with-dash0/index.md b/content/posts/2026/04/04/from-zero-to-full-observability-with-dash0/index.md index 1a430a73a..56af474e8 100644 --- a/content/posts/2026/04/04/from-zero-to-full-observability-with-dash0/index.md +++ b/content/posts/2026/04/04/from-zero-to-full-observability-with-dash0/index.md @@ -18,7 +18,7 @@ frozen: false This guide walks through the complete process of deploying a minimal Spring Boot service to Kubernetes and adding full observability using the [Dash0 Kubernetes Operator](https://www.dash0.com/docs/dash0/monitoring/kubernetes/about-kubernetes) — without making any changes to the application code. [Dash0](https://www.dash0.com/docs/dash0) is an OpenTelemetry-native observability platform that collects and correlates traces, metrics, and logs, and provides infrastructure monitoring across Kubernetes resources — pods, nodes, namespaces, deployments, daemonsets, statefulsets, jobs, and cronjobs — as well as cloud infrastructure such as AWS. Its Kubernetes operator can automatically instrument workloads at the pod level, with no changes required to application code or container images. -![](kubernetes-dash0-1024x581.png) +![](kubernetes-dash0-1024x581.jpg) The setup is divided into two distinct phases. The first phase establishes the "before" state: a service running in Kubernetes with no instrumentation, generating traffic that is completely invisible to any observability tool. The second phase adds the Dash0 operator to the cluster, which automatically instruments the workload and begins sending traces, metrics, and logs to Dash0 — again, with no changes to the application itself. @@ -348,7 +348,7 @@ Check the following: ![](dash0-pod-logs-1024x545.png) **Monitoring → Resources** — pod and node resource usage -![](kubernetes-dash0-1024x581.png) +![](kubernetes-dash0-1024x581.jpg) **Further Reading:** diff --git a/content/posts/2026/04/04/from-zero-to-full-observability-with-dash0/kubernetes-dash0-1024x581.jpg b/content/posts/2026/04/04/from-zero-to-full-observability-with-dash0/kubernetes-dash0-1024x581.jpg new file mode 100644 index 000000000..6b254a6d4 Binary files /dev/null and b/content/posts/2026/04/04/from-zero-to-full-observability-with-dash0/kubernetes-dash0-1024x581.jpg differ diff --git a/content/posts/2026/04/04/from-zero-to-full-observability-with-dash0/kubernetes-dash0-1024x581.png b/content/posts/2026/04/04/from-zero-to-full-observability-with-dash0/kubernetes-dash0-1024x581.png deleted file mode 100644 index c01fa1460..000000000 Binary files a/content/posts/2026/04/04/from-zero-to-full-observability-with-dash0/kubernetes-dash0-1024x581.png and /dev/null differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.30.27-AM-1024x572.jpg b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.30.27-AM-1024x572.jpg new file mode 100644 index 000000000..5bf1e4b01 Binary files /dev/null and b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.30.27-AM-1024x572.jpg differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.30.27-AM-1024x572.png b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.30.27-AM-1024x572.png deleted file mode 100644 index 90836a367..000000000 Binary files a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.30.27-AM-1024x572.png and /dev/null differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.31.42-AM-1024x751.jpg b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.31.42-AM-1024x751.jpg new file mode 100644 index 000000000..e692ae6ee Binary files /dev/null and b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.31.42-AM-1024x751.jpg differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.31.42-AM-1024x751.png b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.31.42-AM-1024x751.png deleted file mode 100644 index d8aea2ae7..000000000 Binary files a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.31.42-AM-1024x751.png and /dev/null differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.32.30-AM-1024x764.jpg b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.32.30-AM-1024x764.jpg new file mode 100644 index 000000000..b7f58fc94 Binary files /dev/null and b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.32.30-AM-1024x764.jpg differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.32.30-AM-1024x764.png b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.32.30-AM-1024x764.png deleted file mode 100644 index 8a828f9b6..000000000 Binary files a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.32.30-AM-1024x764.png and /dev/null differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.32.54-AM-1024x733.jpg b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.32.54-AM-1024x733.jpg new file mode 100644 index 000000000..84be0f569 Binary files /dev/null and b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.32.54-AM-1024x733.jpg differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.32.54-AM-1024x733.png b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.32.54-AM-1024x733.png deleted file mode 100644 index 10837efb9..000000000 Binary files a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.32.54-AM-1024x733.png and /dev/null differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.33.20-AM-1024x514.jpg b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.33.20-AM-1024x514.jpg new file mode 100644 index 000000000..e5875a516 Binary files /dev/null and b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.33.20-AM-1024x514.jpg differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.33.20-AM-1024x514.png b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.33.20-AM-1024x514.png deleted file mode 100644 index 08763962c..000000000 Binary files a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.33.20-AM-1024x514.png and /dev/null differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.34.18-AM-1024x593.jpg b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.34.18-AM-1024x593.jpg new file mode 100644 index 000000000..e7b7ed133 Binary files /dev/null and b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.34.18-AM-1024x593.jpg differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.34.18-AM-1024x593.png b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.34.18-AM-1024x593.png deleted file mode 100644 index bd8915a34..000000000 Binary files a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.34.18-AM-1024x593.png and /dev/null differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.34.49-AM-1024x662.jpg b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.34.49-AM-1024x662.jpg new file mode 100644 index 000000000..22c415f6c Binary files /dev/null and b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.34.49-AM-1024x662.jpg differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.34.49-AM-1024x662.png b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.34.49-AM-1024x662.png deleted file mode 100644 index ffaf9cf2f..000000000 Binary files a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.34.49-AM-1024x662.png and /dev/null differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.35.18-AM-1024x768.jpg b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.35.18-AM-1024x768.jpg new file mode 100644 index 000000000..dc0e6992d Binary files /dev/null and b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.35.18-AM-1024x768.jpg differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.35.18-AM-1024x768.png b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.35.18-AM-1024x768.png deleted file mode 100644 index a1528b7ff..000000000 Binary files a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.35.18-AM-1024x768.png and /dev/null differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.38.48-AM-744x1024.jpg b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.38.48-AM-744x1024.jpg new file mode 100644 index 000000000..568e0fe29 Binary files /dev/null and b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.38.48-AM-744x1024.jpg differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.38.48-AM-744x1024.png b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.38.48-AM-744x1024.png deleted file mode 100644 index adc1a4306..000000000 Binary files a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.38.48-AM-744x1024.png and /dev/null differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.39.25-AM-1024x668.jpg b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.39.25-AM-1024x668.jpg new file mode 100644 index 000000000..7b4153d94 Binary files /dev/null and b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.39.25-AM-1024x668.jpg differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.39.25-AM-1024x668.png b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.39.25-AM-1024x668.png deleted file mode 100644 index aed9fae13..000000000 Binary files a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/Screenshot-2026-03-27-at-9.39.25-AM-1024x668.png and /dev/null differ diff --git a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/index.md b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/index.md index 5cfffaa11..141b929ff 100644 --- a/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/index.md +++ b/content/posts/2026/04/09/building-a-kotlin-app-with-spring-boot-and-mongodb-search/index.md @@ -34,7 +34,7 @@ To achieve our goal, we will create a Kotlin Spring Boot application that commun The application will use a pre-imported database in Atlas called sample_airbnb, utilizing the listingsAndReviews collection, which contains information about various Airbnbs. To identify the best Airbnb listings, we will create an endpoint that returns information about these listings. This endpoint will use the summary field from the collection to perform a full-text search with the fuzzy parameter in text operator. Additionally, we will filter the documents based on a minimum number of reviews, utilizing the search functionalities provided by MongoDB Search. -![](Screenshot-2026-03-27-at-9.30.27-AM-1024x572.png) +![](Screenshot-2026-03-27-at-9.30.27-AM-1024x572.jpg) ## Pre-requisites @@ -62,20 +62,20 @@ Before starting, you'll need to import the sample dataset, which includes severa ![](Screenshot-2026-03-27-at-9.31.10-AM-1024x751.jpg) If everything goes smoothly, after the import, you will see our databases and collections displayed as shown in the image. -![](Screenshot-2026-03-27-at-9.31.42-AM-1024x751.png) +![](Screenshot-2026-03-27-at-9.31.42-AM-1024x751.jpg) ## Creating the MongoDB Search index After importing the collections, the next step is to create an index for the Airbnb collection. To do this, select "Database" from the side menu under "Deployment," go to the "MongoDB Search" tab, and click on "JSON Editor," as shown in the image. -![](Screenshot-2026-03-27-at-9.32.30-AM-1024x764.png) +![](Screenshot-2026-03-27-at-9.32.30-AM-1024x764.jpg) In the next step, select the **sample_airbnb** database and the **listingsAndReviews** collection (the Airbnb collection). Then, name your index "searchPlaces": -![](Screenshot-2026-03-27-at-9.32.54-AM-1024x733.png) +![](Screenshot-2026-03-27-at-9.32.54-AM-1024x733.jpg) Note that we are using Dynamic Mappings for simplicity, which allows MongoDB Search to automatically index the fields of supported types in each document. For more details, I suggest checking out[Define Field Mappings](https://www.mongodb.com/docs/atlas/atlas-search/define-field-mappings/#std-label-static-dynamic-mappings). If everything goes well, the "searchPlaces" index will be created successfully, and you can view it here. -![](Screenshot-2026-03-27-at-9.33.20-AM-1024x514.png) +![](Screenshot-2026-03-27-at-9.33.20-AM-1024x514.jpg) ## Testing our index in MongoDB Compass @@ -137,7 +137,7 @@ Let's break down each stage: 3. **$project**: This specifies which fields to include or exclude in the final result. Simply run this pipeline to obtain the results. See: -![](Screenshot-2026-03-27-at-9.34.18-AM-1024x593.png) +![](Screenshot-2026-03-27-at-9.34.18-AM-1024x593.jpg) ## Building a Kotlin application @@ -146,7 +146,7 @@ Our application will be developed in Kotlin with Spring. It's important to note ## Creating the project To do this, we'll use the [Spring Initializer official page](https://start.spring.io/) to create our project: -![](Screenshot-2026-03-27-at-9.34.49-AM-1024x662.png) +![](Screenshot-2026-03-27-at-9.34.49-AM-1024x662.jpg) As you can see, I have only added the **Spring Web** dependency. @@ -160,7 +160,7 @@ dependencies { } ``` -![](Screenshot-2026-03-27-at-9.35.18-AM-1024x768.png) +![](Screenshot-2026-03-27-at-9.35.18-AM-1024x768.jpg) ## Establishing a connection @@ -405,7 +405,7 @@ class AirbnbController( ## Final application structure Great. If all the steps have been followed, our folder structure should look similar to the one in the image: -![](Screenshot-2026-03-27-at-9.38.48-AM-744x1024.png) +![](Screenshot-2026-03-27-at-9.38.48-AM-744x1024.jpg) ## *Application structure* @@ -417,7 +417,7 @@ Simply run the application and access the endpoint provided at 'http://localhost curl --location 'http://localhost:8080/airbnb/search?query=Istambun&minNumberReviews=50' ``` -![](Screenshot-2026-03-27-at-9.39.25-AM-1024x668.png) +![](Screenshot-2026-03-27-at-9.39.25-AM-1024x668.jpg) ## Conclusion diff --git a/content/posts/2026/04/09/introducing-boxlings-an-interactive-teacher-for-boxlang-and-tdd-bdd/boxlings-intro-77fe84fb.png b/content/posts/2026/04/09/introducing-boxlings-an-interactive-teacher-for-boxlang-and-tdd-bdd/boxlings-intro-77fe84fb.png new file mode 100644 index 000000000..92eb993d9 Binary files /dev/null and b/content/posts/2026/04/09/introducing-boxlings-an-interactive-teacher-for-boxlang-and-tdd-bdd/boxlings-intro-77fe84fb.png differ diff --git a/content/posts/2026/04/09/introducing-boxlings-an-interactive-teacher-for-boxlang-and-tdd-bdd/index.md b/content/posts/2026/04/09/introducing-boxlings-an-interactive-teacher-for-boxlang-and-tdd-bdd/index.md index 234ed3037..72bdc4065 100644 --- a/content/posts/2026/04/09/introducing-boxlings-an-interactive-teacher-for-boxlang-and-tdd-bdd/index.md +++ b/content/posts/2026/04/09/introducing-boxlings-an-interactive-teacher-for-boxlang-and-tdd-bdd/index.md @@ -20,7 +20,7 @@ Oh, and the whole thing is written in BoxLang itself. 🥊 Dogfooding at its fin ## What Is BoxLings? -![](https://www.ortussolutions.com/__media/contentbox:2026/boxlang/boxlings-intro.png) +![](boxlings-intro-77fe84fb.png) BoxLings gives you **129 progressive exercises across 28 topics** — from the basics of variables and functions all the way to async programming, Java interop, destructuring, and CLI app development. diff --git a/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/2462ae08-9dc9-40b6-ae49-d9123294cdae-8b063006.jpg b/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/2462ae08-9dc9-40b6-ae49-d9123294cdae-8b063006.jpg new file mode 100644 index 000000000..670dd0f58 Binary files /dev/null and b/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/2462ae08-9dc9-40b6-ae49-d9123294cdae-8b063006.jpg differ diff --git a/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/2c957ea8-2c6b-4caa-86f8-5adeb9e8bedc-619d4e1c.jpg b/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/2c957ea8-2c6b-4caa-86f8-5adeb9e8bedc-619d4e1c.jpg new file mode 100644 index 000000000..60d55415c Binary files /dev/null and b/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/2c957ea8-2c6b-4caa-86f8-5adeb9e8bedc-619d4e1c.jpg differ diff --git a/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/3d2ee606-59e5-4287-af6f-78d04ffbcef1-cde1e925.jpg b/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/3d2ee606-59e5-4287-af6f-78d04ffbcef1-cde1e925.jpg new file mode 100644 index 000000000..0baff323a Binary files /dev/null and b/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/3d2ee606-59e5-4287-af6f-78d04ffbcef1-cde1e925.jpg differ diff --git a/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/5abe0556-690e-4e39-827b-a6090a64dc32-4ecff4c0.jpg b/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/5abe0556-690e-4e39-827b-a6090a64dc32-4ecff4c0.jpg new file mode 100644 index 000000000..53dc2c371 Binary files /dev/null and b/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/5abe0556-690e-4e39-827b-a6090a64dc32-4ecff4c0.jpg differ diff --git a/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/index.md b/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/index.md index 03ee8c8f7..26d346a7a 100644 --- a/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/index.md +++ b/content/posts/2026/04/10/aws-nitro-and-cpu-graviton-meets-unikernels/index.md @@ -23,7 +23,7 @@ aliases: ## AWS Nitro and CPU Graviton Meets Unikernels: Java and Quarkus on ARM64 AWS Graviton with Nanos Unikernel -![image](https://github.com/user-attachments/assets/2c957ea8-2c6b-4caa-86f8-5adeb9e8bedc) +![image](2c957ea8-2c6b-4caa-86f8-5adeb9e8bedc-619d4e1c.jpg) ## Java and Jakarta EE Truly Meet Unikernels @@ -103,13 +103,13 @@ This demonstrates that Nanos unikernels are **hypervisor-agnostic** and cloud-in ## Architectural Diagram of the PoC -![image](https://github.com/user-attachments/assets/3d2ee606-59e5-4287-af6f-78d04ffbcef1) +![image](3d2ee606-59e5-4287-af6f-78d04ffbcef1-cde1e925.jpg) The application runs as a single unikernel image directly on top of the AWS Nitro hypervisor, without a guest operating system, container runtime, or Kubernetes node. ## Containers vs Unikernels: A Stack Comparison -![image](https://github.com/user-attachments/assets/2462ae08-9dc9-40b6-ae49-d9123294cdae) +![image](2462ae08-9dc9-40b6-ae49-d9123294cdae-8b063006.jpg) ### Container Stack @@ -131,7 +131,7 @@ By removing unnecessary layers, unikernels reduce boot time, memory footprint, a ## Quarkus, Semeru, and Nanos on AWS Nitro Graviton -![image](https://github.com/user-attachments/assets/5abe0556-690e-4e39-827b-a6090a64dc32) +![image](5abe0556-690e-4e39-827b-a6090a64dc32-4ecff4c0.jpg) Quarkus is particularly well suited for this model thanks to its fast startup and low memory usage, while IBM Semeru provides a production-grade OpenJDK runtime. Combined with Nanos, the result is a highly efficient Java unikernel. diff --git a/content/posts/2026/04/14/how-i-automated-weekly-twitter-x-posts-with-java-jbang-and-github-actions/index.md b/content/posts/2026/04/14/how-i-automated-weekly-twitter-x-posts-with-java-jbang-and-github-actions/index.md index e536606c0..92aba3f21 100644 --- a/content/posts/2026/04/14/how-i-automated-weekly-twitter-x-posts-with-java-jbang-and-github-actions/index.md +++ b/content/posts/2026/04/14/how-i-automated-weekly-twitter-x-posts-with-java-jbang-and-github-actions/index.md @@ -5,7 +5,7 @@ lastmod: "2026-04-15T06:12:54+00:00" description: "Every Monday at 10 AM Eastern, @javaevolved now tweets a modern Java pattern — automatically. No manual steps, no third-party services, no cron servers." authors: - "bruno-borges" -image: "social-post-banner.png" +image: "social-post-banner.jpg" categories: - "Foojay" - "Java" diff --git a/content/posts/2026/04/14/how-i-automated-weekly-twitter-x-posts-with-java-jbang-and-github-actions/social-post-banner.jpg b/content/posts/2026/04/14/how-i-automated-weekly-twitter-x-posts-with-java-jbang-and-github-actions/social-post-banner.jpg new file mode 100644 index 000000000..314dabdfd Binary files /dev/null and b/content/posts/2026/04/14/how-i-automated-weekly-twitter-x-posts-with-java-jbang-and-github-actions/social-post-banner.jpg differ diff --git a/content/posts/2026/04/14/how-i-automated-weekly-twitter-x-posts-with-java-jbang-and-github-actions/social-post-banner.png b/content/posts/2026/04/14/how-i-automated-weekly-twitter-x-posts-with-java-jbang-and-github-actions/social-post-banner.png deleted file mode 100644 index 1f346529d..000000000 Binary files a/content/posts/2026/04/14/how-i-automated-weekly-twitter-x-posts-with-java-jbang-and-github-actions/social-post-banner.png and /dev/null differ diff --git a/content/posts/2026/04/20/spring-ai-amazon-bedrock-sdk-guide/index.md b/content/posts/2026/04/20/spring-ai-amazon-bedrock-sdk-guide/index.md index 137dc2c6f..ae91d39ff 100644 --- a/content/posts/2026/04/20/spring-ai-amazon-bedrock-sdk-guide/index.md +++ b/content/posts/2026/04/20/spring-ai-amazon-bedrock-sdk-guide/index.md @@ -5,7 +5,7 @@ lastmod: "2026-04-20T13:44:55+00:00" description: "Learn how to use Spring AI SDK with the Amazon Bedrock AgentCore to build scalable AI-powered applications." authors: - "mahendra1413" -image: "springaiagentcore.png" +image: "springaiagentcore.jpg" categories: - "AI" - "GenAI" diff --git a/content/posts/2026/04/20/spring-ai-amazon-bedrock-sdk-guide/springaiagentcore.jpg b/content/posts/2026/04/20/spring-ai-amazon-bedrock-sdk-guide/springaiagentcore.jpg new file mode 100644 index 000000000..ee78f2061 Binary files /dev/null and b/content/posts/2026/04/20/spring-ai-amazon-bedrock-sdk-guide/springaiagentcore.jpg differ diff --git a/content/posts/2026/04/20/spring-ai-amazon-bedrock-sdk-guide/springaiagentcore.png b/content/posts/2026/04/20/spring-ai-amazon-bedrock-sdk-guide/springaiagentcore.png deleted file mode 100644 index 342190854..000000000 Binary files a/content/posts/2026/04/20/spring-ai-amazon-bedrock-sdk-guide/springaiagentcore.png and /dev/null differ diff --git a/content/posts/2026/04/21/distributed-cache-invalidation-patterns/Screenshot-2026-04-10-at-1.03.56-PM.jpg b/content/posts/2026/04/21/distributed-cache-invalidation-patterns/Screenshot-2026-04-10-at-1.03.56-PM.jpg new file mode 100644 index 000000000..898714e94 Binary files /dev/null and b/content/posts/2026/04/21/distributed-cache-invalidation-patterns/Screenshot-2026-04-10-at-1.03.56-PM.jpg differ diff --git a/content/posts/2026/04/21/distributed-cache-invalidation-patterns/Screenshot-2026-04-10-at-1.03.56-PM.png b/content/posts/2026/04/21/distributed-cache-invalidation-patterns/Screenshot-2026-04-10-at-1.03.56-PM.png deleted file mode 100644 index 8ff2dfdc9..000000000 Binary files a/content/posts/2026/04/21/distributed-cache-invalidation-patterns/Screenshot-2026-04-10-at-1.03.56-PM.png and /dev/null differ diff --git a/content/posts/2026/04/21/distributed-cache-invalidation-patterns/index.md b/content/posts/2026/04/21/distributed-cache-invalidation-patterns/index.md index 04f32ffc9..21edc1fb2 100644 --- a/content/posts/2026/04/21/distributed-cache-invalidation-patterns/index.md +++ b/content/posts/2026/04/21/distributed-cache-invalidation-patterns/index.md @@ -5,7 +5,7 @@ lastmod: "2026-04-21T13:52:05+00:00" description: "Caching is one of the most powerful tools developers have at their disposal for optimizing application performance. Caching systems can significantly reduce latency and reduce the load on databases or external systems by storing frequently accessed data as close as possible to the application layer. The result? Improved responsiveness and overall system usability." authors: - "matteo-rossi" -image: "Screenshot-2026-04-10-at-1.03.56-PM.png" +image: "Screenshot-2026-04-10-at-1.03.56-PM.jpg" categories: - "Databases" - "Java" diff --git a/content/posts/2026/04/27/dockerizing-a-java-26-project-with-docker-init/asgard-init-57a9971e.jpg b/content/posts/2026/04/27/dockerizing-a-java-26-project-with-docker-init/asgard-init-57a9971e.jpg new file mode 100644 index 000000000..580e168fe Binary files /dev/null and b/content/posts/2026/04/27/dockerizing-a-java-26-project-with-docker-init/asgard-init-57a9971e.jpg differ diff --git a/content/posts/2026/04/27/dockerizing-a-java-26-project-with-docker-init/index.md b/content/posts/2026/04/27/dockerizing-a-java-26-project-with-docker-init/index.md index b27e063fd..ba9c8a36a 100644 --- a/content/posts/2026/04/27/dockerizing-a-java-26-project-with-docker-init/index.md +++ b/content/posts/2026/04/27/dockerizing-a-java-26-project-with-docker-init/index.md @@ -30,7 +30,7 @@ Docker Init was introduced in Docker Desktop 4.27, before LLMs became the defaul What makes it valuable is that it's deterministic—not a probabilistic guess. It produces the same correct output every time, following Docker's own best practices. -![Docker Commandos setting up the command center](https://dockersecurity.io/commandos-asgard/asgard-init.png) +![Docker Commandos setting up the command center](asgard-init-57a9971e.jpg) ## Technical Requirements diff --git a/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/AgentCoreMemory-1024x441.jpg b/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/AgentCoreMemory-1024x441.jpg new file mode 100644 index 000000000..47cd8bc4e Binary files /dev/null and b/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/AgentCoreMemory-1024x441.jpg differ diff --git a/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/AgentCoreMemory-1024x441.png b/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/AgentCoreMemory-1024x441.png deleted file mode 100644 index 9f087b28a..000000000 Binary files a/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/AgentCoreMemory-1024x441.png and /dev/null differ diff --git a/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/SpringAISDK.jpg b/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/SpringAISDK.jpg new file mode 100644 index 000000000..fa798711e Binary files /dev/null and b/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/SpringAISDK.jpg differ diff --git a/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/SpringAISDK.png b/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/SpringAISDK.png deleted file mode 100644 index 6f4daa5b6..000000000 Binary files a/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/SpringAISDK.png and /dev/null differ diff --git a/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/ac_overviewchart_04_07-7f591d25.png b/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/ac_overviewchart_04_07-7f591d25.png new file mode 100644 index 000000000..d5c68c5c7 Binary files /dev/null and b/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/ac_overviewchart_04_07-7f591d25.png differ diff --git a/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/index.md b/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/index.md index 254f90316..be629ca71 100644 --- a/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/index.md +++ b/content/posts/2026/04/27/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/index.md @@ -5,7 +5,7 @@ lastmod: "2026-04-27T15:56:38+00:00" description: "Explore how to integrate AgentCore Memory in the Spring AI SDK with Amazon Bedrock. Learn how to add short-term to AI agents for improved context awareness, conversation continuity, and smarter responses in real-world applications." authors: - "mahendra1413" -image: "https://a.b.cdn.console.awsstatic.com/a/v1/ACHOUHHJ3XZF7J5AYP2XIR2NCZIPH56WAM33AFJA44HJSRMAO4DA/assets/images/Overview/ac_overviewchart_04_07.png" +image: "ac_overviewchart_04_07-7f591d25.png" categories: - "AI" - "GenAI" @@ -21,10 +21,10 @@ frozen: false *Generated using Notebook LLM for my previous [article](https://foojay.io/today/spring-ai-amazon-bedrock-sdk-guide/)* In this article, we explore one of the AgentCore capabilities i.e., ***memory*** -![](https://a.b.cdn.console.awsstatic.com/a/v1/ACHOUHHJ3XZF7J5AYP2XIR2NCZIPH56WAM33AFJA44HJSRMAO4DA/assets/images/Overview/ac_overviewchart_04_07.png) ***Source: Amazon*** +![](ac_overviewchart_04_07-7f591d25.png) ***Source: Amazon*** To begin, enable **AgentCore memory** for the agent you built earlier. -![SpringAI SDK](SpringAISDK.png) +![SpringAI SDK](SpringAISDK.jpg) ### Step 1: Add the Ai model and AgentCore memory dependencies @@ -42,7 +42,7 @@ To begin, enable **AgentCore memory** for the agent you built earlier. ### Step 2: Create Short/Long Term in AWS Management Console *Navigate to **Amazon Bedrock AgentCore \> Memory** to create short/long-term memories.* -![AgentCore Memory](AgentCoreMemory-1024x441.png) AgentCore Memory +![AgentCore Memory](AgentCoreMemory-1024x441.jpg) AgentCore Memory ### Step 3: Add the following memory-related properties. diff --git a/content/posts/2026/04/29/boxlang-ai-deep-dive-part-5-of-7-one-api-17-providers-the-provider-architecture-deep-dive/Captura-de-pantalla-2026-04-29-125804.jpg b/content/posts/2026/04/29/boxlang-ai-deep-dive-part-5-of-7-one-api-17-providers-the-provider-architecture-deep-dive/Captura-de-pantalla-2026-04-29-125804.jpg new file mode 100644 index 000000000..5adcedfc6 Binary files /dev/null and b/content/posts/2026/04/29/boxlang-ai-deep-dive-part-5-of-7-one-api-17-providers-the-provider-architecture-deep-dive/Captura-de-pantalla-2026-04-29-125804.jpg differ diff --git a/content/posts/2026/04/29/boxlang-ai-deep-dive-part-5-of-7-one-api-17-providers-the-provider-architecture-deep-dive/Captura-de-pantalla-2026-04-29-125804.png b/content/posts/2026/04/29/boxlang-ai-deep-dive-part-5-of-7-one-api-17-providers-the-provider-architecture-deep-dive/Captura-de-pantalla-2026-04-29-125804.png deleted file mode 100644 index e3648f6bb..000000000 Binary files a/content/posts/2026/04/29/boxlang-ai-deep-dive-part-5-of-7-one-api-17-providers-the-provider-architecture-deep-dive/Captura-de-pantalla-2026-04-29-125804.png and /dev/null differ diff --git a/content/posts/2026/04/29/boxlang-ai-deep-dive-part-5-of-7-one-api-17-providers-the-provider-architecture-deep-dive/index.md b/content/posts/2026/04/29/boxlang-ai-deep-dive-part-5-of-7-one-api-17-providers-the-provider-architecture-deep-dive/index.md index d8b2ecabd..214741a1a 100644 --- a/content/posts/2026/04/29/boxlang-ai-deep-dive-part-5-of-7-one-api-17-providers-the-provider-architecture-deep-dive/index.md +++ b/content/posts/2026/04/29/boxlang-ai-deep-dive-part-5-of-7-one-api-17-providers-the-provider-architecture-deep-dive/index.md @@ -5,7 +5,7 @@ lastmod: "2026-05-05T15:23:49+00:00" description: "BoxLang AI 3.0 Series · Part 5 of 7 Vendor lock-in is the silent killer of AI projects. You pick OpenAI, build everything against the OpenAI API, and then…" authors: - "cristobal-escobar" -image: "Captura-de-pantalla-2026-04-29-125804.png" +image: "Captura-de-pantalla-2026-04-29-125804.jpg" categories: - "AI" - "Developer Tools" diff --git a/content/posts/2026/04/30/javafx-links-of-april-2026/index.md b/content/posts/2026/04/30/javafx-links-of-april-2026/index.md index 18d992f26..afdfcaecf 100644 --- a/content/posts/2026/04/30/javafx-links-of-april-2026/index.md +++ b/content/posts/2026/04/30/javafx-links-of-april-2026/index.md @@ -5,7 +5,7 @@ description: "Here are the JavaFX LinksOfTheMonth of April 2026. You can find th canonical: "https://webtechie.be/post/2026-04-24-javafx-links-of-april-2026/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2026/04/30/javafx-links-of-april-2026/jfxcentral.jpg b/content/posts/2026/04/30/javafx-links-of-april-2026/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2026/04/30/javafx-links-of-april-2026/jfxcentral.jpg differ diff --git a/content/posts/2026/04/30/javafx-links-of-april-2026/jfxcentral.png b/content/posts/2026/04/30/javafx-links-of-april-2026/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2026/04/30/javafx-links-of-april-2026/jfxcentral.png and /dev/null differ diff --git a/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/AgentcoreBrowser-2.jpg b/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/AgentcoreBrowser-2.jpg new file mode 100644 index 000000000..95400502f Binary files /dev/null and b/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/AgentcoreBrowser-2.jpg differ diff --git a/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/AgentcoreBrowser-2.png b/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/AgentcoreBrowser-2.png deleted file mode 100644 index 81087d770..000000000 Binary files a/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/AgentcoreBrowser-2.png and /dev/null differ diff --git a/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/AgentcoreBrowser.jpg b/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/AgentcoreBrowser.jpg new file mode 100644 index 000000000..95400502f Binary files /dev/null and b/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/AgentcoreBrowser.jpg differ diff --git a/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/AgentcoreBrowser.png b/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/AgentcoreBrowser.png deleted file mode 100644 index 81087d770..000000000 Binary files a/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/AgentcoreBrowser.png and /dev/null differ diff --git a/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/index.md b/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/index.md index 5bec4a597..761f21629 100644 --- a/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/index.md +++ b/content/posts/2026/05/10/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/index.md @@ -5,7 +5,7 @@ lastmod: "2026-05-18T05:55:12+00:00" description: "Explore how to use built-in tools in Spring AI SDK with Amazon Bedrock AgentCore, including Browser and Code Interpreter capabilities. Learn how AI agents can browse web content, execute code, automate reasoning tasks, and build intelligent workflows using Spring AI and Amazon Bedrock AgentCore." authors: - "mahendra1413" -image: "AgentcoreBrowser-2.png" +image: "AgentcoreBrowser-2.jpg" categories: - "AI" - "IntelliJ IDEA" @@ -18,7 +18,7 @@ frozen: false In [Part 1](https://foojay.io/today/spring-ai-amazon-bedrock-sdk-guide/) and [Part 2](https://foojay.io/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/), we explored the Spring AI SDK and Amazon Bedrock AgentCore features, including the agentcore runtime starter and integration of agentcore memory. In this article, we will explore the integration of AgentCore built-in tools, including the Browser and Code Interpreter features. > **Repository containing the companion code for the tutorial. [Go to GitHub](https://github.com/bsmahi/simple-spring-boot-agent).** -> ![AgentCore Built-In Tool Browser](AgentcoreBrowser.png) Built-In Tool Browser +> ![AgentCore Built-In Tool Browser](AgentcoreBrowser.jpg) Built-In Tool Browser *The use case I am trying to build here is for the given URL; it navigates the entire website and retrieves the content and gives key points and the summary of the page using **the AgentCore Browser** tool.* diff --git a/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/dialog-translucent-8c62c8fe.png b/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/dialog-translucent-8c62c8fe.png new file mode 100644 index 000000000..adc5b94f4 Binary files /dev/null and b/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/dialog-translucent-8c62c8fe.png differ diff --git a/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/index.md b/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/index.md index 9b54fc337..39533583e 100644 --- a/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/index.md +++ b/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![Header Image](https://www.codenameone.com/blog/liquid-glass-material-3-modern-native-themes.jpg) +![Header Image](liquid-glass-material-3-modern-native-th-99b7f8fd.jpg) It has been one of those weeks where the diff is bigger than the headline. The headline is short — Codename One now ships modern native themes: an iOS "liquid glass" look and an Android Material 3 look, bundled into the iOS and Android ports, on by default in the Playground, and selectable from a brand new menu in the simulator. The diff behind that headline is several thousand lines across the platform ports, the simulator, the GUI plumbing, and a small army of screenshot tests. @@ -43,7 +43,7 @@ The shipping CSS sources sit in the repo at [native-themes/ios-modern/theme.css] ### iOS Modern -![iOS Modern theme — light and dark](https://www.codenameone.com/blog/liquid-glass-material-3-modern-native-themes/showcase-ios.png) +![iOS Modern theme — light and dark](showcase-ios-3e46a508.png) This is the `ShowcaseTheme` capture from the new screenshot suite, run on iOS in light and dark. Same Form, same components, swap `Display.setDarkMode(...)` and re-resolve. The form is built like this: @@ -82,19 +82,19 @@ The full screen source is [DarkLightShowcaseThemeScreenshotTest.java](https://gi ### Android Material 3 -![Android Material 3 theme — light and dark](https://www.codenameone.com/blog/liquid-glass-material-3-modern-native-themes/showcase-android.png) +![Android Material 3 theme — light and dark](showcase-android-1fe51f30.jpg) Same `ShowcaseTheme` source on Android. The Material 3 baseline palette gives `Default` the primary container color and `Raised` the elevated-surface tone, with the dark variant flipping the relationship correctly via the dark color-role mapping. Padding and font sizing follow Material density, which you can see in how compact the same Form lays out compared to iOS. ### Translucent surfaces -![Dialog over a textured backdrop — light and dark](https://www.codenameone.com/blog/liquid-glass-material-3-modern-native-themes/dialog-translucent.png) +![Dialog over a textured backdrop — light and dark](dialog-translucent-8c62c8fe.png) This is the `DialogTheme` capture against the screenshot suite's textured diagonal-stripe backdrop. The backdrop is intentional — it lets reviewers see whether anything that is *supposed* to be translucent actually is. The iOS Modern `Dialog` uses an `rgba` surface fill (0.78 alpha in light, 0.95 in dark — dark needs more opacity because bright stripes bleed through) and its `DialogBody`, `DialogTitle`, `ContentPane`, `CommandArea` sub-UIIDs are transparent so the rounded corners read cleanly. The same trick is applied to `TabsContainer` and the iOS `MultiButton`. ### Runtime palette overrides -![Magenta palette layered over iOS Modern — light and dark](https://www.codenameone.com/blog/liquid-glass-material-3-modern-native-themes/palette-override.png) +![Magenta palette layered over iOS Modern — light and dark](palette-override-bbf26dd1.png) The native theme is meant to be a starting point — you can layer your own palette on top without forking the theme. Above is the `PaletteOverrideTheme` capture: the base is iOS Modern, but the test layers a magenta palette on top at runtime via `UIManager.addThemeProps(...)`. `RaisedButton`, `FlatButton`, the disabled tone, and the body-copy span all pick up the override in both light and dark — the override seam works at the resource-bundle layer, exactly the same mechanism a user theme uses to override the native theme on a real app. @@ -119,7 +119,7 @@ The HTML5 port has the runtime support for the modern themes but does not bundle ## Sticky headers The other piece of look-and-feel that we want to highlight is `StickyHeaderContainer`, which finally has a proper home in the framework. It is the iOS-contacts-list / sectioned-material-list component: scroll past a section boundary and the previous header is replaced by the next one. New this week, the swap is animated. A directional slide moves the outgoing header up on a forward scroll and down on a reverse scroll, or you can pick a cross-fade. -![Sticky header sectioned scroll](https://www.codenameone.com/blog/liquid-glass-material-3-modern-native-themes/sticky-header-slide.gif) +![Sticky header sectioned scroll](sticky-header-slide-69f04c57.gif) Above is a six-frame sweep from the screenshot test — the user scrolls through sections A, B, C, D, E and the pinned header recolors to whichever section is currently active at the top of the viewport. @@ -147,10 +147,10 @@ form.add(BorderLayout.CENTER, sticky); Every screenshot in this post is captured by a test that runs the app on a real iOS device, an Android emulator, and headless Chrome, then diffs each capture against a stored golden image. The diff *is* the test — if the rendered pixels drift, the run fails. For animations the test grabs a series of frames over a fixed-duration transition, then composites them into a single index image. That is how the dual-appearance shots end up as one side-by-side picture per test: -![Dialog over a textured backdrop — light and dark](https://www.codenameone.com/blog/liquid-glass-material-3-modern-native-themes/dialog-translucent.png) +![Dialog over a textured backdrop — light and dark](dialog-translucent-8c62c8fe.png) …and how the sticky-header animation ends up as a six-frame strip stitched into a GIF: -![Sticky header sectioned scroll](https://www.codenameone.com/blog/liquid-glass-material-3-modern-native-themes/sticky-header-slide.gif) +![Sticky header sectioned scroll](sticky-header-slide-69f04c57.gif) If you want to read the source, the suite lives at [scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/](https://github.com/codenameone/CodenameOne/tree/master/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests). diff --git a/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/liquid-glass-material-3-modern-native-th-99b7f8fd.jpg b/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/liquid-glass-material-3-modern-native-th-99b7f8fd.jpg new file mode 100644 index 000000000..440b96b69 Binary files /dev/null and b/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/liquid-glass-material-3-modern-native-th-99b7f8fd.jpg differ diff --git a/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/palette-override-bbf26dd1.png b/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/palette-override-bbf26dd1.png new file mode 100644 index 000000000..22b1dd3f1 Binary files /dev/null and b/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/palette-override-bbf26dd1.png differ diff --git a/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/showcase-android-1fe51f30.jpg b/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/showcase-android-1fe51f30.jpg new file mode 100644 index 000000000..c99fc783e Binary files /dev/null and b/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/showcase-android-1fe51f30.jpg differ diff --git a/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/showcase-ios-3e46a508.png b/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/showcase-ios-3e46a508.png new file mode 100644 index 000000000..1ede0a32a Binary files /dev/null and b/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/showcase-ios-3e46a508.png differ diff --git a/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/sticky-header-slide-69f04c57.gif b/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/sticky-header-slide-69f04c57.gif new file mode 100644 index 000000000..3113ac1ad Binary files /dev/null and b/content/posts/2026/05/11/liquid-glass-material-3-and-a-lot-of-plumbing/sticky-header-slide-69f04c57.gif differ diff --git a/content/posts/2026/05/13/testing-lottie4j-javafx-animations-in-github-actions-with-javafx-26-headless/index.md b/content/posts/2026/05/13/testing-lottie4j-javafx-animations-in-github-actions-with-javafx-26-headless/index.md index 3c5b03b9b..beb6cee36 100644 --- a/content/posts/2026/05/13/testing-lottie4j-javafx-animations-in-github-actions-with-javafx-26-headless/index.md +++ b/content/posts/2026/05/13/testing-lottie4j-javafx-animations-in-github-actions-with-javafx-26-headless/index.md @@ -25,7 +25,7 @@ When I released [Lottie4J 1.1.0](https://lottie4j.com/releases/#2026-03-10-110), The core challenge with Lottie4J is correctness. The Lottie format is complex with a lot of nested data, and my JavaFX renderer has to produce output that matches what a JavaScript player would show. Pixel-perfect is too ambitious, but "is this a close enough match" is a reasonable bar. During development, I use a separate application within the Lottie4J project: [LottieFileDebugViewer](https://github.com/lottie4j/lottie4j/blob/main/fxfileviewer/src/main/java/com/lottie4j/fxfileviewer/LottieFileDebugViewer.java). This is a JavaFX application that loads a Lottie file and renders it both with the JavaFX player, and inside a Webview with the official Lottie player. This makes it easy to compare the result and debug differences by diving into the data structure and different layers. -![](manual-comparison-1024x342.png) +![](manual-comparison-1024x342.jpg) Based on this debug viewer, I created a unit-test approach with two steps: diff --git a/content/posts/2026/05/13/testing-lottie4j-javafx-animations-in-github-actions-with-javafx-26-headless/manual-comparison-1024x342.jpg b/content/posts/2026/05/13/testing-lottie4j-javafx-animations-in-github-actions-with-javafx-26-headless/manual-comparison-1024x342.jpg new file mode 100644 index 000000000..5f2371f25 Binary files /dev/null and b/content/posts/2026/05/13/testing-lottie4j-javafx-animations-in-github-actions-with-javafx-26-headless/manual-comparison-1024x342.jpg differ diff --git a/content/posts/2026/05/13/testing-lottie4j-javafx-animations-in-github-actions-with-javafx-26-headless/manual-comparison-1024x342.png b/content/posts/2026/05/13/testing-lottie4j-javafx-animations-in-github-actions-with-javafx-26-headless/manual-comparison-1024x342.png deleted file mode 100644 index da8bff5b2..000000000 Binary files a/content/posts/2026/05/13/testing-lottie4j-javafx-animations-in-github-actions-with-javafx-26-headless/manual-comparison-1024x342.png and /dev/null differ diff --git a/content/posts/2026/05/14/boxlang-ai-series-complete-guide-to-building-ai-agents/Guide-to-Building-AI-Agents-2-700x365.jpg b/content/posts/2026/05/14/boxlang-ai-series-complete-guide-to-building-ai-agents/Guide-to-Building-AI-Agents-2-700x365.jpg new file mode 100644 index 000000000..f432a1302 Binary files /dev/null and b/content/posts/2026/05/14/boxlang-ai-series-complete-guide-to-building-ai-agents/Guide-to-Building-AI-Agents-2-700x365.jpg differ diff --git a/content/posts/2026/05/14/boxlang-ai-series-complete-guide-to-building-ai-agents/Guide-to-Building-AI-Agents-2-700x365.png b/content/posts/2026/05/14/boxlang-ai-series-complete-guide-to-building-ai-agents/Guide-to-Building-AI-Agents-2-700x365.png deleted file mode 100644 index d31e3b01d..000000000 Binary files a/content/posts/2026/05/14/boxlang-ai-series-complete-guide-to-building-ai-agents/Guide-to-Building-AI-Agents-2-700x365.png and /dev/null differ diff --git a/content/posts/2026/05/14/boxlang-ai-series-complete-guide-to-building-ai-agents/index.md b/content/posts/2026/05/14/boxlang-ai-series-complete-guide-to-building-ai-agents/index.md index 8d1a5b9b9..0bd2931e9 100644 --- a/content/posts/2026/05/14/boxlang-ai-series-complete-guide-to-building-ai-agents/index.md +++ b/content/posts/2026/05/14/boxlang-ai-series-complete-guide-to-building-ai-agents/index.md @@ -20,7 +20,7 @@ related_posts: frozen: false --- -![](Guide-to-Building-AI-Agents-2-700x365.png) +![](Guide-to-Building-AI-Agents-2-700x365.jpg) The world of AI development is moving fast, but building real, production-ready AI agents doesn't have to be complex. diff --git a/content/posts/2026/05/15/dont-panic-the-thymeleaf-template-injection-that-only-hurts-if-you-let-it-cve-2026-40478/Screenshot-2026-05-18-at-07.51.36.jpg b/content/posts/2026/05/15/dont-panic-the-thymeleaf-template-injection-that-only-hurts-if-you-let-it-cve-2026-40478/Screenshot-2026-05-18-at-07.51.36.jpg new file mode 100644 index 000000000..5c8ca53e5 Binary files /dev/null and b/content/posts/2026/05/15/dont-panic-the-thymeleaf-template-injection-that-only-hurts-if-you-let-it-cve-2026-40478/Screenshot-2026-05-18-at-07.51.36.jpg differ diff --git a/content/posts/2026/05/15/dont-panic-the-thymeleaf-template-injection-that-only-hurts-if-you-let-it-cve-2026-40478/Screenshot-2026-05-18-at-07.51.36.png b/content/posts/2026/05/15/dont-panic-the-thymeleaf-template-injection-that-only-hurts-if-you-let-it-cve-2026-40478/Screenshot-2026-05-18-at-07.51.36.png deleted file mode 100644 index a86f346f7..000000000 Binary files a/content/posts/2026/05/15/dont-panic-the-thymeleaf-template-injection-that-only-hurts-if-you-let-it-cve-2026-40478/Screenshot-2026-05-18-at-07.51.36.png and /dev/null differ diff --git a/content/posts/2026/05/15/dont-panic-the-thymeleaf-template-injection-that-only-hurts-if-you-let-it-cve-2026-40478/index.md b/content/posts/2026/05/15/dont-panic-the-thymeleaf-template-injection-that-only-hurts-if-you-let-it-cve-2026-40478/index.md index d17304130..40732ab0f 100644 --- a/content/posts/2026/05/15/dont-panic-the-thymeleaf-template-injection-that-only-hurts-if-you-let-it-cve-2026-40478/index.md +++ b/content/posts/2026/05/15/dont-panic-the-thymeleaf-template-injection-that-only-hurts-if-you-let-it-cve-2026-40478/index.md @@ -6,7 +6,7 @@ description: "The Thymeleaf vulnerability with a CVSS score of 9.1 grabs your at canonical: "https://snyk.io/blog/thymeleaf-injection/" authors: - "bmvermeer" -image: "Screenshot-2026-05-18-at-07.51.36.png" +image: "Screenshot-2026-05-18-at-07.51.36.jpg" categories: - "Security" related_posts: diff --git a/content/posts/2026/05/19/from-zero-really-zero-to-opentelemetry/dash0-foojay-2-1024x545.jpg b/content/posts/2026/05/19/from-zero-really-zero-to-opentelemetry/dash0-foojay-2-1024x545.jpg new file mode 100644 index 000000000..17b69fa6b Binary files /dev/null and b/content/posts/2026/05/19/from-zero-really-zero-to-opentelemetry/dash0-foojay-2-1024x545.jpg differ diff --git a/content/posts/2026/05/19/from-zero-really-zero-to-opentelemetry/dash0-foojay-2-1024x545.png b/content/posts/2026/05/19/from-zero-really-zero-to-opentelemetry/dash0-foojay-2-1024x545.png deleted file mode 100644 index a800d755f..000000000 Binary files a/content/posts/2026/05/19/from-zero-really-zero-to-opentelemetry/dash0-foojay-2-1024x545.png and /dev/null differ diff --git a/content/posts/2026/05/19/from-zero-really-zero-to-opentelemetry/index.md b/content/posts/2026/05/19/from-zero-really-zero-to-opentelemetry/index.md index 8e945e9d2..b8e66fe38 100644 --- a/content/posts/2026/05/19/from-zero-really-zero-to-opentelemetry/index.md +++ b/content/posts/2026/05/19/from-zero-really-zero-to-opentelemetry/index.md @@ -17,7 +17,7 @@ frozen: false Here's a super awesome prompt (e.g., for Claude Code) that you can use with , the free collection of skills for AI coding agents to make applications observable with OpenTelemetry, such as with [Dash0](https://www.dash0.com/). And the end result is this, a view into the traces of your application (without anything at all at the start of the process). -![](dash0-foojay-2-1024x545.png) +![](dash0-foojay-2-1024x545.jpg) ## **The Super Awesome Prompt** @@ -65,7 +65,7 @@ for i in {1..50}; do curl -s localhost:8080/hello; curl -s localhost:8080/work; ``` Then in Dash0 go to the **Trace Explorer** — filter by `service.name = dash0-java-demo`, you should see `GET /hello` and `GET /work` spans within 10–30 seconds. -![](dash0-foojay-2-1024x545.png) +![](dash0-foojay-2-1024x545.jpg) Next, go to **Integrations → Java → Install all dashboards** if you haven't yet, then open **JVM Metrics** for the heap/GC/thread charts. diff --git a/content/posts/2026/05/21/metal-and-skins/index.md b/content/posts/2026/05/21/metal-and-skins/index.md index fcf56e798..97acfedc2 100644 --- a/content/posts/2026/05/21/metal-and-skins/index.md +++ b/content/posts/2026/05/21/metal-and-skins/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![Metal and Skins](https://www.codenameone.com/blog/metal-and-skins.jpg) +![Metal and Skins](metal-and-skins.jpg) This post has a lot to cover. Before we get to any of it I want to take on the uncomfortable subject first: quality. Two incidents from the past two weeks deserve a public explanation, one was a bug that fits into our normal iteration loop and one was a serious mistake on my part. Both deserve the kind of explanation I would want if I were on the other side of the import. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -85,17 +85,17 @@ Everything else stays the same. The Java surface is unchanged, your existing cod The most user-visible improvement from the Metal port is text. Here is the `ShowcaseTheme` capture from the Metal screenshot suite: -{{< img src="https://www.codenameone.com/blog/metal-and-skins/metal-showcase-light.png" class="is-resized" alt="Metal showcase, light" style="width:200px" >}} +{{< img src="metal-showcase-light-5d28716f.jpg" class="is-resized" alt="Metal showcase, light" style="width:200px" >}} -{{< img src="https://www.codenameone.com/blog/metal-and-skins/metal-showcase-dark.png" class="is-resized" alt="Metal showcase, dark" style="width:200px" >}} +{{< img src="metal-showcase-dark-a31d2e3a.jpg" class="is-resized" alt="Metal showcase, dark" style="width:200px" >}} And the `SpanLabelTheme` capture, which is the real test for body-copy rendering, multiple lines, variable widths, the kind of paragraphs that show up in real apps: -{{< img src="https://www.codenameone.com/blog/metal-and-skins/metal-spanlabel-light.png" class="is-resized" alt="Metal SpanLabel theme" style="width:200px" >}} +{{< img src="metal-spanlabel-light-6a0ad75c.jpg" class="is-resized" alt="Metal SpanLabel theme" style="width:200px" >}} The Metal `Dialog` capture is also worth showing because the translucent surface composites correctly against the textured backdrop: -{{< img src="https://www.codenameone.com/blog/metal-and-skins/metal-dialog-light.png" class="is-resized" alt="Metal Dialog over textured backdrop" style="width:200px" >}} +{{< img src="metal-dialog-light-56192190.jpg" class="is-resized" alt="Metal Dialog over textured backdrop" style="width:200px" >}} ## The end of the skin downloader @@ -119,7 +119,7 @@ The Skin Designer turns a device specification (resolution, PPI, fonts, safe-are If you only want a skin and don't care how it is built, pick a device, accept the defaults, click *Finish* , then *Download skin* . The file is ready to load via *Add* in the simulator's *Skins* menu. **Stage 1, pick a device.** The first step shows a card per device from the bundled catalog. The search box filters by name (it matches both the model and the brand) and the chips below narrow by form factor: All / Phones / Tablets / Foldables. Picking a device pulls in its resolution, PPI, screen size, default safe-area insets, and the iOS or Android system font names from the catalog, then seeds a sensible starting frame: notch, island, or hole presets are applied automatically based on the device's hardware. The catalog is large, the grid is capped to the most recent matches by default, type into the search field to find older or less-common devices. -![Skin Designer stage 1, device picker](https://www.codenameone.com/developer-guide/img/skin-designer/skin-designer-stage-1-device.png) +![Skin Designer stage 1, device picker](skin-designer-stage-1-device-84516a1d.png) **Stage 2, pick a starting source.** There are three ways to seed the skin's body image: @@ -127,21 +127,21 @@ If you only want a skin and don't care how it is built, pick a device, accept th * *Upload an image* opens an image picker. The wizard scales the image into the device's resolution, then carves the screen rect and cutouts on top. Use this when you have a marketing render of the specific device you are targeting. * *Blank rectangle* collapses the bezel and corner radius to almost nothing, drops every cutout, and turns the home indicator off. The screen fills the entire skin. Useful for desktop or web simulators where the device frame would just be visual noise. -![Skin Designer stage 2, source picker](https://www.codenameone.com/developer-guide/img/skin-designer/skin-designer-stage-2-source.png) +![Skin Designer stage 2, source picker](skin-designer-stage-2-source-caa9b78d.png) **Stage 3, the editor.** The editor is split into two panes: a live preview on the left that paints the device frame, screen tint, cutouts, and home indicator, and a sidebar on the right with three tabs. The *Shape* tab shows a preset grid (Rounded rect, Notch, Dynamic Island, Punch-hole, Corner hole, Classic home) and dimension fields for corner radius, bezel thickness, and a toggle for the bottom home indicator. iPhones from X onward and most modern Androids should leave the indicator on, classic devices with a hardware home button should turn it off. -![Skin Designer stage 3, Shape tab](https://www.codenameone.com/developer-guide/img/skin-designer/skin-designer-stage-3-editor-shape.png) +![Skin Designer stage 3, Shape tab](skin-designer-stage-3-editor-shape-0998c52c.png) The *Cutouts* tab lists every cutout currently on the skin. Tap a row to expand its width, height, and offset fields. The three add buttons at the bottom seed a sensible default of each type. *Notch* (180 x 30 viewbox px) is a physical hardware cutout drawn in the device frame above the screen rect, mirroring iPhone X / 11 / 12 / 13 hardware. *Island* (120 x 35) is a Dynamic Island, software-reserved space rendered as an opaque pill inside the screen rect, floating on top of the iOS status bar. *Hole* (28 x 28) is an Android punch-hole camera, rendered like the island. When the wizard generates the `.skin`, it automatically extends `safePortraitTop` to cover any in-screen cutouts so app content lands below the floating shape. -![Skin Designer stage 3, Cutouts tab](https://www.codenameone.com/developer-guide/img/skin-designer/skin-designer-stage-3-editor-cutouts.png) +![Skin Designer stage 3, Cutouts tab](skin-designer-stage-3-editor-cutouts-8f333de0.png) The *Info* tab is mostly read-only and shows what is about to be written into `skin.properties`: name, width, height, PPI, pixels-per-millimeter, and the user-editable safe-area insets. The wizard intentionally does *not* write `smallFontSize`, `mediumFontSize`, or `largeFontSize`, when those are absent the simulator auto-derives them from `pixelMilliRatio`, which is what you want on high-PPI screens. -![Skin Designer stage 3, Info tab](https://www.codenameone.com/developer-guide/img/skin-designer/skin-designer-stage-3-editor-info.png) +![Skin Designer stage 3, Info tab](skin-designer-stage-3-editor-info-94698fea.png) **Stage 4, finish and download.** Clicking *Finish* renders the portrait skin image at the device's actual resolution with rounded corners, transparent screen, opaque cutouts, and a home indicator if enabled. It synthesises the landscape skin by 90-degree rotation, writes the `skin_map.png` overlays that mark the screen rectangle for the simulator's screen-position detection, bundles the appropriate native theme inside the skin zip, and writes `skin.properties` with the platform metadata, safe-area, PPI, and display rect. Clicking *Download skin* hands the file to the browser's download dialog. After the file is on disk, drop it into your simulator's skins folder (or use the *Add* command in the simulator's *Skins* menu) and your new device should appear in the picker. -![Skin Designer stage 4, finish and download](https://www.codenameone.com/developer-guide/img/skin-designer/skin-designer-stage-4-done.png) +![Skin Designer stage 4, finish and download](skin-designer-stage-4-done-2b1d8fa5.png) A generated `.skin` is just a renamed zip: diff --git a/content/posts/2026/05/21/metal-and-skins/metal-dialog-light-56192190.jpg b/content/posts/2026/05/21/metal-and-skins/metal-dialog-light-56192190.jpg new file mode 100644 index 000000000..0dff89ef1 Binary files /dev/null and b/content/posts/2026/05/21/metal-and-skins/metal-dialog-light-56192190.jpg differ diff --git a/content/posts/2026/05/21/metal-and-skins/metal-showcase-dark-a31d2e3a.jpg b/content/posts/2026/05/21/metal-and-skins/metal-showcase-dark-a31d2e3a.jpg new file mode 100644 index 000000000..ced4450a6 Binary files /dev/null and b/content/posts/2026/05/21/metal-and-skins/metal-showcase-dark-a31d2e3a.jpg differ diff --git a/content/posts/2026/05/21/metal-and-skins/metal-showcase-light-5d28716f.jpg b/content/posts/2026/05/21/metal-and-skins/metal-showcase-light-5d28716f.jpg new file mode 100644 index 000000000..7c51026ab Binary files /dev/null and b/content/posts/2026/05/21/metal-and-skins/metal-showcase-light-5d28716f.jpg differ diff --git a/content/posts/2026/05/21/metal-and-skins/metal-spanlabel-light-6a0ad75c.jpg b/content/posts/2026/05/21/metal-and-skins/metal-spanlabel-light-6a0ad75c.jpg new file mode 100644 index 000000000..6e70f6f6f Binary files /dev/null and b/content/posts/2026/05/21/metal-and-skins/metal-spanlabel-light-6a0ad75c.jpg differ diff --git a/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-1-device-84516a1d.png b/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-1-device-84516a1d.png new file mode 100644 index 000000000..c8281557e Binary files /dev/null and b/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-1-device-84516a1d.png differ diff --git a/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-2-source-caa9b78d.png b/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-2-source-caa9b78d.png new file mode 100644 index 000000000..e7f6d4e26 Binary files /dev/null and b/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-2-source-caa9b78d.png differ diff --git a/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-3-editor-cutouts-8f333de0.png b/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-3-editor-cutouts-8f333de0.png new file mode 100644 index 000000000..68eca9835 Binary files /dev/null and b/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-3-editor-cutouts-8f333de0.png differ diff --git a/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-3-editor-info-94698fea.png b/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-3-editor-info-94698fea.png new file mode 100644 index 000000000..7478f64aa Binary files /dev/null and b/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-3-editor-info-94698fea.png differ diff --git a/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-3-editor-shape-0998c52c.png b/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-3-editor-shape-0998c52c.png new file mode 100644 index 000000000..d03fa64e1 Binary files /dev/null and b/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-3-editor-shape-0998c52c.png differ diff --git a/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-4-done-2b1d8fa5.png b/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-4-done-2b1d8fa5.png new file mode 100644 index 000000000..7389dfd03 Binary files /dev/null and b/content/posts/2026/05/21/metal-and-skins/skin-designer-stage-4-done-2b1d8fa5.png differ diff --git a/content/posts/2026/05/22/context-is-a-budget-eight-levers-and-three-workflow-patterns/ccreq-log-650x510.jpg b/content/posts/2026/05/22/context-is-a-budget-eight-levers-and-three-workflow-patterns/ccreq-log-650x510.jpg new file mode 100644 index 000000000..506ab53f6 Binary files /dev/null and b/content/posts/2026/05/22/context-is-a-budget-eight-levers-and-three-workflow-patterns/ccreq-log-650x510.jpg differ diff --git a/content/posts/2026/05/22/context-is-a-budget-eight-levers-and-three-workflow-patterns/ccreq-log-650x510.png b/content/posts/2026/05/22/context-is-a-budget-eight-levers-and-three-workflow-patterns/ccreq-log-650x510.png deleted file mode 100644 index 3f7cb5f02..000000000 Binary files a/content/posts/2026/05/22/context-is-a-budget-eight-levers-and-three-workflow-patterns/ccreq-log-650x510.png and /dev/null differ diff --git a/content/posts/2026/05/22/context-is-a-budget-eight-levers-and-three-workflow-patterns/index.md b/content/posts/2026/05/22/context-is-a-budget-eight-levers-and-three-workflow-patterns/index.md index ab81fff56..266b37e49 100644 --- a/content/posts/2026/05/22/context-is-a-budget-eight-levers-and-three-workflow-patterns/index.md +++ b/content/posts/2026/05/22/context-is-a-budget-eight-levers-and-three-workflow-patterns/index.md @@ -55,7 +55,7 @@ A few things to notice: In a Copilot context, you can't see token counts directly — but you can see the symptom. Open **Output → "GitHub Copilot Chat"** and watch the `ccreq` lines: each one shows the model, latency, and request type per turn. When the same question takes three times longer in chat #2 than chat #1, you've just watched your token meter the entire time. -![VS Code Output panel showing Copilot Chat ccreq lines — your free token meter](ccreq-log-650x510.png) +![VS Code Output panel showing Copilot Chat ccreq lines — your free token meter](ccreq-log-650x510.jpg) ## The Eight Levers diff --git a/content/posts/2026/05/27/skills-java-17-and-theme-accents-with-codename-one/index.md b/content/posts/2026/05/27/skills-java-17-and-theme-accents-with-codename-one/index.md index 6abf9c7e8..4d16df65c 100644 --- a/content/posts/2026/05/27/skills-java-17-and-theme-accents-with-codename-one/index.md +++ b/content/posts/2026/05/27/skills-java-17-and-theme-accents-with-codename-one/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![Skills, Java 17, And Theme Accents](https://www.codenameone.com/blog/skills-java17-and-theme-accents.jpg) +![Skills, Java 17, And Theme Accents](skills-java17-and-theme-accents.jpg) Last week was about Metal and the Skin Designer. This week the headline items are about what a brand new project looks like when you generate it: the default JDK is Java 17, and every generated project ships with an `AGENTS.md` authoring skill that lets any modern AI agent work on the project intelligently. There are also some other things worth covering: a runtime accent palette on the new native themes, three Metal follow-ups (one of which introduces a new matrix-correct translate API), the JDK 11+ String API gap closed, and iOS push permission that no longer fires at app launch. diff --git a/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/Screenshot-2026-06-03-at-09.05.15.jpg b/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/Screenshot-2026-06-03-at-09.05.15.jpg new file mode 100644 index 000000000..aa12f1f9e Binary files /dev/null and b/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/Screenshot-2026-06-03-at-09.05.15.jpg differ diff --git a/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/Screenshot-2026-06-03-at-09.05.15.png b/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/Screenshot-2026-06-03-at-09.05.15.png deleted file mode 100644 index 6f2fbfa57..000000000 Binary files a/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/Screenshot-2026-06-03-at-09.05.15.png and /dev/null differ diff --git a/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/fig1_spaghetti_state-9fe986e4.png b/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/fig1_spaghetti_state-9fe986e4.png new file mode 100644 index 000000000..7447ae427 Binary files /dev/null and b/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/fig1_spaghetti_state-9fe986e4.png differ diff --git a/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/fig2_inheritance_tax-95f7d4eb.png b/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/fig2_inheritance_tax-95f7d4eb.png new file mode 100644 index 000000000..80b943a26 Binary files /dev/null and b/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/fig2_inheritance_tax-95f7d4eb.png differ diff --git a/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/fig3_context_scope-b2531cbc.png b/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/fig3_context_scope-b2531cbc.png new file mode 100644 index 000000000..a5f110ffd Binary files /dev/null and b/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/fig3_context_scope-b2531cbc.png differ diff --git a/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/index.md b/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/index.md index 8535be4d3..b026b4eb9 100644 --- a/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/index.md +++ b/content/posts/2026/05/28/banned-threadlocal-java-scoped-values/index.md @@ -6,7 +6,7 @@ description: "Why ThreadLocal kills performance under Project Loom and how the E canonical: "https://blog.arkstack.dev/en/blog/why-i-banned-threadlocal-from-the-exeris-kernel" authors: - "arkadiusz-przychocki" -image: "Screenshot-2026-06-03-at-09.05.15.png" +image: "Screenshot-2026-06-03-at-09.05.15.jpg" categories: - "Java" - "JavaPro" @@ -38,7 +38,7 @@ Treating Virtual Threads like OS threads discards most of their scalability adva ### 1. The Spaghetti State (Unconstrained Mutability) Any code deep in the call stack that can read a `ThreadLocal` can also call `.set()` on it. If a nested library mutates the `SecurityContext` mid-flight, tracking down who changed it and when is a debugging nightmare. Data flow becomes completely unpredictable. -![Figure 1: The uncontrolled mutability of ThreadLocal versus the strict, read-only data flow guarantees of a lexically bounded Scoped Value.](https://blog.arkstack.dev/blog/scopedvalue/fig1_spaghetti_state.png) +![Figure 1: The uncontrolled mutability of ThreadLocal versus the strict, read-only data flow guarantees of a lexically bounded Scoped Value.](fig1_spaghetti_state-9fe986e4.png) ### 2. The Memory Leak Trap (Unbounded Lifetime) @@ -49,7 +49,7 @@ A `ThreadLocal` survives until the thread dies or someone explicitly calls `.rem This is the fatal blow. To share context with child threads, frameworks use `InheritableThreadLocal`. When a parent thread creates a child, the JVM must **eagerly clone** the parent's `ThreadLocalMap`. This typically allocates between **32 and 128 bytes** per entry on the heap, depending on the load factor and key distribution. Now, imagine a single HTTP request where your logic forks **50 concurrent sub-tasks** (Virtual Threads) to fetch data. You just triggered **50 expensive map allocations** . Multiply that by 10,000 concurrent requests, and your Garbage Collector stalls your application just to clean up useless context clones. This becomes a **pure GC tax with no business value**. -![Figure 2: The O(N) memory copy penalty of InheritableThreadLocal compared to the O(1) constant-time pointer inheritance introduced in JEP 506.](https://blog.arkstack.dev/blog/scopedvalue/fig2_inheritance_tax.png) +![Figure 2: The O(N) memory copy penalty of InheritableThreadLocal compared to the O(1) constant-time pointer inheritance introduced in JEP 506.](fig2_inheritance_tax-95f7d4eb.png) ## The Missing Link: Structured Concurrency Incompatibility @@ -73,7 +73,7 @@ Instead of a globally mutable variable, a `ScopedValue` defines a **Dynamic Scop ## Exhibit B: "Show, Don't Tell" — The Exeris Implementation In the Exeris Kernel, context propagation is strictly separated. The Security module authenticates, and the Persistence module applies Row-Level Security. They never talk directly. They communicate purely through an **"Invisible Wall"** using `ScopedValue`. -![Figure 3: Context propagation in the Exeris Kernel. Security and Persistence modules remain completely decoupled, sharing identity strictly through an immutable dynamic scope.](https://blog.arkstack.dev/blog/scopedvalue/fig3_context_scope.png) +![Figure 3: Context propagation in the Exeris Kernel. Security and Persistence modules remain completely decoupled, sharing identity strictly through an immutable dynamic scope.](fig3_context_scope-b2531cbc.png) Here is how identity is injected at the gateway. Notice the complete absence of `.set()` methods: diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.17.36-PM.jpg b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.17.36-PM.jpg new file mode 100644 index 000000000..1385ca4b5 Binary files /dev/null and b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.17.36-PM.jpg differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.17.36-PM.png b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.17.36-PM.png deleted file mode 100644 index 1ba3e8bc0..000000000 Binary files a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.17.36-PM.png and /dev/null differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.29.10-PM-1024x706.jpg b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.29.10-PM-1024x706.jpg new file mode 100644 index 000000000..43bfb7d6f Binary files /dev/null and b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.29.10-PM-1024x706.jpg differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.29.10-PM-1024x706.png b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.29.10-PM-1024x706.png deleted file mode 100644 index 2f4530a16..000000000 Binary files a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.29.10-PM-1024x706.png and /dev/null differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.38.24-PM-1024x965.jpg b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.38.24-PM-1024x965.jpg new file mode 100644 index 000000000..217708318 Binary files /dev/null and b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.38.24-PM-1024x965.jpg differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.38.24-PM-1024x965.png b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.38.24-PM-1024x965.png deleted file mode 100644 index f6dfb4362..000000000 Binary files a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.38.24-PM-1024x965.png and /dev/null differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.41.23-PM-1024x923.jpg b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.41.23-PM-1024x923.jpg new file mode 100644 index 000000000..ab413d994 Binary files /dev/null and b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.41.23-PM-1024x923.jpg differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.41.23-PM-1024x923.png b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.41.23-PM-1024x923.png deleted file mode 100644 index eb5cdc8d4..000000000 Binary files a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.41.23-PM-1024x923.png and /dev/null differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.41.49-PM-1024x428.jpg b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.41.49-PM-1024x428.jpg new file mode 100644 index 000000000..c8ce6417a Binary files /dev/null and b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.41.49-PM-1024x428.jpg differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.41.49-PM-1024x428.png b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.41.49-PM-1024x428.png deleted file mode 100644 index e3e66f25b..000000000 Binary files a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.41.49-PM-1024x428.png and /dev/null differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.42.22-PM-1024x157.jpg b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.42.22-PM-1024x157.jpg new file mode 100644 index 000000000..dd9be660f Binary files /dev/null and b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.42.22-PM-1024x157.jpg differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.42.22-PM-1024x157.png b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.42.22-PM-1024x157.png deleted file mode 100644 index c419f2337..000000000 Binary files a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.42.22-PM-1024x157.png and /dev/null differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.44.42-PM-1024x595.jpg b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.44.42-PM-1024x595.jpg new file mode 100644 index 000000000..a019c37bf Binary files /dev/null and b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.44.42-PM-1024x595.jpg differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.44.42-PM-1024x595.png b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.44.42-PM-1024x595.png deleted file mode 100644 index b8ae42856..000000000 Binary files a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.44.42-PM-1024x595.png and /dev/null differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.45.34-PM-1024x513.jpg b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.45.34-PM-1024x513.jpg new file mode 100644 index 000000000..858cab5b0 Binary files /dev/null and b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.45.34-PM-1024x513.jpg differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.45.34-PM-1024x513.png b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.45.34-PM-1024x513.png deleted file mode 100644 index cff86ea96..000000000 Binary files a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.45.34-PM-1024x513.png and /dev/null differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.46.50-PM-1024x481.jpg b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.46.50-PM-1024x481.jpg new file mode 100644 index 000000000..6c6507e17 Binary files /dev/null and b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.46.50-PM-1024x481.jpg differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.46.50-PM-1024x481.png b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.46.50-PM-1024x481.png deleted file mode 100644 index af136a9ba..000000000 Binary files a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.46.50-PM-1024x481.png and /dev/null differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.47.30-PM-1024x663.jpg b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.47.30-PM-1024x663.jpg new file mode 100644 index 000000000..0052af1b0 Binary files /dev/null and b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.47.30-PM-1024x663.jpg differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.47.30-PM-1024x663.png b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.47.30-PM-1024x663.png deleted file mode 100644 index 22d0c59ce..000000000 Binary files a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.47.30-PM-1024x663.png and /dev/null differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.47.56-PM-1024x797.jpg b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.47.56-PM-1024x797.jpg new file mode 100644 index 000000000..4b4d7d781 Binary files /dev/null and b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.47.56-PM-1024x797.jpg differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.47.56-PM-1024x797.png b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.47.56-PM-1024x797.png deleted file mode 100644 index 844195e59..000000000 Binary files a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.47.56-PM-1024x797.png and /dev/null differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.49.33-PM-1024x663.jpg b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.49.33-PM-1024x663.jpg new file mode 100644 index 000000000..2ad7c8f07 Binary files /dev/null and b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.49.33-PM-1024x663.jpg differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.49.33-PM-1024x663.png b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.49.33-PM-1024x663.png deleted file mode 100644 index 5e72149e5..000000000 Binary files a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.49.33-PM-1024x663.png and /dev/null differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.49.59-PM-1024x807.jpg b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.49.59-PM-1024x807.jpg new file mode 100644 index 000000000..f0e3d25d8 Binary files /dev/null and b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.49.59-PM-1024x807.jpg differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.49.59-PM-1024x807.png b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.49.59-PM-1024x807.png deleted file mode 100644 index 1113c561c..000000000 Binary files a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.49.59-PM-1024x807.png and /dev/null differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-27-at-12.43.57-PM.jpg b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-27-at-12.43.57-PM.jpg new file mode 100644 index 000000000..2b4bb0ed6 Binary files /dev/null and b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-27-at-12.43.57-PM.jpg differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-27-at-12.43.57-PM.png b/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-27-at-12.43.57-PM.png deleted file mode 100644 index e43bb9cbf..000000000 Binary files a/content/posts/2026/05/28/exploring-mongot-atlas-search/Screenshot-2026-05-27-at-12.43.57-PM.png and /dev/null differ diff --git a/content/posts/2026/05/28/exploring-mongot-atlas-search/index.md b/content/posts/2026/05/28/exploring-mongot-atlas-search/index.md index 6f11323df..429322b33 100644 --- a/content/posts/2026/05/28/exploring-mongot-atlas-search/index.md +++ b/content/posts/2026/05/28/exploring-mongot-atlas-search/index.md @@ -6,7 +6,7 @@ description: "MongoT is a wrapper around the amazing Java search engine: Lucene. canonical: "https://tech-blog.luketn.com/exploring-mongot-atlas-search" authors: - "luke-thompson" -image: "Screenshot-2026-05-08-at-3.17.36-PM.png" +image: "Screenshot-2026-05-08-at-3.17.36-PM.jpg" categories: - "Databases" - "Java" @@ -137,7 +137,7 @@ idea . - 5005:5005 # Debug port ``` -![](Screenshot-2026-05-27-at-12.43.57-PM.png) +![](Screenshot-2026-05-27-at-12.43.57-PM.jpg) This will allow us to connect and debug the locally built mongot code over the 5005 debugger port. @@ -179,7 +179,7 @@ If you want to dig into the code for that, there's a walkthrough here: Here's the Atlas Search Coco sample project serving up queried data from the Coco image dataset through a locally debugged MongoT: -![](Screenshot-2026-05-08-at-3.29.10-PM-1024x706.png) +![](Screenshot-2026-05-08-at-3.29.10-PM-1024x706.jpg) And here is the index that was built in the local MongoT through Compass: ![](Screenshot-2026-05-08-at-3.34.11-PM-1024x476.png) @@ -265,7 +265,7 @@ Here you can see the fully composed BooleanQuery, combining the string-type Term This is interesting just for learning the (somewhat obtuse) Java library API for Lucene queries. The results from Lucene include the docs matched and the facets: -![](Screenshot-2026-05-08-at-3.38.24-PM-1024x965.png) +![](Screenshot-2026-05-08-at-3.38.24-PM-1024x965.jpg) You can keep digging around and see all the ways the wrapper is marshaling documents from Lucene indexes. @@ -375,7 +375,7 @@ This is a super deep topic, and I won't cover all of it here, but there are grea #### Multiple-index searching with merged results MongoDB can't do multiple-index searching. MongoDB uses a single index per query, and if there is further filtering to be done, it will be done directly on the documents. A MongoDB query for multiple indexed fields looks broadly like this: -![](Screenshot-2026-05-08-at-3.41.23-PM-1024x923.png) +![](Screenshot-2026-05-08-at-3.41.23-PM-1024x923.jpg) (Gross oversimplification of MongoDB's query engine) @@ -390,7 +390,7 @@ In a typical text field index, Lucene analyzes text into terms. It stores those You can also have simpler 1-1 indexes over fields that don't need the text extracted, like integers, floating point numbers, dates, enums, and keywords. You can think of Lucene indexes like a set of maps between Term Ids to a list of Document Ids. -![](Screenshot-2026-05-08-at-3.41.49-PM-1024x428.png) +![](Screenshot-2026-05-08-at-3.41.49-PM-1024x428.jpg) Lucene is very efficient at performing index intersection, because of the basic structure and sort order of the data and ordinal indexes, and several optimization techniques like: @@ -403,7 +403,7 @@ MongoT creates Lucene documents to match MongoDB documents, mapping every Atlas Depending on the preferences you choose for each field in the Atlas Search field mappings, MongoT will store the values of the MongoDB document differently in the Lucene document. It may store a single value using multiple Lucene document field types in order to support filtering, sorting, and faceting: -![](Screenshot-2026-05-08-at-3.42.22-PM-1024x157.png) +![](Screenshot-2026-05-08-at-3.42.22-PM-1024x157.jpg) For this reason, it is probably worth taking some time tuning the Atlas Search index field mappings to ensure you are only selecting the options you really need. The bigger and more complex the field mappings and types are, the worse the performance and the heavier the resource requirements. @@ -503,7 +503,7 @@ db.image.aggregate([{$vectorSearch: { Behind the scenes, MongoT computes the embedding for the query text 'circular flying', uses Voyage API to compute a semantic meaning as an array of floats, then uses Lucene to find the nearest matches semantically in the index. You can put a breakpoint on EmbeddingServiceManager.embed() and take a look at how the query path works: -![](Screenshot-2026-05-08-at-3.44.42-PM-1024x595.png) +![](Screenshot-2026-05-08-at-3.44.42-PM-1024x595.jpg) So cool. There is obviously a real financial cost to this, but it is the ultimate in convenience. @@ -542,7 +542,7 @@ And then ran a K6 load test script to see what sort of performance MongoT was pr Here you can see the end- to- end performance of a Java Atlas Search API. As represented by the MongoT performance dashboard in Grafana: -![](Screenshot-2026-05-08-at-3.45.34-PM-1024x513.png) +![](Screenshot-2026-05-08-at-3.45.34-PM-1024x513.jpg) And as seen by the K6 client: @@ -567,7 +567,7 @@ k6 run -e K6_VUS=25 -e K6_DURATION=5m k6.js What does this mean? Well, the full round-trip of a Java HTTP Atlas Search API call as measured by the K6 client had a median response time of 12.8ms (using a large range of data scenarios drawn from the COCO image dataset). If I add some tracing to each request, I can see the overheads of Java vs the MongoT-\>MongoD end-to-end query command: -![](Screenshot-2026-05-08-at-3.46.50-PM-1024x481.png) +![](Screenshot-2026-05-08-at-3.46.50-PM-1024x481.jpg) ``` k6 run -e K6_VUS=25 -e K6_DURATION=5m k6.js @@ -584,10 +584,10 @@ I have to admit getting a bit deep down in the rabbit hole here, and spending mo With these traces, you can see that the actual Lucene index query part of the whole system is a tiny fraction of the overall query time. -![](Screenshot-2026-05-08-at-3.47.30-PM-1024x663.png) +![](Screenshot-2026-05-08-at-3.47.30-PM-1024x663.jpg) And over a K6 load client run: -![](Screenshot-2026-05-08-at-3.47.56-PM-1024x797.png) +![](Screenshot-2026-05-08-at-3.47.56-PM-1024x797.jpg) (Note times are slowed by additional tracing) @@ -598,10 +598,10 @@ If you look at the breakdown of timings within MongoT, only a small fraction of All that said, the overall performance for Atlas Search is amazing, and as a pairing, they are a rock-solid, high-performance search engine, tightly coupled (in a good way!) between the transactional data and the search index. I really like a visual representation of performance, and being able to pull out traces: -![](Screenshot-2026-05-08-at-3.49.33-PM-1024x663.png) +![](Screenshot-2026-05-08-at-3.49.33-PM-1024x663.jpg) And then walk through the spans in a search trace: -![](Screenshot-2026-05-08-at-3.49.59-PM-1024x807.png) +![](Screenshot-2026-05-08-at-3.49.59-PM-1024x807.jpg) Really helps me understand the code and how it works. Of course, the additional tracing severely impacts performance, but if you want to, check out the branch and play with the Grafana dashboards! diff --git a/content/posts/2026/05/31/javafx-links-of-may-2026/index.md b/content/posts/2026/05/31/javafx-links-of-may-2026/index.md index 035f9f158..98a8c15f7 100644 --- a/content/posts/2026/05/31/javafx-links-of-may-2026/index.md +++ b/content/posts/2026/05/31/javafx-links-of-may-2026/index.md @@ -6,7 +6,7 @@ description: "Here are the JavaFX LinksOfTheMonth of May 2026. You can find the canonical: "https://webtechie.be/post/2026-05-29-javafx-links-of-may-2026/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2026/05/31/javafx-links-of-may-2026/jfxcentral.jpg b/content/posts/2026/05/31/javafx-links-of-may-2026/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2026/05/31/javafx-links-of-may-2026/jfxcentral.jpg differ diff --git a/content/posts/2026/05/31/javafx-links-of-may-2026/jfxcentral.png b/content/posts/2026/05/31/javafx-links-of-may-2026/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2026/05/31/javafx-links-of-may-2026/jfxcentral.png and /dev/null differ diff --git a/content/posts/2026/06/03/nfc-crypto-biometrics-and-a-new-build-cloud/build-cloud-preview-ecf80f16.jpg b/content/posts/2026/06/03/nfc-crypto-biometrics-and-a-new-build-cloud/build-cloud-preview-ecf80f16.jpg new file mode 100644 index 000000000..dbd292102 Binary files /dev/null and b/content/posts/2026/06/03/nfc-crypto-biometrics-and-a-new-build-cloud/build-cloud-preview-ecf80f16.jpg differ diff --git a/content/posts/2026/06/03/nfc-crypto-biometrics-and-a-new-build-cloud/index.md b/content/posts/2026/06/03/nfc-crypto-biometrics-and-a-new-build-cloud/index.md index 644bf0a72..ede8c84d2 100644 --- a/content/posts/2026/06/03/nfc-crypto-biometrics-and-a-new-build-cloud/index.md +++ b/content/posts/2026/06/03/nfc-crypto-biometrics-and-a-new-build-cloud/index.md @@ -23,7 +23,7 @@ Last week was about defaults. This week is about device APIs moving into the fra ## A new Build Cloud UI — preview The single most visible change this week sits behind the Build Cloud login. The console we have been serving for years is being replaced. The new UI is **live now** [here](https://cloud.codenameone.com/console/index.html), alongside the current console you can still find [here](https://cloud.codenameone.com/secure/index.html). We want eyes and feedback on it before we flip the default. -![](https://www.codenameone.com/blog/nfc-crypto-biometrics-and-build-cloud/build-cloud-preview.png) +![](build-cloud-preview-ecf80f16.jpg) The whole console is written in Java 17 against the Codename One UI framework, then compiled to JavaScript via our JavaScript port and served as static assets from inside the Build Cloud. Same `Form`, `Container`, `BoxLayout`, `Toolbar`, `theme.css` you would write for a phone build. diff --git a/content/posts/2026/06/08/metal-default-a-new-build-cloud-and-a-new-format/index.md b/content/posts/2026/06/08/metal-default-a-new-build-cloud-and-a-new-format/index.md index 0156a4b0e..3c4fb6353 100644 --- a/content/posts/2026/06/08/metal-default-a-new-build-cloud-and-a-new-format/index.md +++ b/content/posts/2026/06/08/metal-default-a-new-build-cloud-and-a-new-format/index.md @@ -17,7 +17,7 @@ related_posts: frozen: false --- -![Metal Default, A New Build Cloud, And A New Format](https://www.codenameone.com/blog/metal-default-new-build-cloud-and-a-new-format.jpg) +![Metal Default, A New Build Cloud, And A New Format](metal-default-new-build-cloud-and-a-new-af830751.jpg) This week's release post looks different on purpose. The Friday omnibus has been getting longer and longer, and that has been working against us in two ways. SEO ignores 5,000 word pages that cover twelve unrelated topics, so the actual material gets buried instead of indexed against the queries that should find it. And when a single release post covers ten things, it becomes hard to point a colleague at "that one Codename One change from a few weeks ago" without scrolling for ten minutes. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). diff --git a/content/posts/2026/06/08/metal-default-a-new-build-cloud-and-a-new-format/metal-default-new-build-cloud-and-a-new-af830751.jpg b/content/posts/2026/06/08/metal-default-a-new-build-cloud-and-a-new-format/metal-default-new-build-cloud-and-a-new-af830751.jpg new file mode 100644 index 000000000..151ca5feb Binary files /dev/null and b/content/posts/2026/06/08/metal-default-a-new-build-cloud-and-a-new-format/metal-default-new-build-cloud-and-a-new-af830751.jpg differ diff --git a/content/posts/2026/06/10/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/Screenshot-2026-06-10-at-2.22.17-PM.jpg b/content/posts/2026/06/10/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/Screenshot-2026-06-10-at-2.22.17-PM.jpg new file mode 100644 index 000000000..f81a59996 Binary files /dev/null and b/content/posts/2026/06/10/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/Screenshot-2026-06-10-at-2.22.17-PM.jpg differ diff --git a/content/posts/2026/06/10/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/Screenshot-2026-06-10-at-2.22.17-PM.png b/content/posts/2026/06/10/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/Screenshot-2026-06-10-at-2.22.17-PM.png deleted file mode 100644 index 8257ed8ee..000000000 Binary files a/content/posts/2026/06/10/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/Screenshot-2026-06-10-at-2.22.17-PM.png and /dev/null differ diff --git a/content/posts/2026/06/10/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/index.md b/content/posts/2026/06/10/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/index.md index 1a8c7afb1..88aaf4234 100644 --- a/content/posts/2026/06/10/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/index.md +++ b/content/posts/2026/06/10/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/index.md @@ -155,7 +155,7 @@ The response from the model is parsed, and each record is validated before being An unclear conversation, full of imprecise intermediate commands and inaccurate assumptions, will produce a significantly less useful output. As usual, the quality and attention paid to this type of activity is directly proportional to the future quality of the assistant's responses. Below is a sequence diagram summarizing the interaction just presented: -![](Screenshot-2026-06-10-at-2.22.17-PM.png) +![](Screenshot-2026-06-10-at-2.22.17-PM.jpg) ## The Advisor Chain and Why Order Matters diff --git a/content/posts/2026/06/10/spring-ai-agents-no-second-runtime/index.md b/content/posts/2026/06/10/spring-ai-agents-no-second-runtime/index.md index 75700affc..0dd7d8116 100644 --- a/content/posts/2026/06/10/spring-ai-agents-no-second-runtime/index.md +++ b/content/posts/2026/06/10/spring-ai-agents-no-second-runtime/index.md @@ -5,7 +5,7 @@ lastmod: "2026-06-14T22:05:20+00:00" description: "AgentFlow4J is a JVM-native runtime for governed multi-agent systems. Build, govern and operate AI agents on your existing Spring infrastructure without introducing a second platform." authors: - "ahmed-sekka" -image: "spring-govern.png" +image: "spring-govern.jpg" categories: - "AI" - "FinOps" diff --git a/content/posts/2026/06/10/spring-ai-agents-no-second-runtime/spring-govern.jpg b/content/posts/2026/06/10/spring-ai-agents-no-second-runtime/spring-govern.jpg new file mode 100644 index 000000000..a81ff3661 Binary files /dev/null and b/content/posts/2026/06/10/spring-ai-agents-no-second-runtime/spring-govern.jpg differ diff --git a/content/posts/2026/06/10/spring-ai-agents-no-second-runtime/spring-govern.png b/content/posts/2026/06/10/spring-ai-agents-no-second-runtime/spring-govern.png deleted file mode 100644 index b7616b3b0..000000000 Binary files a/content/posts/2026/06/10/spring-ai-agents-no-second-runtime/spring-govern.png and /dev/null differ diff --git a/content/posts/2026/06/10/your-tls-stack-is-lying-about-zero-copy/fig1_tls_boundary-47eb7dea.png b/content/posts/2026/06/10/your-tls-stack-is-lying-about-zero-copy/fig1_tls_boundary-47eb7dea.png new file mode 100644 index 000000000..43683392c Binary files /dev/null and b/content/posts/2026/06/10/your-tls-stack-is-lying-about-zero-copy/fig1_tls_boundary-47eb7dea.png differ diff --git a/content/posts/2026/06/10/your-tls-stack-is-lying-about-zero-copy/fig2_fd_owner_path-bbe97a15.png b/content/posts/2026/06/10/your-tls-stack-is-lying-about-zero-copy/fig2_fd_owner_path-bbe97a15.png new file mode 100644 index 000000000..0cf0c4b8f Binary files /dev/null and b/content/posts/2026/06/10/your-tls-stack-is-lying-about-zero-copy/fig2_fd_owner_path-bbe97a15.png differ diff --git a/content/posts/2026/06/10/your-tls-stack-is-lying-about-zero-copy/fig3_gc_allocation_rate-abbc2a91.jpg b/content/posts/2026/06/10/your-tls-stack-is-lying-about-zero-copy/fig3_gc_allocation_rate-abbc2a91.jpg new file mode 100644 index 000000000..7dd91c76c Binary files /dev/null and b/content/posts/2026/06/10/your-tls-stack-is-lying-about-zero-copy/fig3_gc_allocation_rate-abbc2a91.jpg differ diff --git a/content/posts/2026/06/10/your-tls-stack-is-lying-about-zero-copy/index.md b/content/posts/2026/06/10/your-tls-stack-is-lying-about-zero-copy/index.md index b4fce6c07..9f01301c4 100644 --- a/content/posts/2026/06/10/your-tls-stack-is-lying-about-zero-copy/index.md +++ b/content/posts/2026/06/10/your-tls-stack-is-lying-about-zero-copy/index.md @@ -47,7 +47,7 @@ That matters because I am not trying to reduce heap pressure only statistically What `SSLEngine` gives you is different. It relies on buffer exchange through a JDK object contract and state transitions expressed through JVM return objects. Its cleanup is not shaped around the same explicit ownership model as the rest of the kernel. In a conventional stack, delayed cleanup is usually acceptable because the whole system already tolerates a lot of deferred work. In an off-heap-first runtime, "cleanup later" is not neutral. It means native TLS state can survive beyond the point where the runtime is logically done with it. Once I noticed this mismatch in ownership semantics clearly, I stopped thinking of `SSLEngine` as a component to tune and started seeing it as a boundary that belonged to the wrong architecture. -![SSLEngine memory contract vs. Exeris Arena ownership model.](https://blog.arkstack.dev/blog/your-tls-stack-is-lying-about-zero-copy/fig1_tls_boundary.png) Figure 1: SSLEngine memory contract vs. Exeris Arena ownership model. +![SSLEngine memory contract vs. Exeris Arena ownership model.](fig1_tls_boundary-47eb7dea.png) Figure 1: SSLEngine memory contract vs. Exeris Arena ownership model. ## The Netty Question @@ -117,7 +117,7 @@ I tested four distinct architectural models: | Exeris FD Owner | Direct Socket OS boundary | **\~367k ops/s** | **0 B/op** | *(Methodology: JMH `gc` phase, Oracle JDK 26 GA, ZGC, commit [`f778683`](https://github.com/exeris-systems/exeris-benchmarks/commit/f778683bf1d343d0c6a3a595d2d3b754c44a696c), 2026-05-01. The Memory BIO profile phase additionally confirmed via JFR: zero `jdk.GarbageCollection` events recorded — ZGC never ran a single collection during the entire benchmark run. Full suite in [`exeris-benchmarks`](https://github.com/exeris-systems/exeris-benchmarks).)* -![The data path of Memory BIO vs FD Owner directly binding to the socket descriptor.](https://blog.arkstack.dev/blog/your-tls-stack-is-lying-about-zero-copy/fig2_fd_owner_path.png) Figure 2: The data path of Memory BIO vs FD Owner directly binding to the socket descriptor. +![The data path of Memory BIO vs FD Owner directly binding to the socket descriptor.](fig2_fd_owner_path-bbe97a15.png) Figure 2: The data path of Memory BIO vs FD Owner directly binding to the socket descriptor. Let's unpack what these numbers actually mean, because context matters more than raw digits. @@ -136,7 +136,7 @@ To process a standard 1024-byte payload, `SSLEngine` allocates over **2.5 Kiloby By contrast, the Exeris FFM paths drop the normalized allocation rate to **strict zero**. (The profiler registers \~0.01 B/op with zero actual GC counts, which is standard JMH measurement noise for absolute zero). This is the core definition of "No Waste Compute." By eliminating the intermediate buffer tier completely, the kernel fundamentally changes the garbage collector's job. It stops doing TLS cleanup entirely. ZGC is no longer forced to clean up after the cryptography layer. -![Allocation rate (garbage generated) per 1KB payload across different TLS architectures.](https://blog.arkstack.dev/blog/your-tls-stack-is-lying-about-zero-copy/fig3_gc_allocation_rate.png) Figure 3: Allocation rate (garbage generated) per 1KB payload across different TLS architectures. +![Allocation rate (garbage generated) per 1KB payload across different TLS architectures.](fig3_gc_allocation_rate-abbc2a91.jpg) Figure 3: Allocation rate (garbage generated) per 1KB payload across different TLS architectures. ## Where SSLEngine Still Wins diff --git a/content/posts/2026/06/12/on-device-debugging-and-junit-5/index.md b/content/posts/2026/06/12/on-device-debugging-and-junit-5/index.md index f83b065e3..70280b561 100644 --- a/content/posts/2026/06/12/on-device-debugging-and-junit-5/index.md +++ b/content/posts/2026/06/12/on-device-debugging-and-junit-5/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![On-Device Debugging And JUnit 5](https://www.codenameone.com/blog/developer-workflow-debug-and-junit.jpg) +![On-Device Debugging And JUnit 5](developer-workflow-debug-and-junit.jpg) This is the first follow-up to [Friday's release post](https://www.codenameone.com/blog/metal-default-new-build-cloud-and-a-new-format/) and it covers the two changes from this release that affect how you iterate on a Codename One app rather than what the app itself does. On-device debugging that treats Java as Java on a real iPhone or a real Android device, and standard JUnit 5 against the JavaSE simulator. The first is the one we have been wanting for a long time, and is the one that takes the most explaining, so most of the post is about it. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -47,7 +47,7 @@ The Android attach uses standard `adb`, so you need the Android SDK platform too ### What it looks like A breakpoint inside an iOS app, hit on the iOS Simulator next to IntelliJ IDEA: -![IntelliJ stopped at a breakpoint inside a Codename One iOS app, with locals and the running simulator visible](https://www.codenameone.com/blog/developer-workflow-debug-and-junit/intellij-debugger-on-device.png) +![IntelliJ stopped at a breakpoint inside a Codename One iOS app, with locals and the running simulator visible](intellij-debugger-on-device-8d0beb31.jpg) The same Debug tool window you use for any other Java project. Frames panel on the left has the full Java call stack. The Variables panel shows `this` and the locals as Java values, with the same drill-down you would get on a regular JVM. The simulator on the right is the real iOS app, paused at the breakpoint, waiting for the next step. @@ -193,10 +193,10 @@ class GreetingFormTest { That is more useful than constructing a `Form` directly in the test because it exercises the same startup path the simulator runs. The assertions check the form your app opens, not a form the test wrote. The natural way to run it is from the IntelliJ gutter. Click the green ▶ icon next to the class declaration: -![IntelliJ gutter run menu showing Run, Debug, Run with Coverage for GreetingFormTest](https://www.codenameone.com/blog/developer-workflow-debug-and-junit/intellij-gutter-run-menu.png) +![IntelliJ gutter run menu showing Run, Debug, Run with Coverage for GreetingFormTest](intellij-gutter-run-menu-5984ab5d.jpg) The results land in the standard Run tool window: -![IntelliJ test results showing GreetingFormTest passed, 1 test total, 520 ms](https://www.codenameone.com/blog/developer-workflow-debug-and-junit/intellij-test-results.png) +![IntelliJ test results showing GreetingFormTest passed, 1 test total, 520 ms](intellij-test-results-dfbea22c.jpg) Click the green icon next to a specific `@Test` method to run just that method. The same flow works in VS Code's Test Explorer and in Eclipse's JUnit view. diff --git a/content/posts/2026/06/12/on-device-debugging-and-junit-5/intellij-debugger-on-device-8d0beb31.jpg b/content/posts/2026/06/12/on-device-debugging-and-junit-5/intellij-debugger-on-device-8d0beb31.jpg new file mode 100644 index 000000000..c99034d41 Binary files /dev/null and b/content/posts/2026/06/12/on-device-debugging-and-junit-5/intellij-debugger-on-device-8d0beb31.jpg differ diff --git a/content/posts/2026/06/12/on-device-debugging-and-junit-5/intellij-gutter-run-menu-5984ab5d.jpg b/content/posts/2026/06/12/on-device-debugging-and-junit-5/intellij-gutter-run-menu-5984ab5d.jpg new file mode 100644 index 000000000..2ce4fc4e2 Binary files /dev/null and b/content/posts/2026/06/12/on-device-debugging-and-junit-5/intellij-gutter-run-menu-5984ab5d.jpg differ diff --git a/content/posts/2026/06/12/on-device-debugging-and-junit-5/intellij-test-results-dfbea22c.jpg b/content/posts/2026/06/12/on-device-debugging-and-junit-5/intellij-test-results-dfbea22c.jpg new file mode 100644 index 000000000..d94155608 Binary files /dev/null and b/content/posts/2026/06/12/on-device-debugging-and-junit-5/intellij-test-results-dfbea22c.jpg differ diff --git a/content/posts/2026/06/15/codename-one-ai-oauth-and-other-platform-apis-in-the-core/chatview-a3516248.png b/content/posts/2026/06/15/codename-one-ai-oauth-and-other-platform-apis-in-the-core/chatview-a3516248.png new file mode 100644 index 000000000..8afd38f3d Binary files /dev/null and b/content/posts/2026/06/15/codename-one-ai-oauth-and-other-platform-apis-in-the-core/chatview-a3516248.png differ diff --git a/content/posts/2026/06/15/codename-one-ai-oauth-and-other-platform-apis-in-the-core/index.md b/content/posts/2026/06/15/codename-one-ai-oauth-and-other-platform-apis-in-the-core/index.md index 71a0428e5..989fa17fa 100644 --- a/content/posts/2026/06/15/codename-one-ai-oauth-and-other-platform-apis-in-the-core/index.md +++ b/content/posts/2026/06/15/codename-one-ai-oauth-and-other-platform-apis-in-the-core/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![AI, OAuth, And Other Platform APIs In The Core](https://www.codenameone.com/blog/platform-apis-in-the-core.jpg) +![AI, OAuth, And Other Platform APIs In The Core](platform-apis-in-the-core.jpg) This is the second follow-up to [Friday's release post](https://www.codenameone.com/blog/metal-default-new-build-cloud-and-a-new-format/). It covers the platform APIs that moved into the framework core this release. There are two headline pieces (AI / LLM and the modern OAuth / OIDC stack), and two smaller pieces (WiFi / connectivity and share-sheet result callbacks). This continues the direction the previous release set when we moved NFC, biometrics, and cryptography into the framework core. The full background on that earlier set is in [NFC, Crypto, Biometrics, And A New Build Cloud](https://www.codenameone.com/blog/nfc-crypto-biometrics-and-build-cloud/). | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -207,7 +207,7 @@ f.show(); ``` The result is a standard mobile chat layout, picked up from whichever native theme the project uses: -![ChatView running against gpt-4o-mini, showing assistant and user bubbles plus a streaming response and the bottom input bar](https://www.codenameone.com/blog/platform-apis-in-the-core/chatview.png) +![ChatView running against gpt-4o-mini, showing assistant and user bubbles plus a streaming response and the bottom input bar](chatview-a3516248.png) If you want more control than `bindToLlm(...)` gives you (custom message styling, a "thinking" placeholder, hand-rolled retry, persistence to your own model class), drive the view by hand: diff --git a/content/posts/2026/06/17/mac-native-builds-live-protocols-and-open-issues-under-350/index.md b/content/posts/2026/06/17/mac-native-builds-live-protocols-and-open-issues-under-350/index.md index d0d8cf32d..ab10a1bc6 100644 --- a/content/posts/2026/06/17/mac-native-builds-live-protocols-and-open-issues-under-350/index.md +++ b/content/posts/2026/06/17/mac-native-builds-live-protocols-and-open-issues-under-350/index.md @@ -17,7 +17,7 @@ related_posts: frozen: false --- -![Mac Native Builds, Live Protocols, And Open Issues Under 350](https://www.codenameone.com/blog/weekly.jpg) +![Mac Native Builds, Live Protocols, And Open Issues Under 350](weekly.jpg) Our focus was all over the place this week with work that targeted many different directions: desktop, monetization, communication, media, and more. This fits with our roadmap of one platform that delivers the promise Java never delivered: WORA for Everything Everywhere. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -37,7 +37,7 @@ Every one of the bigger items has its own deep-dive tutorial. Here is the tour, ### Your app is now a native Mac app Your existing Codename One app can ship as a **100% native Mac app today, with zero porting effort**. No rewrite, no bundled JVM, no Electron shell: the project you already have produces a lean native Mac binary the same way it produces your iPhone app, on the same Metal renderer and battle-tested native pipeline. And it arrives feeling like a real Mac app, not a phone in a window: native title bar, native menu bar, interactive scrollbars, and desktop notifications come with it. Two of this week's features in one shot: the sample below uses the new advertising API covered later in this post, running as a native Mac app from the same Java code that produces the iOS and Android builds: -![The advertising API sample running as a native Mac app](https://www.codenameone.com/blog/mac-native-builds-and-desktop-integration/mac-app.png) +![The advertising API sample running as a native Mac app](mac-app-3ef7dddb.png) The full tutorial, including the new desktop menu and shortcut APIs and the Mac signing hints, is in [Your Codename One App, Now A Native Mac App](https://www.codenameone.com/blog/mac-native-builds-and-desktop-integration/). @@ -132,7 +132,7 @@ The hard part of that task was that the agent had no objective measure of how cl Agents can now automatically update the skills to the latest versions and also describe the content of Codename One GUIs. This is valuable as they review their work and don't need to use vision which is both more expensive and not as accurate. We also added the ability to check component alignment, which is often a problem that LLMs find difficult. There is also a new linter that I think we should expose to the human developers as well in the future. Right now you can see all of these tools and use them just as an agent would, but they are more CLI oriented. [PR #5168](https://github.com/codenameone/CodenameOne/pull/5168) also rebuilt the Initializr, the tool that scaffolds a new project, around the Codename One design language, and trimmed it so it is easier to approach. It leads with the essentials (main class, package, and a Java or Kotlin toggle) and tucks IDE, localization, Java version, and current settings into collapsible cards, with a live preview and a single generate bar at the bottom. The four-template picker became the Java/Kotlin toggle, and the accent, rounded-buttons, and custom-CSS controls were dropped. The project model behind it is unchanged, so generated projects are the same; this is purely about lowering the barrier to getting started. -![The redesigned Initializr](https://www.codenameone.com/blog/mac-native-grpc-graphql-and-fewer-open-issues/initializr.png) +![The redesigned Initializr](initializr-17773c6d.png) ## Smaller fixes worth knowing about diff --git a/content/posts/2026/06/17/mac-native-builds-live-protocols-and-open-issues-under-350/initializr-17773c6d.png b/content/posts/2026/06/17/mac-native-builds-live-protocols-and-open-issues-under-350/initializr-17773c6d.png new file mode 100644 index 000000000..5240fadba Binary files /dev/null and b/content/posts/2026/06/17/mac-native-builds-live-protocols-and-open-issues-under-350/initializr-17773c6d.png differ diff --git a/content/posts/2026/06/17/mac-native-builds-live-protocols-and-open-issues-under-350/mac-app-3ef7dddb.png b/content/posts/2026/06/17/mac-native-builds-live-protocols-and-open-issues-under-350/mac-app-3ef7dddb.png new file mode 100644 index 000000000..feb1738e2 Binary files /dev/null and b/content/posts/2026/06/17/mac-native-builds-live-protocols-and-open-issues-under-350/mac-app-3ef7dddb.png differ diff --git a/content/posts/2026/06/18/openapi-orm-svg-and-lottie/index.md b/content/posts/2026/06/18/openapi-orm-svg-and-lottie/index.md index 22732277c..665618dec 100644 --- a/content/posts/2026/06/18/openapi-orm-svg-and-lottie/index.md +++ b/content/posts/2026/06/18/openapi-orm-svg-and-lottie/index.md @@ -17,7 +17,7 @@ related_posts: frozen: false --- -![OpenAPI, ORM, SVG and Lottie](https://www.codenameone.com/blog/build-time-codegen.jpg) +![OpenAPI, ORM, SVG and Lottie](build-time-codegen.jpg) This is the third follow-up to [Friday's release post](https://www.codenameone.com/blog/metal-default-new-build-cloud-and-a-new-format/). Saturday's was about how you iterate; yesterday's was about new platform APIs in the core; today's is about a run of pieces that change how you write the structural parts of an app. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -204,7 +204,7 @@ src/main/css/ After the next build, every SVG is a regular Codename One `Image`. **An SVG handled by the transcoder is a vector image, but it is still an `Image`.** Everywhere a raster `Image` works (`Label.setIcon`, `Button.setIcon`, `BorderLayout.NORTH`, the toolbar, a `MultiButton`'s leading icon, a CSS `background: url(...)` rule), the SVG works too. The difference is that it stays crisp at any size: the same source file is sharp at a 16-point list-row icon, a 64-point hero header, and a 256-point launch screen, on every DPI bucket. A grid of the static SVGs from the hellocodenameone fixture, rendered through the new pipeline: -![Static SVGs rendered by the build-time transcoder on iOS Metal: filled star, gradient-filled circle, path arrow, rounded button, two stroked wave paths, gradient-filled PRO badge, clipped badge](https://www.codenameone.com/blog/build-time-codegen/svg-static.png) +![Static SVGs rendered by the build-time transcoder on iOS Metal: filled star, gradient-filled circle, path arrow, rounded button, two stroked wave paths, gradient-filled PRO badge, clipped badge](svg-static-c3be1344.png) ### Sizing in millimeters @@ -265,7 +265,7 @@ form.add(pulse).add(spinner); ``` Animation runs against wall-clock time on every paint, with no `Timer` and no allocation in the hot path. A capture of the hellocodenameone Lottie fixture in motion: -![Animated Lottie playback: a red bar that pulses and rotates next to a blue ellipse that scales up and down](https://www.codenameone.com/blog/build-time-codegen/lottie-pulse-spinner.gif) +![Animated Lottie playback: a red bar that pulses and rotates next to a blue ellipse that scales up and down](lottie-pulse-spinner-314f115b.gif) The Lottie transcoder lives in `maven/lottie-transcoder/`. It parses Bodymovin JSON with no external dependencies (the framework's built-in JSON parser carries the load) and lowers each file into the same `SVGDocument` model the SVG path uses. The same `JavaCodeGenerator` emits the same `GeneratedSVGImage` subclass, and the same `SVGRegistry` registers it under the source filename. **No new `Image` base class, no new registry, no per-port wiring**, since the SVG path's JavaSE reflective load and iOS / Android Stub weaving already cover the new format. diff --git a/content/posts/2026/06/18/openapi-orm-svg-and-lottie/lottie-pulse-spinner-314f115b.gif b/content/posts/2026/06/18/openapi-orm-svg-and-lottie/lottie-pulse-spinner-314f115b.gif new file mode 100644 index 000000000..78890247a Binary files /dev/null and b/content/posts/2026/06/18/openapi-orm-svg-and-lottie/lottie-pulse-spinner-314f115b.gif differ diff --git a/content/posts/2026/06/18/openapi-orm-svg-and-lottie/svg-static-c3be1344.png b/content/posts/2026/06/18/openapi-orm-svg-and-lottie/svg-static-c3be1344.png new file mode 100644 index 000000000..c9f5d8ab7 Binary files /dev/null and b/content/posts/2026/06/18/openapi-orm-svg-and-lottie/svg-static-c3be1344.png differ diff --git a/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/boombox-mac-77d96835.png b/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/boombox-mac-77d96835.png new file mode 100644 index 000000000..3c98b771a Binary files /dev/null and b/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/boombox-mac-77d96835.png differ diff --git a/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/chatview-windows-a31571fe.png b/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/chatview-windows-a31571fe.png new file mode 100644 index 000000000..1f5cb5ecc Binary files /dev/null and b/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/chatview-windows-a31571fe.png differ diff --git a/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/gaming-demo-e6653b0e.webp b/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/gaming-demo-e6653b0e.webp new file mode 100644 index 000000000..b7ab1614c Binary files /dev/null and b/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/gaming-demo-e6653b0e.webp differ diff --git a/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/index.md b/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/index.md index 0bdc20834..87040f8e6 100644 --- a/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/index.md +++ b/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/index.md @@ -17,7 +17,7 @@ related_posts: frozen: false --- -![Native Java Win32, 3D Gaming, Printing and Wallet](https://www.codenameone.com/blog/weekly.jpg) +![Native Java Win32, 3D Gaming, Printing and Wallet](weekly-4df2ff44.jpg) This week we're introducing native Windows support (no JVM!), a 3D graphics API, a gaming API, support for Apple Wallet, printing and more in what is probably our biggest update ever… But that's not the thing that excites me the most. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -58,7 +58,7 @@ public void onFrame(GraphicsDevice device) { ``` And it isn't limited to primitives. A binary glTF model authored in any 3D tool loads with one call and renders with its own textures. This is the Khronos BoomBox sample model rendering on the native Mac target: -![A glTF model rendered by the portable 3D API on the native Mac target](https://www.codenameone.com/blog/portable-3d-graphics-api/boombox-mac.png) +![A glTF model rendered by the portable 3D API on the native Mac target](boombox-mac-77d96835.png) On iOS the vertex buffers are SIMD-aligned so the data is handed to Metal with no copy in between. The `RenderView` hosting all of this is a regular component, so a 3D view drops into a normal form next to buttons and text. We walk through the whole API in . @@ -82,7 +82,7 @@ protected void update(double dt) { ``` No render code in sight: the linked sprites track their physics bodies and the scene draws itself. Here it is running in the simulator: -![The gaming API physics demo, Box2D bodies driving sprites](https://www.codenameone.com/blog/game-development-api-box2d/gaming-demo.gif) +![The gaming API physics demo, Box2D bodies driving sprites](gaming-demo-e6653b0e.webp) The physics engine is JBox2D repackaged under `com.codename1.gaming.physics.box2d`, with an idiomatic wrapper that keeps your code in screen pixels and hides the meters and the flipped y-axis. Because everything is pure Java where it matters, it runs unchanged on every target, including iOS. For years we said no to gaming APIs in Codename One; also explains what changed our mind. @@ -92,7 +92,7 @@ The new Windows target translates your Java/Kotlin bytecode to C through ParparV > **Edit:** Since publishing this post we found the binaries were carrying their debug and stack-unwind tables inline. We now split that data into a separate symbol file (kept only to symbolize crashes) and dead-strip code the app never reaches, which brings the sizes down further -- the figures above reflect the leaner build. To be clear about what this is, because "Java on Windows" carries old associations: there is no Swing here, no AWT, no JavaFX, and no bundled runtime. It is the full Codename One framework compiled to native code, and everything in it works there, including the new printing API and the 3D layer. This is the same app from the same code base, rendered by Direct2D and DirectWrite on Windows: -![A Codename One app rendering natively on Windows via Direct2D](https://www.codenameone.com/blog/native-windows-port-no-jvm/chatview-windows.png) +![A Codename One app rendering natively on Windows via Direct2D](chatview-windows-a31571fe.png) People have been asking how to turn Java into a real `.exe` since the late nineties, and the modern answer, GraalVM, is a tool designed for a different purpose. The architecture, the history, and how this completes the native desktop story the Mac target started are all in . diff --git a/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/weekly-4df2ff44.jpg b/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/weekly-4df2ff44.jpg new file mode 100644 index 000000000..3a04b057f Binary files /dev/null and b/content/posts/2026/06/19/native-java-win32-3d-gaming-printing-and-wallet/weekly-4df2ff44.jpg differ diff --git a/content/posts/2026/06/19/where-production-policy-belongs-building-eliya-in-public/index.md b/content/posts/2026/06/19/where-production-policy-belongs-building-eliya-in-public/index.md index 892a6cd06..476d9fea9 100644 --- a/content/posts/2026/06/19/where-production-policy-belongs-building-eliya-in-public/index.md +++ b/content/posts/2026/06/19/where-production-policy-belongs-building-eliya-in-public/index.md @@ -18,7 +18,7 @@ frozen: false --- This is an argument about where production intent belongs in a managed runtime, and the OpenJDK distribution we built to act on it - Eliya, an opinionated, compliance-conscious OpenJDK distribution. This is the first article in a series. The later parts are engineering: reproducible builds, the glibc floor, release signing, the one source patch we shipped. This part is the thesis they all serve. -![](https://root.asymm.systems/images/jvm-behaviour-space.png) +![](jvm-behaviour-space-8d14d74a.png) Every configurable system has two spaces. The configuration space: every behaviour you can reach by setting the knobs the system already exposes. And there's the implementation space: behaviour that only exists if someone goes in and changes the internals. diff --git a/content/posts/2026/06/19/where-production-policy-belongs-building-eliya-in-public/jvm-behaviour-space-8d14d74a.png b/content/posts/2026/06/19/where-production-policy-belongs-building-eliya-in-public/jvm-behaviour-space-8d14d74a.png new file mode 100644 index 000000000..da7d7b1e5 Binary files /dev/null and b/content/posts/2026/06/19/where-production-policy-belongs-building-eliya-in-public/jvm-behaviour-space-8d14d74a.png differ diff --git a/content/posts/2026/06/20/we-will-not-sabotage-your-code/index.md b/content/posts/2026/06/20/we-will-not-sabotage-your-code/index.md index 084963b0d..f30200dd0 100644 --- a/content/posts/2026/06/20/we-will-not-sabotage-your-code/index.md +++ b/content/posts/2026/06/20/we-will-not-sabotage-your-code/index.md @@ -17,7 +17,7 @@ related_posts: frozen: false --- -![We Will Not Sabotage Your Code](https://www.codenameone.com/blog/we-will-not-sabotage-your-code.jpg) +![We Will Not Sabotage Your Code](we-will-not-sabotage-your-code.jpg) This is a very low bar. I am genuinely saddened that I need to write it down at all, because until last week it seemed too obvious to say out loud. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). diff --git a/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/Zmxvd2NoYXJ0IFRECiAgICBBWyJBcHAgY3Jhc2hl-18cd1d66.png b/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/Zmxvd2NoYXJ0IFRECiAgICBBWyJBcHAgY3Jhc2hl-18cd1d66.png new file mode 100644 index 000000000..29c51f683 Binary files /dev/null and b/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/Zmxvd2NoYXJ0IFRECiAgICBBWyJBcHAgY3Jhc2hl-18cd1d66.png differ diff --git a/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/chatview-linux-fd4d1722.png b/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/chatview-linux-fd4d1722.png new file mode 100644 index 000000000..b6abbd510 Binary files /dev/null and b/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/chatview-linux-fd4d1722.png differ diff --git a/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/game-platformer-d8e82357.gif b/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/game-platformer-d8e82357.gif new file mode 100644 index 000000000..9495b4443 Binary files /dev/null and b/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/game-platformer-d8e82357.gif differ diff --git a/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/index.md b/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/index.md index 437464ce5..515e7a061 100644 --- a/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/index.md +++ b/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/index.md @@ -17,7 +17,7 @@ related_posts: frozen: false --- -![Native Linux, Apple Watch, A Game Builder And Crash Protection](https://www.codenameone.com/blog/native-linux-apple-watch-game-builder-crash-protection.jpg) +![Native Linux, Apple Watch, A Game Builder And Crash Protection](native-linux-apple-watch-game-builder-cr-ec6e2f86.jpg) This week brings a native Linux desktop port, an Apple Watch and Wear OS port, a visual Game Builder with a high-level gaming API, and a new crash-protection system, with a tutorial following each one over the coming days. There is also a large piece of work that you mostly should not have noticed: we rebuilt the build cloud, and that rebuild caused a few failed builds along the way. More on that below. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -28,7 +28,7 @@ This week brings a native Linux desktop port, an Apple Watch and Wear OS port, a We expected this to be painful, and parts of it were, but Linux turned out to be mostly developer friendly. A non-trivial app fits in 5MB, and on my Linux machine it started faster than most of the GNOME native apps already installed; thanks to the default material design theme it tends to look better too: -![A Codename One app rendering natively on Linux via GTK3 and Cairo](https://www.codenameone.com/blog/java-to-a-native-linux-app/chatview-linux.png) +![A Codename One app rendering natively on Linux via GTK3 and Cairo](chatview-linux-fd4d1722.png) Most things just work, including the camera and 3D. The hard part of Linux is not the rendering, it is packaging and dependencies. We deliberately stayed out of the package-manager rabbit hole and ship one native binary you launch directly, the same model as Windows. The other classic Linux problem is glibc; if that sentence means nothing to you, consider yourself fortunate. We solved it by compiling against a very old glibc (around `GLIBC_2.17`, from 2013) and linking GTK3 dynamically, both of which are present on essentially every desktop. We also support **musl for Alpine** , and both **x64 and arm64**. Like the other ports, this is not a local-only path: the Linux target builds on the build cloud, and new projects from the Initializr come wired for it. The architecture and the build are covered in . @@ -38,7 +38,7 @@ Most things just work, including the camera and 3D. The hard part of Linux is no The answer is that reuse still happens. Many well known apps skip the watch entirely because it is such a chore, yet the amount of work a watch UI actually needs is small, and smaller still with Codename One. watchOS has no UIKit views, no OpenGL ES and no Metal, so the port ships a dedicated **Core Graphics rendering backend** and hosts the Codename One runtime inside a SwiftUI shell. The same Java code, branched with `CN.isWatch()`, renders real Codename One UI on the watch: -![A Codename One UI rendered on the Apple Watch simulator through the Core Graphics backend](https://www.codenameone.com/blog/native-apple-watch-and-wear/watch-bezel.png) +![A Codename One UI rendered on the Apple Watch simulator through the Core Graphics backend](watch-bezel-4ec346dc.png) That is a screenshot from our test framework, which was never designed for a watch: it still has a text field. Because that is a Codename One text field it renders correctly and "just works" right up until you try to edit in it, which on a watch would not give the result you want; a real watch UI would simply leave it out. @@ -50,7 +50,7 @@ Wear OS is simpler: a Wear OS app is an ordinary Android app, so the existing An This is the special case in this week's release. Tuesday's post is a full overview of the editor, the data model, and the streaming engine for large worlds, and then **a three-part tutorial series starts Thursday** rather than a single follow-up. The first tutorial builds a playable 2D platformer, "Duke's Coffee Run", from an empty scene to a running game, including the part most tutorials skip: bringing in real art and slicing an animated sprite sheet for Duke. -![Duke's Coffee Run, a 2D platformer built with the Game Builder](https://www.codenameone.com/blog/gamebuilder/game-platformer.gif) +![Duke's Coffee Run, a 2D platformer built with the Game Builder](game-platformer-d8e82357.gif) Two more parts follow on the next Thursdays: a blackjack card game, then a first-person 3D dungeon that scales up to large streaming worlds. The full picture of what the builder is and how it fits together is in . One important caveat: **the Game Builder and its high-level APIs are beta** . We are actively improving them and we want your feedback on the editor, the API shape, and the asset workflow. Tell us what works and what gets in your way through the [issue tracker](https://github.com/codenameone/CodenameOne/issues). @@ -60,7 +60,7 @@ Two more parts follow on the next Thursdays: a blackjack card game, then a first It is seamless in three senses. You do not wire up anything complex: the build servers do the heavy lifting. It connects to GitHub issues instead of sending a barrage of emails. And it symbolicates native crashes on every operating system we support, so a faulting address on iOS, Android, Windows or Linux comes back as a readable stack. On the device, reports are written to storage before they are sent and only deleted after the server confirms receipt, so nothing is lost to a flaky connection; a failed send is retried on the next launch and the server deduplicates it. -![Diagram](https://mermaid.ink/img/Zmxvd2NoYXJ0IFRECiAgICBBWyJBcHAgY3Jhc2hlcyBvbiBkZXZpY2UiXSAtLT4gQlsiV3JpdGUgcmVwb3J0IHRvIFN0b3JhZ2Ugd2l0aCBldmVudElkIl0KICAgIEIgLS0-IENbIlBPU1QgdG8gdGhlIGNyYXNoIGVuZHBvaW50Il0KICAgIEMgLS0-fDJ4eCBjb25maXJtZWR8IERbIkRlbGV0ZSB0aGUgc3RvcmVkIHJlcG9ydCJdCiAgICBDIC0tPnxvZmZsaW5lIG9yIGZhaWxlZHwgRVsiUmV0cnkgb24gbmV4dCBsYXVuY2gsIHNlcnZlciBkZWR1cHMgYnkgZXZlbnRJZCJdCiAgICBGWyJSZWxlYXNlIGJ1aWxkIG9uIHRoZSBjbG91ZCJdIC0tPiBHWyJVcGxvYWQgbWFwcGluZy50eHQgLyBkU1lNIHN5bWJvbHMiXQogICAgQyAtLT4gSFsiU2VydmVyIHN5bWJvbGljYXRlcyB0aGUgbmF0aXZlIHN0YWNrIl0KICAgIEcgLS0-IEgKICAgIEggLS0-IElbIkEgR2l0SHViIGlzc3VlLCBub3QgYW4gZW1haWwiXQ==?type=png&bgColor=ffffff) +![Diagram](Zmxvd2NoYXJ0IFRECiAgICBBWyJBcHAgY3Jhc2hl-18cd1d66.png) Personal data is scrubbed on the device before anything leaves it: emails are partially redacted and long digit runs are collapsed, with rules you can override. It is opt-in and off by default; turning it on is two lines, and the full walkthrough is in . diff --git a/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/native-linux-apple-watch-game-builder-cr-ec6e2f86.jpg b/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/native-linux-apple-watch-game-builder-cr-ec6e2f86.jpg new file mode 100644 index 000000000..98d60b2e8 Binary files /dev/null and b/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/native-linux-apple-watch-game-builder-cr-ec6e2f86.jpg differ diff --git a/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/watch-bezel-4ec346dc.png b/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/watch-bezel-4ec346dc.png new file mode 100644 index 000000000..2195caca0 Binary files /dev/null and b/content/posts/2026/06/26/native-linux-apple-watch-a-game-builder-and-crash-protection/watch-bezel-4ec346dc.png differ diff --git a/content/posts/2026/06/29/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-3-stateful-workflows-and-human-in-the-loop/fri1.jpg b/content/posts/2026/06/29/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-3-stateful-workflows-and-human-in-the-loop/fri1.jpg new file mode 100644 index 000000000..f3ff47a9e Binary files /dev/null and b/content/posts/2026/06/29/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-3-stateful-workflows-and-human-in-the-loop/fri1.jpg differ diff --git a/content/posts/2026/06/29/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-3-stateful-workflows-and-human-in-the-loop/fri1.png b/content/posts/2026/06/29/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-3-stateful-workflows-and-human-in-the-loop/fri1.png deleted file mode 100644 index f46f44c82..000000000 Binary files a/content/posts/2026/06/29/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-3-stateful-workflows-and-human-in-the-loop/fri1.png and /dev/null differ diff --git a/content/posts/2026/06/29/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-3-stateful-workflows-and-human-in-the-loop/index.md b/content/posts/2026/06/29/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-3-stateful-workflows-and-human-in-the-loop/index.md index 3530efd3d..54f33a0d0 100644 --- a/content/posts/2026/06/29/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-3-stateful-workflows-and-human-in-the-loop/index.md +++ b/content/posts/2026/06/29/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-3-stateful-workflows-and-human-in-the-loop/index.md @@ -5,7 +5,7 @@ lastmod: "2026-06-29T09:40:43+00:00" description: "This is the third and final article in the series. Part 1 covered the RAG foundation — loading runbooks into a vector store and grounding model answers in real documentation. Part 2 added short-term and long-term conversational memory. This article introduces stateful workflow checkpointing, tool calls, and a pause/resume mechanism that lets multi-step investigations survive session boundaries." authors: - "matteo-rossi" -image: "fri1.png" +image: "fri1.jpg" categories: - "AI" related_posts: diff --git a/content/posts/2026/06/29/youre-invited-to-intellij-idea-conf-2026/index.md b/content/posts/2026/06/29/youre-invited-to-intellij-idea-conf-2026/index.md index fb80d8fcf..3bd88f35f 100644 --- a/content/posts/2026/06/29/youre-invited-to-intellij-idea-conf-2026/index.md +++ b/content/posts/2026/06/29/youre-invited-to-intellij-idea-conf-2026/index.md @@ -5,7 +5,7 @@ lastmod: "2026-08-08T11:43:51+00:00" description: "You are invited to IntelliJ IDEA Conf 2026, a free virtual event on March 26-27, 2026. Learn about topics relevant to modern Java and Kotlin." authors: - "marit-van-dijk" -image: "intellij-idea-conf-2026.png" +image: "intellij-idea-conf-2026.jpg" categories: - "AI" - "IntelliJ IDEA" diff --git a/content/posts/2026/06/29/youre-invited-to-intellij-idea-conf-2026/intellij-idea-conf-2026.jpg b/content/posts/2026/06/29/youre-invited-to-intellij-idea-conf-2026/intellij-idea-conf-2026.jpg new file mode 100644 index 000000000..9afe7ec58 Binary files /dev/null and b/content/posts/2026/06/29/youre-invited-to-intellij-idea-conf-2026/intellij-idea-conf-2026.jpg differ diff --git a/content/posts/2026/06/29/youre-invited-to-intellij-idea-conf-2026/intellij-idea-conf-2026.png b/content/posts/2026/06/29/youre-invited-to-intellij-idea-conf-2026/intellij-idea-conf-2026.png deleted file mode 100644 index ac54579fc..000000000 Binary files a/content/posts/2026/06/29/youre-invited-to-intellij-idea-conf-2026/intellij-idea-conf-2026.png and /dev/null differ diff --git a/content/posts/2026/06/30/javafx-links-of-june-2026/index.md b/content/posts/2026/06/30/javafx-links-of-june-2026/index.md index 063523b77..64f846572 100644 --- a/content/posts/2026/06/30/javafx-links-of-june-2026/index.md +++ b/content/posts/2026/06/30/javafx-links-of-june-2026/index.md @@ -4,7 +4,7 @@ date: "2026-06-30T07:23:31+00:00" description: "Here are the JavaFX LinksOfTheMonth of June 2026. You can find the weekly lists on jfx-central.com. Did we miss anything? Is there anything you want to…" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2026/06/30/javafx-links-of-june-2026/jfxcentral.jpg b/content/posts/2026/06/30/javafx-links-of-june-2026/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2026/06/30/javafx-links-of-june-2026/jfxcentral.jpg differ diff --git a/content/posts/2026/06/30/javafx-links-of-june-2026/jfxcentral.png b/content/posts/2026/06/30/javafx-links-of-june-2026/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2026/06/30/javafx-links-of-june-2026/jfxcentral.png and /dev/null differ diff --git a/content/posts/2026/07/02/building-ai-systems-with-mongodb-implementing-the-planning-pattern/foojay4-1024x741.jpg b/content/posts/2026/07/02/building-ai-systems-with-mongodb-implementing-the-planning-pattern/foojay4-1024x741.jpg new file mode 100644 index 000000000..da14cf6af Binary files /dev/null and b/content/posts/2026/07/02/building-ai-systems-with-mongodb-implementing-the-planning-pattern/foojay4-1024x741.jpg differ diff --git a/content/posts/2026/07/02/building-ai-systems-with-mongodb-implementing-the-planning-pattern/foojay4-1024x741.png b/content/posts/2026/07/02/building-ai-systems-with-mongodb-implementing-the-planning-pattern/foojay4-1024x741.png deleted file mode 100644 index f4c8552c5..000000000 Binary files a/content/posts/2026/07/02/building-ai-systems-with-mongodb-implementing-the-planning-pattern/foojay4-1024x741.png and /dev/null differ diff --git a/content/posts/2026/07/02/building-ai-systems-with-mongodb-implementing-the-planning-pattern/index.md b/content/posts/2026/07/02/building-ai-systems-with-mongodb-implementing-the-planning-pattern/index.md index 75fc2770d..b7f45419f 100644 --- a/content/posts/2026/07/02/building-ai-systems-with-mongodb-implementing-the-planning-pattern/index.md +++ b/content/posts/2026/07/02/building-ai-systems-with-mongodb-implementing-the-planning-pattern/index.md @@ -68,7 +68,7 @@ For example, when a user executes any question, this will be the flow that the a Begin by generating a new Jakarta EE project using the [Jakarta EE starter](https://start.jakarta.ee/). For this example, we will use Glassfish version 8.0.3. Select Jakarta EE 11 as the version, Platform as the profile, and Java 21 as the Java version. Refer to the image below for these options. After selecting them, click "Generate Project" to download your project. -![](foojay4-1024x741.png) +![](foojay4-1024x741.jpg) Next, add the required libraries. Jakarta Data streamlines MongoDB integration with Java and supports the Java Enterprise standard. For AI integration, we will use langchain4j with CDI. diff --git a/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/Zmxvd2NoYXJ0IFRECiAgICBBWyJZb3VyIGFwcCBj-844901c9.png b/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/Zmxvd2NoYXJ0IFRECiAgICBBWyJZb3VyIGFwcCBj-844901c9.png new file mode 100644 index 000000000..80bf2f65c Binary files /dev/null and b/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/Zmxvd2NoYXJ0IFRECiAgICBBWyJZb3VyIGFwcCBj-844901c9.png differ diff --git a/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/app-review-sheet-4b1ca1e1.png b/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/app-review-sheet-4b1ca1e1.png new file mode 100644 index 000000000..94b682466 Binary files /dev/null and b/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/app-review-sheet-4b1ca1e1.png differ diff --git a/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/components-codeeditor-38f1f08d.png b/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/components-codeeditor-38f1f08d.png new file mode 100644 index 000000000..64897a7f5 Binary files /dev/null and b/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/components-codeeditor-38f1f08d.png differ diff --git a/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/funding-open-source-without-the-bait-and-da742f04.jpg b/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/funding-open-source-without-the-bait-and-da742f04.jpg new file mode 100644 index 000000000..8ef6444e2 Binary files /dev/null and b/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/funding-open-source-without-the-bait-and-da742f04.jpg differ diff --git a/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/index.md b/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/index.md index 09af14fa8..17a83b6ab 100644 --- a/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/index.md +++ b/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![Funding Open Source Without The Bait And Switch](https://www.codenameone.com/blog/funding-open-source-without-the-bait-and-switch.jpg) +![Funding Open Source Without The Bait And Switch](funding-open-source-without-the-bait-and-da742f04.jpg) Years ago I wrote a piece called [Open Source Bait and Switch](https://debugagent.com/open-source-bait-and-switch). The short version: a project is released as open source while it has no business model, a community forms around it, and then the bill comes due. The project either rots into abandonware because nobody can afford to maintain it, or it sprouts a home-grown "source available" license that quietly takes back the freedoms it was given on. You have watched this happen. So have I. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -35,7 +35,7 @@ That second answer is **optional services that sit on top of the open source pro Crash protection last week was the first example of that depth. Analytics this week adds a second pattern: a paid provider that sits behind an open Service Provider Interface, so the same code can target a third-party backend just as easily as ours. -![Diagram](https://mermaid.ink/img/Zmxvd2NoYXJ0IFRECiAgICBBWyJZb3VyIGFwcCBjYWxscyBBbmFseXRpY3MuZXZlbnQoKSJdIC0tPiBCeyJDb25zZW50IGdhdGU8YnIvPihvcHQtaW4gYnkgZGVmYXVsdCkifQogICAgQiAtLT58Z3JhbnRlZHwgQ1siQW5hbHl0aWNzUHJvdmlkZXIgU1BJIl0KICAgIEIgLS0-fGRlbmllZHwgWlsiTm90aGluZyBsZWF2ZXMgdGhlIGRldmljZSJdCiAgICBDIC0tPiBEWyJHb29nbGVBbmFseXRpY3NQcm92aWRlciAoR0E0KSJdCiAgICBDIC0tPiBFWyJNYXRvbW9BbmFseXRpY3NQcm92aWRlciJdCiAgICBDIC0tPiBGWyJGaXJlYmFzZUFuYWx5dGljc1Byb3ZpZGVyIl0KICAgIEMgLS0-IEdbIkNvZGVuYW1lT25lQW5hbHl0aWNzUHJvdmlkZXI8YnIvPihmaXJzdC1wYXJ0eSwgaW5jbHVkZWQgd2l0aCBhIHN1YnNjcmlwdGlvbikiXQogICAgc3R5bGUgRyBmaWxsOiMxZjZmZWIsY29sb3I6I2ZmZg==?type=png&bgColor=ffffff) +![Diagram](Zmxvd2NoYXJ0IFRECiAgICBBWyJZb3VyIGFwcCBj-844901c9.png) You can wire the analytics facade to Google Analytics, to Matomo, to Firebase, or to your own `AnalyticsProvider`, and the framework does not care which. If you pick our first-party provider you get a privacy-oriented analytics backend with the consent handling already done, and you also fund the next port, the next API, the next year of this. That is the entire pitch. It is not a tax on the open source project; it is a better default that happens to also pay for the open source project. @@ -62,7 +62,7 @@ Five providers ship in the box: our first-party `CodenameOneAnalyticsProvider` ( [PR #5264](https://github.com/codenameone/CodenameOne/pull/5264) brings mapping back into core and modernizes it, retiring the old tile-based `MapComponent` and the external Google Maps cn1lib. Two components share one `MapSurface` API. The one I am most excited about is `MapView`, a **pure-vector map rendered entirely through `Graphics`** , with a Mapbox Vector Tile engine built on the framework's own `ProtoReader` and `GeneralPath`. There is no native peer, which means no z-order fights, no snapshot-during-animation compromise, and identical rendering everywhere including the simulator and the web. You host your own tile data and metadata, pick a light or dark style, and you control every pixel that gets drawn. -![A pure-vector OpenStreetMap render and the same area in the built-in dark style, both drawn entirely through the Codename One Graphics pipeline with no native peer](https://www.codenameone.com/blog/vector-and-native-maps/maps-vector.png) +![A pure-vector OpenStreetMap render and the same area in the built-in dark style, both drawn entirely through the Codename One Graphics pipeline with no native peer](maps-vector-3b51b09e.jpg) The second component, `NativeMap`, gives you a real native map from a provider like Apple MapKit or Google Maps, wired through an SPI selected by a build hint rather than code. The old Google Maps cn1lib tied you to one vendor; this does not. Because the provider is injected at build time, the core and ports carry no map SDK, unused providers cost zero project size, and a device without Google Play, a Huawei phone for instance, is one build hint away from a working native map instead of a porting dead end. When no provider is configured, `NativeMap` falls back to an embedded `MapView`. The engine and the provider model are covered in . @@ -87,7 +87,7 @@ That work also finished wiring `@media` for the existing watch port, which never [PR #5272](https://github.com/codenameone/CodenameOne/pull/5272) adds two visual editors. `RichTextArea` is a WYSIWYG HTML editor, bold, italic, lists, links, colors, headings, with `getHtml` and `setHtml`. `CodeEditor` is an IDE-style editor with syntax highlighting for eight languages, a line-number gutter, light and dark themes, bracket and quote auto-close, asynchronous code completion, and diagnostics that render as squiggly underlines with gutter markers and tooltips. -![The CodeEditor with Java syntax highlighting, a gutter, and an async code-completion popup, and the RichTextArea WYSIWYG editor with a formatting toolbar](https://www.codenameone.com/blog/rich-text-and-code-editing/components-codeeditor.png) +![The CodeEditor with Java syntax highlighting, a gutter, and an async code-completion popup, and the RichTextArea WYSIWYG editor with a formatting toolbar](components-codeeditor-38f1f08d.png) Both sit on a single `AbstractEditorComponent` with two interchangeable backends: a fully cross-platform engine made of self-contained HTML and JS inside the core jar, and an optional richer native backend a port can supply. The `CodeEditor` is not a toy demo: the Playground already uses it. The deep dive is in . @@ -95,7 +95,7 @@ Both sit on a single `AbstractEditorComponent` with two interchangeable backends Two smaller APIs round out the week, both built in core rather than as cn1libs. [PR #5277](https://github.com/codenameone/CodenameOne/pull/5277) adds `DeviceIntegrity`, a portable runtime self-protection API for high-security apps: Play Integrity and iOS App Attest attestation, root, jailbreak and Frida detection, and an accessibility-service abuse guard, most of it driven by build hints with a runtime API on top. We already have several customers in banking and payments, and Codename One is hardened to meet the requirements they bring; this API is part of that work. [PR #5268](https://github.com/codenameone/CodenameOne/pull/5268) adds `AppReview`, which uses the platform's native store-review prompt where it exists and falls back to a built-in widget everywhere else, with a feedback split that quietly routes unhappy users to you instead of to a one-star public review. -![The AppReview fallback rating widget, used on platforms without a native in-app review prompt](https://www.codenameone.com/blog/device-integrity-and-app-review/app-review-sheet.png) +![The AppReview fallback rating widget, used on platforms without a native in-app review prompt](app-review-sheet-4b1ca1e1.png) Both are covered in . diff --git a/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/maps-vector-3b51b09e.jpg b/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/maps-vector-3b51b09e.jpg new file mode 100644 index 000000000..b8dcb36ff Binary files /dev/null and b/content/posts/2026/07/05/funding-open-source-without-the-bait-and-switch-analytics-native-maps-tv-and-more/maps-vector-3b51b09e.jpg differ diff --git a/content/posts/2026/07/06/a-week-of-housekeeping-what-changed-on-foojay-io/foojay_linkedin_banner.jpg b/content/posts/2026/07/06/a-week-of-housekeeping-what-changed-on-foojay-io/foojay_linkedin_banner.jpg new file mode 100644 index 000000000..84fc1b196 Binary files /dev/null and b/content/posts/2026/07/06/a-week-of-housekeeping-what-changed-on-foojay-io/foojay_linkedin_banner.jpg differ diff --git a/content/posts/2026/07/06/a-week-of-housekeeping-what-changed-on-foojay-io/foojay_linkedin_banner.png b/content/posts/2026/07/06/a-week-of-housekeeping-what-changed-on-foojay-io/foojay_linkedin_banner.png deleted file mode 100644 index cefb48f0c..000000000 Binary files a/content/posts/2026/07/06/a-week-of-housekeeping-what-changed-on-foojay-io/foojay_linkedin_banner.png and /dev/null differ diff --git a/content/posts/2026/07/06/a-week-of-housekeeping-what-changed-on-foojay-io/index.md b/content/posts/2026/07/06/a-week-of-housekeeping-what-changed-on-foojay-io/index.md index fa43f2c40..ac836318d 100644 --- a/content/posts/2026/07/06/a-week-of-housekeeping-what-changed-on-foojay-io/index.md +++ b/content/posts/2026/07/06/a-week-of-housekeeping-what-changed-on-foojay-io/index.md @@ -6,7 +6,7 @@ description: "Running a community website is a bit like maintaining a codebase: authors: - "dominika-tasarz" - "frankdelporte" -image: "foojay_linkedin_banner.png" +image: "foojay_linkedin_banner.jpg" categories: - "Foojay" related_posts: diff --git a/content/posts/2026/07/06/exposed-kotlin-orm-complete-guide/Exposed-1024x683.jpg b/content/posts/2026/07/06/exposed-kotlin-orm-complete-guide/Exposed-1024x683.jpg new file mode 100644 index 000000000..2eb40aa82 Binary files /dev/null and b/content/posts/2026/07/06/exposed-kotlin-orm-complete-guide/Exposed-1024x683.jpg differ diff --git a/content/posts/2026/07/06/exposed-kotlin-orm-complete-guide/Exposed-1024x683.png b/content/posts/2026/07/06/exposed-kotlin-orm-complete-guide/Exposed-1024x683.png deleted file mode 100644 index 0804a7aee..000000000 Binary files a/content/posts/2026/07/06/exposed-kotlin-orm-complete-guide/Exposed-1024x683.png and /dev/null differ diff --git a/content/posts/2026/07/06/exposed-kotlin-orm-complete-guide/index.md b/content/posts/2026/07/06/exposed-kotlin-orm-complete-guide/index.md index b68e72c2a..fd5d87007 100644 --- a/content/posts/2026/07/06/exposed-kotlin-orm-complete-guide/index.md +++ b/content/posts/2026/07/06/exposed-kotlin-orm-complete-guide/index.md @@ -31,7 +31,7 @@ For quite some time, I have been a huge fan of and fascinated by JetBrains produ Even more excitingly, JetBrains Java Annotated Monthly newsletters have featured most of the technical articles I wrote for Foojay on topics such as Java, Spring, Spring Boot 4, and OpenRewrite. Recently, one Kotlin Domain-Specific Language (DSL) library caught my attention. I immediately tried converting my existing Spring Boot 4 application from Java to Kotlin using Exposed, an ORM framework for Kotlin. -![Exposed](Exposed-1024x683.png) Kotlin SQL Libary +![Exposed](Exposed-1024x683.jpg) Kotlin SQL Libary Before diving into the Exposed library, let's first understand some fundamentals and prerequisites. diff --git a/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-after.jpg b/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-after.jpg new file mode 100644 index 000000000..47a3404b3 Binary files /dev/null and b/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-after.jpg differ diff --git a/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-after.png b/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-after.png deleted file mode 100644 index 44184d711..000000000 Binary files a/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-after.png and /dev/null differ diff --git a/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-before.jpg b/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-before.jpg new file mode 100644 index 000000000..a4a93c74e Binary files /dev/null and b/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-before.jpg differ diff --git a/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-before.png b/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-before.png deleted file mode 100644 index 0e2b7621a..000000000 Binary files a/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-before.png and /dev/null differ diff --git a/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-previewer.jpg b/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-previewer.jpg new file mode 100644 index 000000000..b308993e4 Binary files /dev/null and b/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-previewer.jpg differ diff --git a/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-previewer.png b/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-previewer.png deleted file mode 100644 index 00c2b5707..000000000 Binary files a/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/20260702-lottie4j-previewer.png and /dev/null differ diff --git a/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/index.md b/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/index.md index 297fa101a..b5b324dbc 100644 --- a/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/index.md +++ b/content/posts/2026/07/07/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/index.md @@ -6,7 +6,7 @@ description: "A Lottie library is only as good as its output looks. If an animat canonical: "https://webtechie.be/post/closing-the-visual-gap-between-the-official-lottie-webplayer-and-lottie4j/" authors: - "frankdelporte" -image: "20260702-lottie4j-after.png" +image: "20260702-lottie4j-after.jpg" categories: - "JavaFX" related_posts: @@ -22,7 +22,7 @@ A Lottie library is only as good as its output looks. If an animation renders di Within the `fxfileviewer`, there is an app to visually compare the result of the JavaFX player and a webview using the official JavaScript player. Problem is that I was using the JavaFX Web component for this and this doesn't fully support the latest/best version of this player. Based on this app for manual checks, I also created a unit test which is able to loop over a set of files and compare the differences to make sure changes in the code don't break the existing renderer. But I kept struggling with the same test file [interactive_mood_selector_ui.json](https://github.com/lottie4j/lottie4j/tree/main/fxfileviewer/src/test/resources/json/interactive_mood_selector_ui.json) which didn't render correctly, both in the JavaFX view and my web-based view to compare it with. Over the last weeks the focus has been exactly there: **making the JavaFX output match the reference renderer, pixel for pixel** (if possible). -![](20260702-lottie4j-after.png) +![](20260702-lottie4j-after.jpg) ## Improved Comparison Workflow @@ -83,9 +83,9 @@ Where are we now? Check the images below. 3. The third screenshot is the **"after"** which shows a lot of improvements. First and most important, the comparison images from the webview are now pixel-perfect as they get rendered based on the latest version of the official Lottie web player. And you can also see that the JavaFX result is now a really close match! The background gradients are not pixel-perfect yet, and I still see small differences in the text, which confirms the 95% similarity score. But overall, I'm very happy with the improvements! {{< gallery >}} -20260702-lottie4j-previewer.png -20260702-lottie4j-before.png -20260702-lottie4j-after.png +20260702-lottie4j-previewer.jpg +20260702-lottie4j-before.jpg +20260702-lottie4j-after.jpg {{< /gallery >}} ## The Cost diff --git a/content/posts/2026/07/09/nulling-out-references-wont-help-your-garbage-collector/Screenshot-2026-07-09-at-15.41.30.jpg b/content/posts/2026/07/09/nulling-out-references-wont-help-your-garbage-collector/Screenshot-2026-07-09-at-15.41.30.jpg new file mode 100644 index 000000000..477c054e3 Binary files /dev/null and b/content/posts/2026/07/09/nulling-out-references-wont-help-your-garbage-collector/Screenshot-2026-07-09-at-15.41.30.jpg differ diff --git a/content/posts/2026/07/09/nulling-out-references-wont-help-your-garbage-collector/Screenshot-2026-07-09-at-15.41.30.png b/content/posts/2026/07/09/nulling-out-references-wont-help-your-garbage-collector/Screenshot-2026-07-09-at-15.41.30.png deleted file mode 100644 index 9761af17c..000000000 Binary files a/content/posts/2026/07/09/nulling-out-references-wont-help-your-garbage-collector/Screenshot-2026-07-09-at-15.41.30.png and /dev/null differ diff --git a/content/posts/2026/07/09/nulling-out-references-wont-help-your-garbage-collector/index.md b/content/posts/2026/07/09/nulling-out-references-wont-help-your-garbage-collector/index.md index a0a8a027b..1f4c3a810 100644 --- a/content/posts/2026/07/09/nulling-out-references-wont-help-your-garbage-collector/index.md +++ b/content/posts/2026/07/09/nulling-out-references-wont-help-your-garbage-collector/index.md @@ -5,7 +5,7 @@ lastmod: "2026-07-09T13:53:17+00:00" description: "Learn how intricate and amazing the JVM is and how much cognitive load that it takes on so you rarely have to think about things that steal your focus away from application logic." authors: - "kirk-pepperdine" -image: "Screenshot-2026-07-09-at-15.41.30.png" +image: "Screenshot-2026-07-09-at-15.41.30.jpg" categories: - "Performance" related_posts: diff --git a/content/posts/2026/07/09/the-java-story-a-film-about-all-of-us/Java-Documentary-snap-1024x615.jpg b/content/posts/2026/07/09/the-java-story-a-film-about-all-of-us/Java-Documentary-snap-1024x615.jpg new file mode 100644 index 000000000..4384074fe Binary files /dev/null and b/content/posts/2026/07/09/the-java-story-a-film-about-all-of-us/Java-Documentary-snap-1024x615.jpg differ diff --git a/content/posts/2026/07/09/the-java-story-a-film-about-all-of-us/Java-Documentary-snap-1024x615.png b/content/posts/2026/07/09/the-java-story-a-film-about-all-of-us/Java-Documentary-snap-1024x615.png deleted file mode 100644 index 35dd14a2c..000000000 Binary files a/content/posts/2026/07/09/the-java-story-a-film-about-all-of-us/Java-Documentary-snap-1024x615.png and /dev/null differ diff --git a/content/posts/2026/07/09/the-java-story-a-film-about-all-of-us/index.md b/content/posts/2026/07/09/the-java-story-a-film-about-all-of-us/index.md index 563e9f2d5..c0befd8cf 100644 --- a/content/posts/2026/07/09/the-java-story-a-film-about-all-of-us/index.md +++ b/content/posts/2026/07/09/the-java-story-a-film-about-all-of-us/index.md @@ -43,4 +43,4 @@ If you have time to take part in the live online premiere, here are a few practi If Java, OpenJDK or Jakarta EE has been part of your career (as you're reading this on Foojay, it probably has 😉 ) - take some time on July 17th if you're around, to watch this with the rest of us. Set your reminder, show up for the live chat and share it with the developers who came up through this same community. Stories like this don't get told very often and - as Java Community - this one's about all of us. -[![](Java-Documentary-snap-1024x615.png)](https://www.youtube.com/watch?v=ZqGSg4b_cZA) +[![](Java-Documentary-snap-1024x615.jpg)](https://www.youtube.com/watch?v=ZqGSg4b_cZA) diff --git a/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/android-auto-grid-0747322d.png b/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/android-auto-grid-0747322d.png new file mode 100644 index 000000000..84de4ba3d Binary files /dev/null and b/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/android-auto-grid-0747322d.png differ diff --git a/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/carplay-list-2ff85766.png b/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/carplay-list-2ff85766.png new file mode 100644 index 000000000..aa28c94de Binary files /dev/null and b/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/carplay-list-2ff85766.png differ diff --git a/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/commerce-14925472.jpg b/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/commerce-14925472.jpg new file mode 100644 index 000000000..4d6750aee Binary files /dev/null and b/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/commerce-14925472.jpg differ diff --git a/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/index.md b/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/index.md index c27b2c64c..4823c4756 100644 --- a/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/index.md +++ b/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![More Surfaces, Same Deal: Cars, Sensors, Commerce, Video And Builds](https://www.codenameone.com/blog/one-codebase-more-surfaces.jpg) +![More Surfaces, Same Deal: Cars, Sensors, Commerce, Video And Builds](one-codebase-more-surfaces.jpg) Last week's release post was about funding open source without the bait and switch. This week's release tests that idea again, because two of the new features touch paid infrastructure directly: Commerce and versioned builds. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -35,9 +35,9 @@ Here is what shipped. [PR #5281](https://github.com/codenameone/CodenameOne/pull/5281) adds a portable `com.codename1.car` API for Apple CarPlay and Google Android Auto. The important caveat is that car platforms are template-based. They do not allow an app to draw an arbitrary Codename One `Form` on the dashboard. You describe a driver-safe list, grid, message, pane, navigation, or now-playing template, and Codename One maps that to `CPTemplate` on CarPlay and `androidx.car.app` templates on Android Auto. -![CarPlay list template rendered by the Codename One car API](https://www.codenameone.com/blog/carplay-android-auto-codename-one/carplay-list.png) +![CarPlay list template rendered by the Codename One car API](carplay-list-2ff85766.png) -![Android Auto grid template rendered by the Codename One car API](https://www.codenameone.com/blog/carplay-android-auto-codename-one/android-auto-grid.png) +![Android Auto grid template rendered by the Codename One car API](android-auto-grid-0747322d.png) The API is zero cost when unused. Referencing `com.codename1.car` is what tells the build to inject CarPlay scenes, entitlements, Android Auto services, and the AndroidX dependency. Apps that never touch the package do not carry that code. Tomorrow's post walks through the template model, the simulator head unit, and the approvals you still need from Apple and Google. @@ -72,9 +72,9 @@ The Secrets API has deliberately lower volume and is enabled for everyone. It fe Monday's post is mostly a failure-mode pass over Commerce: what it does, what it refuses to do, what happens when quota is exhausted, and why optional validation is not an IAP tax. -![Commerce dashboard for receipt validation and entitlement tracking](https://www.codenameone.com/blog/commerce-secrets-without-iap-tax/commerce.png) +![Commerce dashboard for receipt validation and entitlement tracking](commerce-14925472.jpg) -![Secrets dashboard for cloud-managed app secrets](https://www.codenameone.com/blog/commerce-secrets-without-iap-tax/secrets.png) +![Secrets dashboard for cloud-managed app secrets](secrets-3b1c282a.jpg) ## Versioned Builds Are Back @@ -94,7 +94,7 @@ Subscription tiers limit versioned build access because old versions create supp [PR #5317](https://github.com/codenameone/CodenameOne/pull/5317) adds a sample-accurate `AudioMixer` for combining PCM tracks on one clock. [PR #5319](https://github.com/codenameone/CodenameOne/pull/5319) adds timed Whisper transcription, so generated videos can get SRT or VTT captions instead of plain text transcripts. -![Frame-accurate VideoIO decode output from the Codename One test app](https://www.codenameone.com/blog/videoio-audio-mixer-whisper/videoio-decoded-frames.png) +![Frame-accurate VideoIO decode output from the Codename One test app](videoio-decoded-frames-282e5493.jpg) Wednesday's post shows how these pieces fit: render frames, mix audio, encode a video, decode frames back out, and attach timed captions. diff --git a/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/secrets-3b1c282a.jpg b/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/secrets-3b1c282a.jpg new file mode 100644 index 000000000..67690109d Binary files /dev/null and b/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/secrets-3b1c282a.jpg differ diff --git a/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/videoio-decoded-frames-282e5493.jpg b/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/videoio-decoded-frames-282e5493.jpg new file mode 100644 index 000000000..9d0bd8583 Binary files /dev/null and b/content/posts/2026/07/10/more-surfaces-same-deal-cars-sensors-commerce-video-and-builds/videoio-decoded-frames-282e5493.jpg differ diff --git a/content/posts/2026/07/10/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/Timeline1-1024x590.jpg b/content/posts/2026/07/10/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/Timeline1-1024x590.jpg new file mode 100644 index 000000000..8f7050677 Binary files /dev/null and b/content/posts/2026/07/10/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/Timeline1-1024x590.jpg differ diff --git a/content/posts/2026/07/10/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/Timeline1-1024x590.png b/content/posts/2026/07/10/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/Timeline1-1024x590.png deleted file mode 100644 index 3f365cd5f..000000000 Binary files a/content/posts/2026/07/10/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/Timeline1-1024x590.png and /dev/null differ diff --git a/content/posts/2026/07/10/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/index.md b/content/posts/2026/07/10/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/index.md index 72fec4548..7a8565df3 100644 --- a/content/posts/2026/07/10/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/index.md +++ b/content/posts/2026/07/10/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/index.md @@ -56,7 +56,7 @@ The **Temporal Service** sits separately, managing task queues and event histori ## Seeing is believing The Temporal Web UI got singled out as "worth the price of admission." Every workflow execution — running or long finished — is inspectable: inputs, outputs, timelines, per-activity details down to which process on which machine executed each step. -![](Timeline1-1024x590.png) +![](Timeline1-1024x590.jpg) In the live demo, Tom killed the inventory service mid-order. The UI showed the reserve-inventory activity failing and retrying — attempt six, seven, eight — while the rest of the workflow simply waited. diff --git a/content/posts/2026/07/17/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/c2VxdWVuY2VEaWFncmFtCiAgICBwYXJ0aWNpcGFu-2f0579a6.png b/content/posts/2026/07/17/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/c2VxdWVuY2VEaWFncmFtCiAgICBwYXJ0aWNpcGFu-2f0579a6.png new file mode 100644 index 000000000..6a1206196 Binary files /dev/null and b/content/posts/2026/07/17/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/c2VxdWVuY2VEaWFncmFtCiAgICBwYXJ0aWNpcGFu-2f0579a6.png differ diff --git a/content/posts/2026/07/17/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/eHljaGFydC1iZXRhCiAgICB0aXRsZSAiRmluYWwg-5d1f6706.png b/content/posts/2026/07/17/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/eHljaGFydC1iZXRhCiAgICB0aXRsZSAiRmluYWwg-5d1f6706.png new file mode 100644 index 000000000..02cbe9046 Binary files /dev/null and b/content/posts/2026/07/17/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/eHljaGFydC1iZXRhCiAgICB0aXRsZSAiRmluYWwg-5d1f6706.png differ diff --git a/content/posts/2026/07/17/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/eHljaGFydC1iZXRhCiAgICB0aXRsZSAiUGVhayBt-8114ea7e.png b/content/posts/2026/07/17/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/eHljaGFydC1iZXRhCiAgICB0aXRsZSAiUGVhayBt-8114ea7e.png new file mode 100644 index 000000000..fe6ddc2fb Binary files /dev/null and b/content/posts/2026/07/17/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/eHljaGFydC1iZXRhCiAgICB0aXRsZSAiUGVhayBt-8114ea7e.png differ diff --git a/content/posts/2026/07/17/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/index.md b/content/posts/2026/07/17/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/index.md index 9d72653d1..6b08fba1e 100644 --- a/content/posts/2026/07/17/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/index.md +++ b/content/posts/2026/07/17/how-we-beat-hotspot-performance-by-cheating-but-not-like-that/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![How We Beat HotSpot Performance (By Cheating, But Not Like That)](https://www.codenameone.com/blog/beating-hotspot-performance.jpg) +![How We Beat HotSpot Performance (By Cheating, But Not Like That)](beating-hotspot-performance.jpg) No, we didn't cheat in the benchmark. At least I hope we didn't. Every optimization in this story was gated on bit identical output checksums against HotSpot, and the harness refuses to print a ratio when a checksum differs. If anything, this post is about how good HotSpot actually is. We tilted the table in our favor in every way we could, we hand tuned C code, and we still only beat it on some benchmarks. Getting there was a genuine struggle. If you want to understand the nuts and bolts of what your Java code costs, and the tradeoffs each runtime picks, I hope this is a good read. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -70,7 +70,7 @@ Geomean 1.00x. Below 1.0 means we beat warmed HotSpot C2. Same Java source, same One methodology note before you ask: the comparison runs on macOS because HotSpot doesn't run on iOS. The same generated C ships to every Apple target, so the codegen wins carry over to devices where the JIT can't follow. -![Diagram](https://mermaid.ink/img/eHljaGFydC1iZXRhCiAgICB0aXRsZSAiRmluYWwgdGltZSByYXRpbyB2cyB3YXJtZWQgSmF2YSAyNSIKICAgIHgtYXhpcyBbc3RyaW5nQiwgYXJyU2VxLCBxc29ydCwgaGFzaE1hcCwgbWF0aFQsIGFyclJhbmQsIGludEEsIGxvbmdBLCBvYmpBbGxvYywgcmVjdXJzZV0KICAgIHktYXhpcyAiUGFycGFyVk0gdGltZSAvIEhvdFNwb3QgdGltZSIgMCAtLT4gMS44CiAgICBiYXIgWzAuNjcsIDAuODIsIDAuOTIsIDAuOTUsIDAuOTYsIDAuOTYsIDEuMDcsIDEuMTIsIDEuMTksIDEuNl0=?type=png&bgColor=ffffff) +![Diagram](eHljaGFydC1iZXRhCiAgICB0aXRsZSAiRmluYWwg-5d1f6706.png) Lower is better and 1.0 is HotSpot; everything left of intArithmetic finishes ahead of it. The starting ratios wouldn't fit on this chart. hashMapChurn began at 36. @@ -84,7 +84,7 @@ Speed is only half the report, and for client apps it's the less important half. | Memory floor (no-op app) | 2.2 MB | 2.4 MB | \~40 MB | | Peak memory (allocation churn) | 1.4 to 2.1 GB | **290 to 390 MB** | 508 MB | -![Diagram](https://mermaid.ink/img/eHljaGFydC1iZXRhCiAgICB0aXRsZSAiUGVhayBtZW1vcnkgdW5kZXIgYWxsb2NhdGlvbiBjaHVybiAoTUIpIgogICAgeC1heGlzIFsibWFzdGVyICh0cmlnZ2VyIGJ1ZykiLCAidGhpcyBQUiIsICJKYXZhIDI1Il0KICAgIHktYXhpcyAiTUIiIDAgLS0-IDIyMDAKICAgIGJhciBbMjEwMCwgMzkwLCA1MDhd?type=png&bgColor=ffffff) +![Diagram](eHljaGFydC1iZXRhCiAgICB0aXRsZSAiUGVhayBt-8114ea7e.png) Master's gigabyte peaks were a real GC bug this work exposed: the allocated-since-last-collection counter was a 32-bit int counting bytes. Workloads that allocate gigabytes per cycle wrapped it negative, the "am I allocating fast?" check answered no, and the collector slept through the storm while dead pages piled up. With the trigger fixed, heavy churn peaks *below* the JVM on the same workload, and the idle floor stays where a phone wants it: 2.4 MB. Sit with that pair for a second, because it's the whole thesis of this VM. Trading blows with warmed HotSpot on speed while holding a 2.4 MB floor against its \~40 MB. @@ -199,7 +199,7 @@ This is where the two philosophies meet in the middle. We borrowed the part of H ParparVM's GC never stops the world. Your app's threads keep running while a background collector thread walks the object graph and marks everything reachable, then sweeps what wasn't marked. The threads cooperate: each thread either checks in at safe points, or the collector briefly interrupts it with a signal, captures its registers and stack for scanning, and lets it continue. -![Diagram](https://mermaid.ink/img/c2VxdWVuY2VEaWFncmFtCiAgICBwYXJ0aWNpcGFudCBVSSBhcyBBcHAgdGhyZWFkIChFRFQpCiAgICBwYXJ0aWNpcGFudCBHQyBhcyBDb2xsZWN0b3IgdGhyZWFkCiAgICBVSS0-PlVJOiBhbGxvY2F0ZSwgcmVuZGVyLCByZXNwb25kCiAgICBHQy0-PkdDOiBtYXJrIHJlYWNoYWJsZSBvYmplY3RzIChjb25jdXJyZW50KQogICAgR0MtLT4-VUk6IGJyaWVmIHNpZ25hbDogc25hcHNob3QgcmVnaXN0ZXJzICsgc3RhY2sKICAgIFVJLT4-VUk6IGtlZXBzIHJ1bm5pbmcKICAgIEdDLT4-R0M6IHN3ZWVwIHVubWFya2VkIG9iamVjdHMKICAgIE5vdGUgb3ZlciBVSSxHQzogbm8gc3RvcC10aGUtd29ybGQgcGF1c2UsIG5vIGZyYW1lIGRyb3A=?type=png&bgColor=ffffff) +![Diagram](c2VxdWVuY2VEaWFncmFtCiAgICBwYXJ0aWNpcGFu-2f0579a6.png) Why build it this way? Because on a client, pause time is the only GC metric users can feel. A 30ms collection pause during a scroll animation is two dropped frames, and users see it. A concurrent collector trades throughput for the guarantee that the animation never stutters. diff --git a/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/Image-2-1-scaled-cb60d7ab.png b/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/Image-2-1-scaled-cb60d7ab.png new file mode 100644 index 000000000..9af9a9677 Binary files /dev/null and b/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/Image-2-1-scaled-cb60d7ab.png differ diff --git a/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/Image-3-1-scaled-673d3369.png b/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/Image-3-1-scaled-673d3369.png new file mode 100644 index 000000000..8ecf2cf54 Binary files /dev/null and b/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/Image-3-1-scaled-673d3369.png differ diff --git a/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/Image-4-2-scaled-7a48318f.png b/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/Image-4-2-scaled-7a48318f.png new file mode 100644 index 000000000..2c734fa75 Binary files /dev/null and b/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/Image-4-2-scaled-7a48318f.png differ diff --git a/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/Image-5-1-scaled-5df6c3ed.jpg b/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/Image-5-1-scaled-5df6c3ed.jpg new file mode 100644 index 000000000..1a9f80cf0 Binary files /dev/null and b/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/Image-5-1-scaled-5df6c3ed.jpg differ diff --git a/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/index.md b/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/index.md index b154a9aa8..9d221b019 100644 --- a/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/index.md +++ b/content/posts/2026/07/17/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify/index.md @@ -35,7 +35,7 @@ Due to the JIT compilation, Java Virtual Machines, and thus Java applications, d ###### **Diagram #1: Relationship between application lifecycle, CPU spend by the JIT compiler, and performance** -![](https://azul.imgix.net/wp-content/uploads/Image-2-1-scaled.png?auto=format&crop=faces,entropy&fit=max&q=80&w=739&s=3894c42765e21a1cc44c4d8df8c979a5) +![](Image-2-1-scaled-cb60d7ab.png) Warm-up happens every time the application is newly started. In the modern Kubernetes world, this is more than common – horizontal autoscaling, spawning new instances and stopping the unnecessary ones dynamically based on load, has become the new standard of running things cost efficiently. @@ -47,7 +47,7 @@ The right model is simple and intuitive: **allocate more CPU during warm-up, the ###### **Diagram #2: Warm-up phase vs steady state** -![](https://azul.imgix.net/wp-content/uploads/Image-3-1-scaled.png?auto=format&crop=faces,entropy&fit=max&q=80&w=739&s=d624f67d80430309f25ce340c3f5151f) +![](Image-3-1-scaled-673d3369.png) Azul Zing, the JVM at the heart of Azul Prime, is the first JVM on the market to integrate directly with Kedify, making this kind of lifecycle-aware right-sizing seamless and trivial to use. > **What is Azul Prime?** @@ -199,7 +199,7 @@ kubectl get po -lapp=heavy-workload \ ###### **Diagram #3: Resource transition timeline** -![](https://azul.imgix.net/wp-content/uploads/Image-4-2-scaled.png?auto=format&crop=faces,entropy&fit=max&q=80&w=739&s=07e91025e7e8553103fdb5a66db5fd4e) +![](Image-4-2-scaled-7a48318f.png) ## Metrics: What This Achieves @@ -242,7 +242,7 @@ In practice, the flow looks like this: 3. Shrink resources after warm-up to avoid long lived overprovisioning . 4. Run the real workload efficiently across multiple optimized replicas. -![](https://azul.imgix.net/wp-content/uploads/Image-5-1-scaled.png?auto=format&crop=faces,entropy&fit=max&q=80&w=739&s=5202a8c01a0ddbd87a0da47a64ef6a14) +![](Image-5-1-scaled-5df6c3ed.jpg) ## Try It Yourself diff --git a/content/posts/2026/07/20/first-test-of-java-on-banana-pi-arm-and-risc-v-plus-a-blinking-led-with-pi4j/index.md b/content/posts/2026/07/20/first-test-of-java-on-banana-pi-arm-and-risc-v-plus-a-blinking-led-with-pi4j/index.md index d58085fc7..c54e33646 100644 --- a/content/posts/2026/07/20/first-test-of-java-on-banana-pi-arm-and-risc-v-plus-a-blinking-led-with-pi4j/index.md +++ b/content/posts/2026/07/20/first-test-of-java-on-banana-pi-arm-and-risc-v-plus-a-blinking-led-with-pi4j/index.md @@ -253,7 +253,7 @@ The Banana Pi BPI-F3 boots in desktop mode! So that's a lot nicer for a first te ## Benchmark Results To have a fair comparison in the benchmarks, I also ran one on a Raspberry Pi Zero 2 as this is the closest competitor to the Banana Pi BPI-M4 Zero. The full results are available on the [SBC Java benchmark page](https://webtechie.be/sbc/), where you can compare them with the other boards I tested before. -![](sbc-benchmarks-bananapi-1024x526.png) +![](sbc-benchmarks-bananapi-1024x526.jpg) Some highlights: diff --git a/content/posts/2026/07/20/first-test-of-java-on-banana-pi-arm-and-risc-v-plus-a-blinking-led-with-pi4j/sbc-benchmarks-bananapi-1024x526.jpg b/content/posts/2026/07/20/first-test-of-java-on-banana-pi-arm-and-risc-v-plus-a-blinking-led-with-pi4j/sbc-benchmarks-bananapi-1024x526.jpg new file mode 100644 index 000000000..2d93cd8c8 Binary files /dev/null and b/content/posts/2026/07/20/first-test-of-java-on-banana-pi-arm-and-risc-v-plus-a-blinking-led-with-pi4j/sbc-benchmarks-bananapi-1024x526.jpg differ diff --git a/content/posts/2026/07/20/first-test-of-java-on-banana-pi-arm-and-risc-v-plus-a-blinking-led-with-pi4j/sbc-benchmarks-bananapi-1024x526.png b/content/posts/2026/07/20/first-test-of-java-on-banana-pi-arm-and-risc-v-plus-a-blinking-led-with-pi4j/sbc-benchmarks-bananapi-1024x526.png deleted file mode 100644 index a4cb4c4ea..000000000 Binary files a/content/posts/2026/07/20/first-test-of-java-on-banana-pi-arm-and-risc-v-plus-a-blinking-led-with-pi4j/sbc-benchmarks-bananapi-1024x526.png and /dev/null differ diff --git a/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/Zmxvd2NoYXJ0IExSCiAgICBBWyJVSUtpdCByZWZl-e897f042.png b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/Zmxvd2NoYXJ0IExSCiAgICBBWyJVSUtpdCByZWZl-e897f042.png new file mode 100644 index 000000000..dbaec479d Binary files /dev/null and b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/Zmxvd2NoYXJ0IExSCiAgICBBWyJVSUtpdCByZWZl-e897f042.png differ diff --git a/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/android-fab-before-after-76f98939.jpg b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/android-fab-before-after-76f98939.jpg new file mode 100644 index 000000000..3a5bceb70 Binary files /dev/null and b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/android-fab-before-after-76f98939.jpg differ diff --git a/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/android-native-vs-cn1-fae81fe5.jpg b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/android-native-vs-cn1-fae81fe5.jpg new file mode 100644 index 000000000..594a234b5 Binary files /dev/null and b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/android-native-vs-cn1-fae81fe5.jpg differ diff --git a/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/index.md b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/index.md index 916281c9d..f87136844 100644 --- a/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/index.md +++ b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![Own Your Pixels: Native Fidelity on Your Schedule](https://www.codenameone.com/blog/pixel-perfect-is-a-test.jpg) +![Own Your Pixels: Native Fidelity on Your Schedule](pixel-perfect-is-a-test.jpg) An iOS or Android update can change a screen you shipped without you changing a line of code. If your app builds its UI from UIKit, SwiftUI, Compose, or Material widgets, Apple or Google owns those widget implementations. Codename One does something different. It statically links our lightweight component implementation into your native app. The UI you test is the UI your users keep after the next OS update. An update can still break a platform API or permission contract, but it cannot swap our button implementation for a new one. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -37,11 +37,11 @@ We introduced the [iOS Modern and Android Material 3 themes](https://www.codenam This is the Android floating action button before and after the fidelity pass. The older render is on the left. The current Material 3 render is on the right. -![Android Material 3 floating action button before and after the fidelity pass](https://www.codenameone.com/blog/pixel-perfect-is-a-test/android-fab-before-after.jpg) +![Android Material 3 floating action button before and after the fidelity pass](android-fab-before-after-76f98939.jpg) The iOS theme changed just as visibly. Buttons became full capsules, state glyphs moved to SF Symbols, and the sizes and spacing moved toward the iOS 26 references. The May render is on the left and the current render is on the right. -![iOS Modern light theme before and after the fidelity pass](https://www.codenameone.com/blog/pixel-perfect-is-a-test/ios-showcase-before-after.jpg) +![iOS Modern light theme before and after the fidelity pass](ios-showcase-before-after-d142855c.jpg) Why is the floating action button still circular on iOS? iOS has no native floating action button equivalent. Importing Material's rounded rectangle into the iOS theme would make it less native, not more. Android follows Material 3. iOS keeps the established circular accent action until there is an iOS component we can target. @@ -64,7 +64,7 @@ scripts/fidelity-app/goldens/ CI never invents the native side. It renders the Codename One component under the matching theme, compares it with the committed native image, and reports both visual and geometric differences. A one-way gate fails if a score drops below its recorded baseline. -![Diagram](https://mermaid.ink/img/Zmxvd2NoYXJ0IExSCiAgICBBWyJVSUtpdCByZWZlcmVuY2UgYXBwPGJyLz5pT1MgMjYgc2ltdWxhdG9yIl0gLS0-IEJbIlZlcnNpb25lZCBuYXRpdmUgZ29sZGVucyJdCiAgICBDWyJNYXRlcmlhbCByZWZlcmVuY2UgYXBwPGJyLz5BUEkgMzYgZW11bGF0b3IiXSAtLT4gQgogICAgRFsiQ29kZW5hbWUgT25lIGZpZGVsaXR5IGFwcDxici8-cmVuZGVyZWQgaW4gQ0kiXSAtLT4gRVsiUGl4ZWwgY29tcGFyaXNvbiJdCiAgICBCIC0tPiBFCiAgICBFIC0tPiBGWyJWaXN1YWwgc2NvcmUiXQogICAgRSAtLT4gR1siR2VvbWV0cnkgbWV0cmljcyJdCiAgICBFIC0tPiBIWyJGaXhlZCBhbmltYXRpb24gZnJhbWVzIl0KICAgIEYgLS0-IElbIk9uZS13YXkgYmFzZWxpbmUgZ2F0ZSJdCiAgICBHIC0tPiBJCiAgICBIIC0tPiBJ?type=png&bgColor=ffffff) +![Diagram](Zmxvd2NoYXJ0IExSCiAgICBBWyJVSUtpdCByZWZl-e897f042.png) The iOS golden set is pinned to iOS 26. The Android set is pinned to Material 3 on API 36 at 160dpi. When iOS 27 arrives, we will capture a new `ios-27` set, add a theme variant and a CI matrix row, then test both generations until we deliberately retire the older one. We will not silently replace the iOS 26 answer sheet and call the movement an improvement. @@ -80,11 +80,11 @@ We changed the suite in response. It now reports bounding-box offsets, width and Here are four current iOS pairs from the automated report. Native is on the left. Codename One is on the right, separated by the thin vertical line. The dark picker makes the limitation obvious: the selected row is close, but the off-row contrast still needs work. -![Native iOS controls beside Codename One iOS Modern controls](https://www.codenameone.com/blog/pixel-perfect-is-a-test/ios-native-vs-cn1.jpg) +![Native iOS controls beside Codename One iOS Modern controls](ios-native-vs-cn1-fa46af54.jpg) The Android report uses the same layout and divider. The floating action button now has Material 3 geometry, while the tab typography and outlined button still show smaller differences that the baseline tracks. -![Native Material 3 controls beside Codename One Android Material controls](https://www.codenameone.com/blog/pixel-perfect-is-a-test/android-native-vs-cn1.jpg) +![Native Material 3 controls beside Codename One Android Material controls](android-native-vs-cn1-fae81fe5.jpg) The suite deliberately stops at the component boundary. Screen spacing, hierarchy, and composition are application design decisions whether you use SwiftUI, Compose, or Codename One. The themes should provide sensible defaults that work across devices. The final layout still belongs to the developer building the product. @@ -94,11 +94,11 @@ The iOS 26 tab selection is not a tinted pill sliding under icons. During a touc This animation compares the native references with Codename One. The top row is light appearance and the bottom row is dark. Native is on the left. Codename One is on the right. -![Native and Codename One iOS 26 tab lens animations in light and dark appearance](https://www.codenameone.com/blog/pixel-perfect-is-a-test/tab-morph-native-vs-cn1.gif) +![Native and Codename One iOS 26 tab lens animations in light and dark appearance](tab-morph-native-vs-cn1-2a1e9218.webp) The static comparison below freezes the useful stages so you can inspect the geometry. -![Fixed stages of the iOS 26 native and Codename One tab selection morph](https://www.codenameone.com/blog/pixel-perfect-is-a-test/tab-morph-fidelity.png) +![Fixed stages of the iOS 26 native and Codename One tab selection morph](tab-morph-fidelity-42bc8afc.jpg) The first native recording sent us in the wrong direction. We changed `selectedIndex` automatically and captured a flat platter sliding across the bar. That is what UIKit shows for a programmatic selection. The full Liquid Glass lens only appears after a real touch. We eventually caught the difference and built a small XCUITest driver that taps the actual tab bar while the simulator records it. The animation above comes from that touch-driven reference. diff --git a/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/ios-native-vs-cn1-fa46af54.jpg b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/ios-native-vs-cn1-fa46af54.jpg new file mode 100644 index 000000000..82883bf9f Binary files /dev/null and b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/ios-native-vs-cn1-fa46af54.jpg differ diff --git a/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/ios-showcase-before-after-d142855c.jpg b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/ios-showcase-before-after-d142855c.jpg new file mode 100644 index 000000000..a6b96ce6b Binary files /dev/null and b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/ios-showcase-before-after-d142855c.jpg differ diff --git a/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/tab-morph-fidelity-42bc8afc.jpg b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/tab-morph-fidelity-42bc8afc.jpg new file mode 100644 index 000000000..468dbce7f Binary files /dev/null and b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/tab-morph-fidelity-42bc8afc.jpg differ diff --git a/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/tab-morph-native-vs-cn1-2a1e9218.webp b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/tab-morph-native-vs-cn1-2a1e9218.webp new file mode 100644 index 000000000..3f4a6c370 Binary files /dev/null and b/content/posts/2026/07/24/own-your-pixels-native-fidelity-on-your-schedule/tab-morph-native-vs-cn1-2a1e9218.webp differ diff --git a/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/index.md b/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/index.md index 94eae3ef7..d39892d72 100644 --- a/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/index.md +++ b/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/index.md @@ -5,7 +5,7 @@ description: "I'm building MelodyMatrix with my son, an application to look at a canonical: "https://webtechie.be/post/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/" authors: - "frankdelporte" -image: "screenshot-melodymatrix.png" +image: "screenshot-melodymatrix.jpg" categories: - "JavaFX" - "Release Notes" @@ -18,7 +18,7 @@ frozen: false --- I'm building [MelodyMatrix](https://melodymatrix.rocks/) with my son, an application to look at and play along with music. The app already shows a song in different views: falling blocks, chords, guitar views, and many more. Now we want a Learn section, a view that helps someone practice piano by following the actual sheet music while it plays. -![](screenshot-melodymatrix-1024x641.png) +![](screenshot-melodymatrix-1024x641.jpg) A static PDF of the sheet doesn't work for that. Great PDF viewer components exist for JavaFX, but a PDF has no connection to what's playing. Nothing highlights the current note, nothing marks the current position in the song. I looked for a JavaFX library that renders sheet music and lets code interact with it: jump to a position, highlight a note, follow playback. I couldn't find one, so I built it. @@ -35,7 +35,7 @@ To be clear, this isn't vibe coding. I define the tasks, describe what I want to Sheetmusic4J reads [MusicXML](https://www.w3.org/2021/06/musicxml40/), an open standard for representing sheet music. MIDI stores notes and timing, MusicXML stores a lot more: how a piece is structured, how it should look on the page, lyrics under a melody line for a song with a singer. MusicXML also ships an official set of example files, and I use those to compare what Sheetmusic4J renders against the reference PDF for each file. Notation itself follows the [SMuFL](https://www.smufl.org/) standard for music fonts. Sheetmusic4J currently renders with the Bravura font. I haven't wired up font swapping yet, that's still on the list, but SMuFL makes it possible to support other notation fonts later. -![](notation-elements-annotated-1024x447.png) +![](notation-elements-annotated-1024x447.jpg) The image above comes straight from the library and maps MusicXML terms to the class names in the Java model and to the layout terms used internally. I'm not a musician, despite years at music school long ago, so I built this reference for myself first. It also gives anyone reporting an issue a shared vocabulary to point at the exact element that's wrong. Check the [NOTATION_ELEMENTS.md file on GitHub](https://github.com/sheetmusic4j/sheetmusic4j/blob/main/docs/NOTATION_ELEMENTS.md) for more info and a table showing the link between MusicXML elements and how they are used in the library code. @@ -50,7 +50,7 @@ Everything lives in the [sheetmusic4j](https://github.com/sheetmusic4j) organiza * **FX Viewer**: the JavaFX component applications use to show a sheet, including a full-page sheet view and a horizontal strip view. * **Demo**: a test application for the other three modules. -![](screenshot-demo-app-1024x544.png) +![](screenshot-demo-app-1024x544.jpg) The demo app renders the same MusicXML file two ways side by side: a static PDF (using [Derek Lemmerman's PDF viewer component](https://github.com/dlsc-software-consulting-gmbh/PDFViewFX)) next to the Sheetmusic4J FX Viewer. The PDF stays fixed to its page size. The FX Viewer reflows the layout as the window resizes, which occasionally shifts a line differently than the PDF does. The demo also includes tools to simulate playback and highlight notes, without any sound, purely to test the visual sync. A diff tab compares the FX Viewer output pixel by pixel against the reference PDF. It surfaces real differences, though I'm still figuring out how useful that comparison is given that a static PDF and an interactive viewer solve different problems. diff --git a/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/notation-elements-annotated-1024x447.jpg b/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/notation-elements-annotated-1024x447.jpg new file mode 100644 index 000000000..c33298a8f Binary files /dev/null and b/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/notation-elements-annotated-1024x447.jpg differ diff --git a/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/notation-elements-annotated-1024x447.png b/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/notation-elements-annotated-1024x447.png deleted file mode 100644 index a46c1e593..000000000 Binary files a/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/notation-elements-annotated-1024x447.png and /dev/null differ diff --git a/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-demo-app-1024x544.jpg b/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-demo-app-1024x544.jpg new file mode 100644 index 000000000..44faecfb1 Binary files /dev/null and b/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-demo-app-1024x544.jpg differ diff --git a/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-demo-app-1024x544.png b/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-demo-app-1024x544.png deleted file mode 100644 index fb6123d68..000000000 Binary files a/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-demo-app-1024x544.png and /dev/null differ diff --git a/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-melodymatrix-1024x641.jpg b/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-melodymatrix-1024x641.jpg new file mode 100644 index 000000000..2a81c6cb9 Binary files /dev/null and b/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-melodymatrix-1024x641.jpg differ diff --git a/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-melodymatrix-1024x641.png b/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-melodymatrix-1024x641.png deleted file mode 100644 index 6ca1338cc..000000000 Binary files a/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-melodymatrix-1024x641.png and /dev/null differ diff --git a/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-melodymatrix.jpg b/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-melodymatrix.jpg new file mode 100644 index 000000000..0628f6a14 Binary files /dev/null and b/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-melodymatrix.jpg differ diff --git a/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-melodymatrix.png b/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-melodymatrix.png deleted file mode 100644 index 7c4ad082d..000000000 Binary files a/content/posts/2026/07/30/introducing-sheetmusic4j-a-javafx-library-to-render-and-interact-with-sheet-music/screenshot-melodymatrix.png and /dev/null differ diff --git a/content/posts/2026/07/31/http-query-method-explained-rfc-10008-ecosystem-adoption-and-a-quarkus-implementation/article-cover-scaled.jpg b/content/posts/2026/07/31/http-query-method-explained-rfc-10008-ecosystem-adoption-and-a-quarkus-implementation/article-cover-scaled.jpg new file mode 100644 index 000000000..43aeacb38 Binary files /dev/null and b/content/posts/2026/07/31/http-query-method-explained-rfc-10008-ecosystem-adoption-and-a-quarkus-implementation/article-cover-scaled.jpg differ diff --git a/content/posts/2026/07/31/http-query-method-explained-rfc-10008-ecosystem-adoption-and-a-quarkus-implementation/article-cover-scaled.png b/content/posts/2026/07/31/http-query-method-explained-rfc-10008-ecosystem-adoption-and-a-quarkus-implementation/article-cover-scaled.png deleted file mode 100644 index 7f8ee6a7b..000000000 Binary files a/content/posts/2026/07/31/http-query-method-explained-rfc-10008-ecosystem-adoption-and-a-quarkus-implementation/article-cover-scaled.png and /dev/null differ diff --git a/content/posts/2026/07/31/http-query-method-explained-rfc-10008-ecosystem-adoption-and-a-quarkus-implementation/index.md b/content/posts/2026/07/31/http-query-method-explained-rfc-10008-ecosystem-adoption-and-a-quarkus-implementation/index.md index dad18224d..b872671c1 100644 --- a/content/posts/2026/07/31/http-query-method-explained-rfc-10008-ecosystem-adoption-and-a-quarkus-implementation/index.md +++ b/content/posts/2026/07/31/http-query-method-explained-rfc-10008-ecosystem-adoption-and-a-quarkus-implementation/index.md @@ -4,7 +4,7 @@ date: "2026-07-31T08:00:37+00:00" description: "When you build a search API, you usually start with HTTP GET, the natural choice for a read operation: it is safe, idempotent, and cacheable. Then the…" authors: - "huseyin-akdogan" -image: "article-cover-scaled.png" +image: "article-cover-scaled.jpg" categories: - "Jakarta EE" - "Java" diff --git a/content/posts/2026/07/31/javafx-links-of-july-2026/index.md b/content/posts/2026/07/31/javafx-links-of-july-2026/index.md index 5b2b9a9f5..67f36eef9 100644 --- a/content/posts/2026/07/31/javafx-links-of-july-2026/index.md +++ b/content/posts/2026/07/31/javafx-links-of-july-2026/index.md @@ -5,7 +5,7 @@ description: "Here are the JavaFX LinksOfTheMonth of July 2026. You can find the canonical: "https://webtechie.be/post/javafx-links-of-july-2026/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2026/07/31/javafx-links-of-july-2026/jfxcentral.jpg b/content/posts/2026/07/31/javafx-links-of-july-2026/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2026/07/31/javafx-links-of-july-2026/jfxcentral.jpg differ diff --git a/content/posts/2026/07/31/javafx-links-of-july-2026/jfxcentral.png b/content/posts/2026/07/31/javafx-links-of-july-2026/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2026/07/31/javafx-links-of-july-2026/jfxcentral.png and /dev/null differ diff --git a/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/Zmxvd2NoYXJ0IFRCCiAgICBBWyJDb2RlbmFtZSBP-675893ae.png b/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/Zmxvd2NoYXJ0IFRCCiAgICBBWyJDb2RlbmFtZSBP-675893ae.png new file mode 100644 index 000000000..6e3c99dda Binary files /dev/null and b/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/Zmxvd2NoYXJ0IFRCCiAgICBBWyJDb2RlbmFtZSBP-675893ae.png differ diff --git a/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/bluetooth-simulator-devices-b81d10b9.png b/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/bluetooth-simulator-devices-b81d10b9.png new file mode 100644 index 000000000..73727d66b Binary files /dev/null and b/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/bluetooth-simulator-devices-b81d10b9.png differ diff --git a/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/calendar-is-not-add-event-8cf26a8b.jpg b/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/calendar-is-not-add-event-8cf26a8b.jpg new file mode 100644 index 000000000..370f5f209 Binary files /dev/null and b/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/calendar-is-not-add-event-8cf26a8b.jpg differ diff --git a/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/compact-strings-parparvm-38fc3977.jpg b/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/compact-strings-parparvm-38fc3977.jpg new file mode 100644 index 000000000..c00b93b54 Binary files /dev/null and b/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/compact-strings-parparvm-38fc3977.jpg differ diff --git a/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/editors-overview-26913d1f.png b/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/editors-overview-26913d1f.png new file mode 100644 index 000000000..fd90a2a7d Binary files /dev/null and b/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/editors-overview-26913d1f.png differ diff --git a/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/editors-richtext-9824ae77.png b/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/editors-richtext-9824ae77.png new file mode 100644 index 000000000..489fd376f Binary files /dev/null and b/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/editors-richtext-9824ae77.png differ diff --git a/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/index.md b/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/index.md index 9da6c7acd..8c05726d2 100644 --- a/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/index.md +++ b/content/posts/2026/08/03/the-codename-one-javascript-port-is-now-free-and-open-source/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![The Codename One JavaScript Port Is Now Free and Open Source](https://www.codenameone.com/blog/javascript-free-open-source.jpg) +![The Codename One JavaScript Port Is Now Free and Open Source](javascript-free-open-source.jpg) The Codename One JavaScript port is now open source and available on every plan, including Free. You can also build the JavaScript target locally without a Codename One account. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -95,7 +95,7 @@ javascript.proxy.allowedTargets=https://api.example.com,*.services.example.org Available targets are `jakarta-servlet`, `javax-servlet`, `node`, `php`, `aws-lambda`, `google-cloud-functions`, `cloudflare-workers`, and `none`. Jakarta Servlet is the default. -![Diagram](https://mermaid.ink/img/Zmxvd2NoYXJ0IFRCCiAgICBBWyJDb2RlbmFtZSBPbmUgd2ViIGFwcCByZXF1ZXN0cyAvY24xLWNvcnMtcHJveHkiXSAtLT4gQlsiU2FtZS1vcmlnaW4gcHJveHkgY2hlY2tzIHRoZSBVUkwgc2NoZW1lIGFuZCBhbGxvd2xpc3QiXQogICAgQiAtLT4gQ1siUHJveHkgZm9yd2FyZHMgdGhlIHJlcXVlc3QgdG8gdGhlIGFwcHJvdmVkIHJlbW90ZSBBUEkiXQogICAgQyAtLT4gRFsiUmVtb3RlIEFQSSByZXR1cm5zIHN0YXR1cywgaGVhZGVycywgYW5kIGJvZHkiXQogICAgRCAtLT4gRVsiUHJveHkgcmV0dXJucyBhIGJyb3dzZXItcmVhZGFibGUgcmVzcG9uc2UgdG8gdGhlIGFwcCJd?type=png&bgColor=ffffff) +![Diagram](Zmxvd2NoYXJ0IFRCCiAgICBBWyJDb2RlbmFtZSBP-675893ae.png) Set `javascript.proxy.allowedTargets` before public deployment. An omitted allowlist produces a build warning because an open forwarding proxy is not a safe default for production. You can also point at an existing proxy with `javascript.proxy.url` or disable generation with `javascript.proxy.target=none`. @@ -148,7 +148,7 @@ Thanks, Dave. I needed the bump on the head. > **TL;DR:** `com.codename1.calendar` provides one API for device calendars, Google, Microsoft, CalDAV, and `.ics` files. It includes recurrence, tasks, provider versions, incremental sync, offline mutation queues, and conflict handling. -![Calendar API with local and cloud synchronization](https://www.codenameone.com/blog/calendar-is-not-add-event.jpg) +![Calendar API with local and cloud synchronization](calendar-is-not-add-event-8cf26a8b.jpg) A request to add an event often grows into recurrence, edits from another device, offline changes, and a stale write that could overwrite a newer provider copy. The new API keeps those cases in one model and exposes the operations supported by each source. @@ -167,7 +167,7 @@ The simulator uses an isolated in-memory calendar, so tests never touch the deve > **TL;DR:** The new core Bluetooth API supports every Codename One target, including JavaScript. It covers BLE central and peripheral roles, GATT, L2CAP streams, classic RFCOMM, browser Web Bluetooth, real desktop radios, and a scriptable simulator. -![Bluetooth simulator with a virtual device tree and characteristic editor](https://www.codenameone.com/blog/bluetooth-beyond-ble/bluetooth-simulator-devices.png) +![Bluetooth simulator with a virtual device tree and characteristic editor](bluetooth-simulator-devices-b81d10b9.png) Bluetooth is larger than BLE scanning. A medical sensor might need notifications over GATT. A scanner or printer might use classic RFCOMM. Tests need to reproduce a failed connection or a callback that never arrives. @@ -179,7 +179,7 @@ The API reports capabilities instead of pretending every role works everywhere. > **TL;DR:** `EditField`, `RichTextArea`, and `CodeEditor` can now edit and paint text entirely inside the Codename One component layer. The operating system supplies keyboard and input-method operations without placing a native field over the component. -![Rich text and code editors painted by the lightweight editing engine](https://www.codenameone.com/blog/text-input-without-native-overlay/editors-overview.png) +![Rich text and code editors painted by the lightweight editing engine](editors-overview-26913d1f.png) Codename One traditionally places a native text field over a lightweight field while the user edits. That route remains the default for `TextField` and `TextArea`. It works well for ordinary forms, but it cannot paint syntax colors, inline objects, application-defined masks, or custom selections inside the Codename One surface. @@ -202,7 +202,7 @@ This work also replaces the text-only clipboard assumption. A `ClipboardContent` > **TL;DR:** `RichTextComponent` renders HTML, Markdown, AsciiDoc, RTF, and styled Java runs inside ordinary Codename One layouts. It shares its document model and painter with `RichTextArea` but has no editing session or browser peer. -![Rich text with headings, emphasis, and a list](https://www.codenameone.com/blog/rich-text-without-webview/editors-richtext.png) +![Rich text with headings, emphasis, and a list](editors-richtext-9824ae77.png) A `SpanLabel` gives wrapped text one style. A `BrowserComponent` provides a complete browser. `RichTextComponent` fills the space between them for formatted application content. @@ -221,7 +221,7 @@ The component measures its content inside the Codename One layout. Link handling > **TL;DR:** Strings now store their characters in a `byte[]` when every character fits. Text that needs wider code units continues to use `char[]`. This halves the character storage for common strings without adding a second array pointer to every `String`. -![Compact strings cut character storage in half](https://www.codenameone.com/blog/compact-strings-parparvm.jpg) +![Compact strings cut character storage in half](compact-strings-parparvm-38fc3977.jpg) URLs, JSON keys, class names, numbers, log messages, and much Western European text need one byte per character. ParparVM previously stored all of them in a two-byte `char[]`. diff --git a/content/posts/2026/08/05/jakarta-agentic-ai-hits-its-first-milestone/Screenshot-2026-08-05-at-11.35.28.jpg b/content/posts/2026/08/05/jakarta-agentic-ai-hits-its-first-milestone/Screenshot-2026-08-05-at-11.35.28.jpg new file mode 100644 index 000000000..8b3c92e90 Binary files /dev/null and b/content/posts/2026/08/05/jakarta-agentic-ai-hits-its-first-milestone/Screenshot-2026-08-05-at-11.35.28.jpg differ diff --git a/content/posts/2026/08/05/jakarta-agentic-ai-hits-its-first-milestone/Screenshot-2026-08-05-at-11.35.28.png b/content/posts/2026/08/05/jakarta-agentic-ai-hits-its-first-milestone/Screenshot-2026-08-05-at-11.35.28.png deleted file mode 100644 index a7580bdae..000000000 Binary files a/content/posts/2026/08/05/jakarta-agentic-ai-hits-its-first-milestone/Screenshot-2026-08-05-at-11.35.28.png and /dev/null differ diff --git a/content/posts/2026/08/05/jakarta-agentic-ai-hits-its-first-milestone/index.md b/content/posts/2026/08/05/jakarta-agentic-ai-hits-its-first-milestone/index.md index 93f25c7fb..a4583ca17 100644 --- a/content/posts/2026/08/05/jakarta-agentic-ai-hits-its-first-milestone/index.md +++ b/content/posts/2026/08/05/jakarta-agentic-ai-hits-its-first-milestone/index.md @@ -5,7 +5,7 @@ lastmod: "2026-08-07T08:11:13+00:00" description: "Jakarta Agentic AI hits its first milestone - 1.0.0-M1 is live on Maven Central, with a draft spec defining annotation-driven AI agents for Jakarta EE." authors: - "dominika-tasarz" -image: "Screenshot-2026-08-05-at-11.35.28.png" +image: "Screenshot-2026-08-05-at-11.35.28.jpg" categories: - "AI" - "Jakarta EE" diff --git a/content/posts/2026/08/06/sheetmusic4j-0-0-3-abc-notation-guitar-pro-engraving-improvements/index.md b/content/posts/2026/08/06/sheetmusic4j-0-0-3-abc-notation-guitar-pro-engraving-improvements/index.md index a9eec6a6e..c4fb27078 100644 --- a/content/posts/2026/08/06/sheetmusic4j-0-0-3-abc-notation-guitar-pro-engraving-improvements/index.md +++ b/content/posts/2026/08/06/sheetmusic4j-0-0-3-abc-notation-guitar-pro-engraving-improvements/index.md @@ -4,7 +4,7 @@ date: "2026-08-06T08:26:00+00:00" description: "Last week I introduced Sheetmusic4J, a Java(FX) library to render and interact with sheet music. That first 0.0.1 release was really a question more than…" authors: - "frankdelporte" -image: "stripdemo-0.0.3.png" +image: "stripdemo-0.0.3.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2026/08/06/sheetmusic4j-0-0-3-abc-notation-guitar-pro-engraving-improvements/stripdemo-0.0.3.jpg b/content/posts/2026/08/06/sheetmusic4j-0-0-3-abc-notation-guitar-pro-engraving-improvements/stripdemo-0.0.3.jpg new file mode 100644 index 000000000..c030048d2 Binary files /dev/null and b/content/posts/2026/08/06/sheetmusic4j-0-0-3-abc-notation-guitar-pro-engraving-improvements/stripdemo-0.0.3.jpg differ diff --git a/content/posts/2026/08/06/sheetmusic4j-0-0-3-abc-notation-guitar-pro-engraving-improvements/stripdemo-0.0.3.png b/content/posts/2026/08/06/sheetmusic4j-0-0-3-abc-notation-guitar-pro-engraving-improvements/stripdemo-0.0.3.png deleted file mode 100644 index bdbb0c79a..000000000 Binary files a/content/posts/2026/08/06/sheetmusic4j-0-0-3-abc-notation-guitar-pro-engraving-improvements/stripdemo-0.0.3.png and /dev/null differ diff --git a/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/Zmxvd2NoYXJ0IExSCiAgICBBWyJKdWx5IDMxPGJy-35b61d0b.png b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/Zmxvd2NoYXJ0IExSCiAgICBBWyJKdWx5IDMxPGJy-35b61d0b.png new file mode 100644 index 000000000..932af05fe Binary files /dev/null and b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/Zmxvd2NoYXJ0IExSCiAgICBBWyJKdWx5IDMxPGJy-35b61d0b.png differ diff --git a/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/Zmxvd2NoYXJ0IFRCCiAgICBBWyJQdXNoIFYzIGVu-0037ac81.png b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/Zmxvd2NoYXJ0IFRCCiAgICBBWyJQdXNoIFYzIGVu-0037ac81.png new file mode 100644 index 000000000..b101617b8 Binary files /dev/null and b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/Zmxvd2NoYXJ0IFRCCiAgICBBWyJQdXNoIFYzIGVu-0037ac81.png differ diff --git a/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/index.md b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/index.md index 66a9b6804..7786692a0 100644 --- a/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/index.md +++ b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![Push V3 connects one typed message to phones, widgets, and live surfaces](https://www.codenameone.com/blog/push-v3-new-cloud.jpg) +![Push V3 connects one typed message to phones, widgets, and live surfaces](push-v3-new-cloud.jpg) Push notifications should be application infrastructure, not a pile of expiring certificates and provider-specific JSON. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -116,7 +116,7 @@ A lock-screen notification is only one destination. Widgets, Live Activities, th V3 reserves a typed `surface` object in the same envelope. Native bootstrap code can route a Surface command before the main application UI is running. -![Diagram](https://mermaid.ink/img/Zmxvd2NoYXJ0IFRCCiAgICBBWyJQdXNoIFYzIGVudmVsb3BlIl0gLS0-IEJ7IlBheWxvYWQga2luZCJ9CiAgICBCIC0tPiBDWyJWaXNpYmxlIG5vdGlmaWNhdGlvbiJdCiAgICBCIC0tPiBEWyJBcHBsaWNhdGlvbiBkYXRhIl0KICAgIEIgLS0-IEVbIlN1cmZhY2UgY29tbWFuZCJdCiAgICBFIC0tPiBGWyJXaWRnZXQgdGltZWxpbmUiXQogICAgRSAtLT4gR1siTGl2ZSBBY3Rpdml0eSJdCiAgICBFIC0tPiBIWyJEeW5hbWljIElzbGFuZCBvciBjb21wbGljYXRpb24iXQogICAgQyAtLT4gSVsiUHVzaExpc3RlbmVyIG9uIHRoZSBDb2RlbmFtZSBPbmUgRURUIl0KICAgIEQgLS0-IEk=?type=png&bgColor=ffffff) +![Diagram](Zmxvd2NoYXJ0IFRCCiAgICBBWyJQdXNoIFYzIGVu-0037ac81.png) Consider a delivery application that is not running while the customer waits for a courier. A server push can update its Live Activity and Dynamic Island to say "Driver is 2 minutes away" without launching the main Codename One UI. On a platform without that Surface, the same campaign can deliver a normal notification instead. @@ -128,7 +128,7 @@ The old arrangement often made an application team generate a push certificate, The new console stores provider credentials for each application and environment. APNs can use a `.p8` signing key, which does not have the annual expiry cycle of the old certificate workflow. The push service signs provider requests and isolates credentials from campaign users. -![Push application settings and provider credentials](https://www.codenameone.com/blog/push-v3-new-cloud/push-v3-console-settings.png) +![Push application settings and provider credentials](push-v3-console-settings-e8f17dbe.jpg) Credentials are encrypted at rest and treated as write-only secrets in the console. Reading application settings does not return the secret value. This removes certificate hosting from your application server, but it does not remove normal secret hygiene: use a narrowly scoped provider key, rotate it when a team member or system boundary changes, and separate production from development. @@ -136,11 +136,11 @@ Credentials are encrypted at rest and treated as write-only secrets in the conso The console separates applications, environments, subscriptions, audiences, messages, campaigns, and analytics. -![Push applications, environments, and operational state in the console](https://www.codenameone.com/blog/push-v3-new-cloud/push-v3-console-overview.png) +![Push applications, environments, and operational state in the console](push-v3-console-overview-f324f117.jpg) A device can register its provider token through the public client endpoint. It cannot declare an external user identity or attach arbitrary tags to itself. Those operations require the authenticated server API. Otherwise a modified client could simply label itself `premium`, `administrator`, or `patient-high-risk` and enter a segment it did not belong in. -![A saved push audience built from server-assigned subscription data](https://www.codenameone.com/blog/push-v3-new-cloud/push-v3-console-audience.png) +![A saved push audience built from server-assigned subscription data](push-v3-console-audience-d68e4312.jpg) Saved segments are evaluated on the server against application-scoped subscription data. A segment might select a locale, application version, platform, or a tag assigned by your backend. The audience is resolved when the message is sent, so a corrected tag does not require rebuilding a static mailing list. @@ -152,7 +152,7 @@ Never place a password, access token, medical result, or other secret in a notif The new message view exposes queued, accepted, failed, and dead targets, including provider error information. -![Per-message push state and provider outcomes](https://www.codenameone.com/blog/push-v3-new-cloud/push-v3-console-messages.png) +![Per-message push state and provider outcomes](push-v3-console-messages-bebe3b33.jpg) This makes several operational checks possible: @@ -185,13 +185,13 @@ We have also merged [phase one of a move from Maven Central to a Codename One re Maven Central has every right to set commercial usage limits and charge for infrastructure. Codename One also has a workload that is difficult to fit inside those limits. One release currently publishes enough duplicated fat-jar content that our dashboard reports 2.12 GB against an 80 MB storage guideline, 19,962 files against 1,000, and 27 releases against 7. -![Maven Central publishing usage shows Codename One far beyond the soft guidelines](https://www.codenameone.com/blog/maven-central-cloudflare-r2/maven-central-limit.png) +![Maven Central publishing usage shows Codename One far beyond the soft guidelines](maven-central-limit-2270580b.jpg) Those limits are soft guidelines, and the dashboard offers both open-source adjustments and a commercial plan. We are not leaving because Sonatype is doing something wrong. We are leaving because our weekly, multi-platform release shape is expensive to host there, while we can provide the same Maven layout free to users on infrastructure that fits it better. Phase one reduced a measured release payload from 229.5 MB to 76.9 MB. The release pipeline now copies the signed Central staging tree to R2, so it does not perform a second build with potentially different bytes. -![Diagram](https://mermaid.ink/img/Zmxvd2NoYXJ0IExSCiAgICBBWyJKdWx5IDMxPGJyLz5TaHJpbmsgYW5kIGR1YWwgcHVibGlzaCJdIC0tPiBCWyJBdWd1c3QgNzxici8-R2VuZXJhdGVkIFBPTXMgdXNlIFIyIl0KICAgIEIgLS0-IENbIlRocmVlLXdlZWsgb2JzZXJ2YXRpb24gd2luZG93Il0KICAgIEMgLS0-IERbIkF1Z3VzdCAyODxici8-TmV3IHJlbGVhc2VzIG9uIFIyIG9ubHkiXQogICAgQSAtLT4gRVsiTWF2ZW4gQ2VudHJhbCByZW1haW5zIGF1dGhvcml0YXRpdmUiXQogICAgQiAtLT4gRQogICAgRSAtLT4gRlsiRXhpc3RpbmcgQ2VudHJhbCB2ZXJzaW9ucyByZW1haW4gYXZhaWxhYmxlIl0=?type=png&bgColor=ffffff) +![Diagram](Zmxvd2NoYXJ0IExSCiAgICBBWyJKdWx5IDMxPGJy-35b61d0b.png) Existing projects can prepare for post-cutover versions by adding the repository to both Maven resolution paths: diff --git a/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/maven-central-limit-2270580b.jpg b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/maven-central-limit-2270580b.jpg new file mode 100644 index 000000000..486e2ea63 Binary files /dev/null and b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/maven-central-limit-2270580b.jpg differ diff --git a/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/push-v3-console-audience-d68e4312.jpg b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/push-v3-console-audience-d68e4312.jpg new file mode 100644 index 000000000..5918eecf2 Binary files /dev/null and b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/push-v3-console-audience-d68e4312.jpg differ diff --git a/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/push-v3-console-messages-bebe3b33.jpg b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/push-v3-console-messages-bebe3b33.jpg new file mode 100644 index 000000000..b5f7c4431 Binary files /dev/null and b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/push-v3-console-messages-bebe3b33.jpg differ diff --git a/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/push-v3-console-overview-f324f117.jpg b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/push-v3-console-overview-f324f117.jpg new file mode 100644 index 000000000..59dbd7b96 Binary files /dev/null and b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/push-v3-console-overview-f324f117.jpg differ diff --git a/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/push-v3-console-settings-e8f17dbe.jpg b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/push-v3-console-settings-e8f17dbe.jpg new file mode 100644 index 000000000..3a0ddb911 Binary files /dev/null and b/content/posts/2026/08/07/push-v3-one-message-from-your-server-to-every-surface/push-v3-console-settings-e8f17dbe.jpg differ diff --git a/content/posts/2026/08/13/build-secure-ai-chat-applications-with-boxlang-rag-ollama-and-amazon-bedrock-with-dan-card/dancardWorkshop-700x394.jpg b/content/posts/2026/08/13/build-secure-ai-chat-applications-with-boxlang-rag-ollama-and-amazon-bedrock-with-dan-card/dancardWorkshop-700x394.jpg new file mode 100644 index 000000000..b78198b9b Binary files /dev/null and b/content/posts/2026/08/13/build-secure-ai-chat-applications-with-boxlang-rag-ollama-and-amazon-bedrock-with-dan-card/dancardWorkshop-700x394.jpg differ diff --git a/content/posts/2026/08/13/build-secure-ai-chat-applications-with-boxlang-rag-ollama-and-amazon-bedrock-with-dan-card/dancardWorkshop-700x394.png b/content/posts/2026/08/13/build-secure-ai-chat-applications-with-boxlang-rag-ollama-and-amazon-bedrock-with-dan-card/dancardWorkshop-700x394.png deleted file mode 100644 index 9e39ee460..000000000 Binary files a/content/posts/2026/08/13/build-secure-ai-chat-applications-with-boxlang-rag-ollama-and-amazon-bedrock-with-dan-card/dancardWorkshop-700x394.png and /dev/null differ diff --git a/content/posts/2026/08/13/build-secure-ai-chat-applications-with-boxlang-rag-ollama-and-amazon-bedrock-with-dan-card/index.md b/content/posts/2026/08/13/build-secure-ai-chat-applications-with-boxlang-rag-ollama-and-amazon-bedrock-with-dan-card/index.md index 37fc64a7c..33c7278bd 100644 --- a/content/posts/2026/08/13/build-secure-ai-chat-applications-with-boxlang-rag-ollama-and-amazon-bedrock-with-dan-card/index.md +++ b/content/posts/2026/08/13/build-secure-ai-chat-applications-with-boxlang-rag-ollama-and-amazon-bedrock-with-dan-card/index.md @@ -22,7 +22,7 @@ related_posts: frozen: false --- -![](dancardWorkshop-700x394.png) +![](dancardWorkshop-700x394.jpg) ## Build Secure AI Chat Applications with BoxLang, RAG, Ollama, and Amazon Bedrock diff --git a/content/posts/2026/08/17/idempotent-write-paths-keeping-an-integration-pipeline-correct-when-messages-repeat/A1_sql_entity_id_mapping.jpg b/content/posts/2026/08/17/idempotent-write-paths-keeping-an-integration-pipeline-correct-when-messages-repeat/A1_sql_entity_id_mapping.jpg new file mode 100644 index 000000000..9c07e2ea2 Binary files /dev/null and b/content/posts/2026/08/17/idempotent-write-paths-keeping-an-integration-pipeline-correct-when-messages-repeat/A1_sql_entity_id_mapping.jpg differ diff --git a/content/posts/2026/08/17/idempotent-write-paths-keeping-an-integration-pipeline-correct-when-messages-repeat/A1_sql_entity_id_mapping.png b/content/posts/2026/08/17/idempotent-write-paths-keeping-an-integration-pipeline-correct-when-messages-repeat/A1_sql_entity_id_mapping.png deleted file mode 100644 index d20f8dd4e..000000000 Binary files a/content/posts/2026/08/17/idempotent-write-paths-keeping-an-integration-pipeline-correct-when-messages-repeat/A1_sql_entity_id_mapping.png and /dev/null differ diff --git a/content/posts/2026/08/17/idempotent-write-paths-keeping-an-integration-pipeline-correct-when-messages-repeat/index.md b/content/posts/2026/08/17/idempotent-write-paths-keeping-an-integration-pipeline-correct-when-messages-repeat/index.md index 6d2ce8b90..dba9a0f89 100644 --- a/content/posts/2026/08/17/idempotent-write-paths-keeping-an-integration-pipeline-correct-when-messages-repeat/index.md +++ b/content/posts/2026/08/17/idempotent-write-paths-keeping-an-integration-pipeline-correct-when-messages-repeat/index.md @@ -155,7 +155,7 @@ Merge is the most complex: you combine the old and new data. It suits incrementa Anyone who does integration has probably hit this: different systems have different IDs for the same entity. A customer is CRM-00123 in CRM, becomes ERP-C456 in ERP, and WMS-CUST-789 in WMS, and our platform has its own internal ID on top of that. When an event flows from CRM to ERP, you need to know which record CRM-00123 maps to in ERP. Inside the integration platform we keep an ID mapping table that uses a platform-internal internal_id to string together each system's external_id: -![SQL schema for the entity_id_mapping table plus a cross-system ID lookup query](A1_sql_entity_id_mapping.png) +![SQL schema for the entity_id_mapping table plus a cross-system ID lookup query](A1_sql_entity_id_mapping.jpg) The first thing an event does when it enters the pipeline is look up the mapping table to get the target system's ID. If it's not found (say a create event, where the downstream has no matching record yet), it's marked "to be created", and once the downstream finishes creating it, we write the mapping back. diff --git a/content/posts/2026/08/18/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/Captura-de-pantalla-2026-08-18-160901.jpg b/content/posts/2026/08/18/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/Captura-de-pantalla-2026-08-18-160901.jpg new file mode 100644 index 000000000..e356a5dfe Binary files /dev/null and b/content/posts/2026/08/18/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/Captura-de-pantalla-2026-08-18-160901.jpg differ diff --git a/content/posts/2026/08/18/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/Captura-de-pantalla-2026-08-18-160901.png b/content/posts/2026/08/18/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/Captura-de-pantalla-2026-08-18-160901.png deleted file mode 100644 index a46383f57..000000000 Binary files a/content/posts/2026/08/18/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/Captura-de-pantalla-2026-08-18-160901.png and /dev/null differ diff --git a/content/posts/2026/08/18/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/index.md b/content/posts/2026/08/18/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/index.md index 195c65092..47e811794 100644 --- a/content/posts/2026/08/18/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/index.md +++ b/content/posts/2026/08/18/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/index.md @@ -5,7 +5,7 @@ lastmod: "2026-08-18T14:15:51+00:00" description: "Learning a new AI API usually means jumping between scattered documentation pages, guessing at imports, and copy-pasting code that may or may not still…" authors: - "cristobal-escobar" -image: "Captura-de-pantalla-2026-08-18-160901.png" +image: "Captura-de-pantalla-2026-08-18-160901.jpg" categories: - "AI" - "BoxLang" diff --git a/content/posts/2026/08/22/offline-crypto-address-validation-in-java/Gemini_Generated_Image_wbzqiiwbzqiiwbzq.jpeg b/content/posts/2026/08/22/offline-crypto-address-validation-in-java/Gemini_Generated_Image_wbzqiiwbzqiiwbzq.jpeg index 38dc80f64..3f8b7e21f 100644 Binary files a/content/posts/2026/08/22/offline-crypto-address-validation-in-java/Gemini_Generated_Image_wbzqiiwbzqiiwbzq.jpeg and b/content/posts/2026/08/22/offline-crypto-address-validation-in-java/Gemini_Generated_Image_wbzqiiwbzqiiwbzq.jpeg differ diff --git a/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/Zmxvd2NoYXJ0IExSCiAgICBBW0dlbmVyYXRpb24g-7e691408.png b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/Zmxvd2NoYXJ0IExSCiAgICBBW0dlbmVyYXRpb24g-7e691408.png new file mode 100644 index 000000000..cf04d44bb Binary files /dev/null and b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/Zmxvd2NoYXJ0IExSCiAgICBBW0dlbmVyYXRpb24g-7e691408.png differ diff --git a/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/code-editor-0f058704.png b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/code-editor-0f058704.png new file mode 100644 index 000000000..5adc5f36d Binary files /dev/null and b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/code-editor-0f058704.png differ diff --git a/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/css-editor-4d1725b9.png b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/css-editor-4d1725b9.png new file mode 100644 index 000000000..c81ac0731 Binary files /dev/null and b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/css-editor-4d1725b9.png differ diff --git a/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/guided-layout-drag-b2e2091a.gif b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/guided-layout-drag-b2e2091a.gif new file mode 100644 index 000000000..3335e01be Binary files /dev/null and b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/guided-layout-drag-b2e2091a.gif differ diff --git a/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/index.md b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/index.md index c29545c69..a87aabb1c 100644 --- a/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/index.md +++ b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![A visual editor connecting project forms, CSS, Java source, and a live Codename One canvas](https://www.codenameone.com/blog/third-generation-gui-builder.jpg) +![A visual editor connecting project forms, CSS, Java source, and a live Codename One canvas](third-generation-gui-builder.jpg) We have rebuilt the Codename One GUI Builder again. This is its third generation. The interesting part is not another drag-and-drop surface. It is what we kept, what Maven broke, and why a visual editor must understand the whole project instead of opening one generated form at a time. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -41,11 +41,11 @@ The second generation separated a form into readable `.gui` XML and companion Ja That last assumption became painful after the Maven migration. A Maven project has forms under `src/main/guibuilder`, Java under `src/main/java`, and styling in `src/main/css/theme.css`. Launching a separate editor for every generated form turned navigation into the slow part of a visual tool. -![Diagram](https://mermaid.ink/img/Zmxvd2NoYXJ0IExSCiAgICBBW0dlbmVyYXRpb24gMTxici8-cmVzb3VyY2UgZmlsZSBhbmQgc3RhdGUgbWFjaGluZV0gLS0-IEJbR2VuZXJhdGlvbiAyPGJyLz5vbmUgLmd1aSBmb3JtIGFuZCBndWlkZWQgbGF5b3V0XQogICAgQiAtLT4gQ1tHZW5lcmF0aW9uIDM8YnIvPm9uZSBNYXZlbiBwcm9qZWN0IHdvcmtzcGFjZV0KICAgIEMgLS0-IERbRm9ybXNdCiAgICBDIC0tPiBFW0xpdmUgQ1NTXQogICAgQyAtLT4gRltQcm90ZWN0ZWQgSmF2YSByZWdpb25zXQogICAgQyAtLT4gR1tSZXNwb25zaXZlIGNhbnZhc10=?type=png&bgColor=ffffff) +![Diagram](Zmxvd2NoYXJ0IExSCiAgICBBW0dlbmVyYXRpb24g-7e691408.png) The third generation changes the unit of work from a file to a project. It scans every `.gui` file, keeps them in the left panel, renders the selected form in the center, and shows its properties, layout, and events on the right. -![The third-generation GUI Builder with project forms, component palette, live canvas, and inspector](https://www.codenameone.com/blog/third-generation-gui-builder/workspace.png) +![The third-generation GUI Builder with project forms, component palette, live canvas, and inspector](workspace-c5a48835.png) ## One Maven goal opens the project @@ -81,11 +81,11 @@ Those names matter. A guide stored as an object pointer would disappear after a The canvas adds the relationship while you drag. It can align edges, centers, and text baselines. Resizing can keep a preferred size, fill the parent, stay fixed, or match another component. The same canvas can switch from phone portrait to desktop width, which makes a bad relationship visible before it reaches a device. -![Moving the primary action beside the description updates its guided-layout relationship](https://www.codenameone.com/blog/third-generation-gui-builder/guided-layout-drag.gif) +![Moving the primary action beside the description updates its guided-layout relationship](guided-layout-drag-b2e2091a.gif) The move above is not stored as a new set of absolute coordinates. It changes the relationship between `primary` and `description`, then lets `LayeredLayout` resolve the result for the current canvas. -![The same guided layout switching between phone portrait and desktop canvases](https://www.codenameone.com/blog/third-generation-gui-builder/responsive-canvas.gif) +![The same guided layout switching between phone portrait and desktop canvases](responsive-canvas-4ec97782.gif) ## CSS belongs beside the canvas @@ -93,7 +93,7 @@ The second-generation builder and the old resource editor were separate tools. A Click **CSS** and the project stylesheet opens beside the live form: -![Editing the project CSS beside the live form preview](https://www.codenameone.com/blog/third-generation-gui-builder/css-editor.png) +![Editing the project CSS beside the live form preview](css-editor-4d1725b9.png) The pane edits the real `src/main/css/theme.css`. After the edit debounce, the CSS compiler installs the new theme and rebuilds the preview. A selector change is visible where it matters: @@ -113,7 +113,7 @@ There is no second theme model to keep in sync. The stylesheet that colors the c The **Code** button opens the companion Java source in the same workspace: -![The companion Java source with generated and user-owned regions](https://www.codenameone.com/blog/third-generation-gui-builder/code-editor.png) +![The companion Java source with generated and user-owned regions](code-editor-0f058704.png) Generated code and user code have different ownership: diff --git a/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/responsive-canvas-4ec97782.gif b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/responsive-canvas-4ec97782.gif new file mode 100644 index 000000000..363393a93 Binary files /dev/null and b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/responsive-canvas-4ec97782.gif differ diff --git a/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/third-generation-gui-builder.jpg b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/third-generation-gui-builder.jpg index 4ae5078f1..19d49d441 100644 Binary files a/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/third-generation-gui-builder.jpg and b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/third-generation-gui-builder.jpg differ diff --git a/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/workspace-c5a48835.png b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/workspace-c5a48835.png new file mode 100644 index 000000000..135f7c3d3 Binary files /dev/null and b/content/posts/2026/08/22/the-third-generation-gui-builder-one-workspace-for-every-form/workspace-c5a48835.png differ diff --git a/content/posts/2026/08/24/whats-new-in-the-august-2026-azul-payara-release/Azul-Payara-Community-Release.jpg b/content/posts/2026/08/24/whats-new-in-the-august-2026-azul-payara-release/Azul-Payara-Community-Release.jpg index 8d1b92052..b6b392236 100644 Binary files a/content/posts/2026/08/24/whats-new-in-the-august-2026-azul-payara-release/Azul-Payara-Community-Release.jpg and b/content/posts/2026/08/24/whats-new-in-the-august-2026-azul-payara-release/Azul-Payara-Community-Release.jpg differ diff --git a/content/posts/2026/08/28/app-shield-your-server-should-not-trust-the-app-calling-it/app-shield-server-attestation.jpg b/content/posts/2026/08/28/app-shield-your-server-should-not-trust-the-app-calling-it/app-shield-server-attestation.jpg index b22148981..bc2c59ea8 100644 Binary files a/content/posts/2026/08/28/app-shield-your-server-should-not-trust-the-app-calling-it/app-shield-server-attestation.jpg and b/content/posts/2026/08/28/app-shield-your-server-should-not-trust-the-app-calling-it/app-shield-server-attestation.jpg differ diff --git a/content/posts/2026/08/28/app-shield-your-server-should-not-trust-the-app-calling-it/c2VxdWVuY2VEaWFncmFtCiAgICBwYXJ0aWNpcGFu-fe4dd7bb.png b/content/posts/2026/08/28/app-shield-your-server-should-not-trust-the-app-calling-it/c2VxdWVuY2VEaWFncmFtCiAgICBwYXJ0aWNpcGFu-fe4dd7bb.png new file mode 100644 index 000000000..0443652cf Binary files /dev/null and b/content/posts/2026/08/28/app-shield-your-server-should-not-trust-the-app-calling-it/c2VxdWVuY2VEaWFncmFtCiAgICBwYXJ0aWNpcGFu-fe4dd7bb.png differ diff --git a/content/posts/2026/08/28/app-shield-your-server-should-not-trust-the-app-calling-it/index.md b/content/posts/2026/08/28/app-shield-your-server-should-not-trust-the-app-calling-it/index.md index 7a6f1b673..c999bceda 100644 --- a/content/posts/2026/08/28/app-shield-your-server-should-not-trust-the-app-calling-it/index.md +++ b/content/posts/2026/08/28/app-shield-your-server-should-not-trust-the-app-calling-it/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![A shield between a mobile application and a protected server API](https://www.codenameone.com/blog/app-shield-server-attestation.jpg) +![A shield between a mobile application and a protected server API](app-shield-server-attestation.jpg) Any security check that runs only on a phone can be patched out on that phone. [App Shield](https://github.com/codenameone/CodenameOne/pull/5486) moves the final decision to your server by attaching a short-lived, server-verified attestation token to protected requests. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -54,7 +54,7 @@ The distinction in the last row is the point. A modified app can force a local ` App Shield joins the platform attestation provider, the Codename One verification service, and your backend: -![Diagram](https://mermaid.ink/img/c2VxdWVuY2VEaWFncmFtCiAgICBwYXJ0aWNpcGFudCBBcHAgYXMgQ29kZW5hbWUgT25lIGFwcAogICAgcGFydGljaXBhbnQgU2hpZWxkIGFzIEF0dGVzdGF0aW9uIHNlcnZpY2UKICAgIHBhcnRpY2lwYW50IFBsYXRmb3JtIGFzIEFwcCBBdHRlc3Qgb3IgUGxheSBJbnRlZ3JpdHkKICAgIHBhcnRpY2lwYW50IEFQSSBhcyBZb3VyIGJhY2tlbmQKICAgIEFwcC0-PlNoaWVsZDogUmVxdWVzdCBhIG9uZS10aW1lIGNoYWxsZW5nZQogICAgU2hpZWxkLS0-PkFwcDogTm9uY2UKICAgIEFwcC0-PlBsYXRmb3JtOiBBdHRlc3QgYXBwIGFuZCBkZXZpY2UgYWdhaW5zdCBub25jZQogICAgUGxhdGZvcm0tLT4-QXBwOiBIYXJkd2FyZS1iYWNrZWQgc3RhdGVtZW50CiAgICBBcHAtPj5TaGllbGQ6IFN0YXRlbWVudCBhbmQgcnVudGltZSBzaWduYWxzCiAgICBTaGllbGQtLT4-QXBwOiBTaG9ydC1saXZlZCBFUzI1NiB0b2tlbiBhbmQgcGluIHNldAogICAgQXBwLT4-QVBJOiBSZXF1ZXN0IHdpdGggWC1DTjEtQXR0ZXN0CiAgICBBUEktPj5BUEk6IFZlcmlmeSBzaWduYXR1cmUsIGFwcCwgdmVyZGljdCwgcG9saWN5LCBhbmQgZXhwaXJ5CiAgICBBUEktLT4-QXBwOiBTZXJ2ZSBvciByZWplY3QgdGhlIG9wZXJhdGlvbg==?type=png&bgColor=ffffff) +![Diagram](c2VxdWVuY2VEaWFncmFtCiAgICBwYXJ0aWNpcGFu-fe4dd7bb.png) The nonce prevents a captured platform statement from becoming a permanent replay credential. The token identifies the expected package and platform, carries the policy decision, and can bind to one request body. The service can also include signals for root, jailbreak, hooking frameworks, emulators, debuggers, repackaging, or untrusted accessibility services. diff --git a/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-architecture-poster.jpg b/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-architecture-poster.jpg new file mode 100644 index 000000000..bfefe8515 Binary files /dev/null and b/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-architecture-poster.jpg differ diff --git a/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-architecture-poster.png b/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-architecture-poster.png deleted file mode 100644 index cafdfc983..000000000 Binary files a/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-architecture-poster.png and /dev/null differ diff --git a/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-overview-1.jpg b/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-overview-1.jpg new file mode 100644 index 000000000..d6c9d2273 Binary files /dev/null and b/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-overview-1.jpg differ diff --git a/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-overview-1.png b/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-overview-1.png deleted file mode 100644 index e5b4f71e0..000000000 Binary files a/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-overview-1.png and /dev/null differ diff --git a/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-overview.jpg b/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-overview.jpg new file mode 100644 index 000000000..d6c9d2273 Binary files /dev/null and b/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-overview.jpg differ diff --git a/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-overview.png b/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-overview.png deleted file mode 100644 index e5b4f71e0..000000000 Binary files a/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-overview.png and /dev/null differ diff --git a/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-ssr-flow.jpg b/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-ssr-flow.jpg new file mode 100644 index 000000000..79922cf08 Binary files /dev/null and b/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-ssr-flow.jpg differ diff --git a/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-ssr-flow.png b/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-ssr-flow.png deleted file mode 100644 index c63e7a51c..000000000 Binary files a/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/alifaces-ssr-flow.png and /dev/null differ diff --git a/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/index.md b/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/index.md index 1057ce705..c0e42124b 100644 --- a/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/index.md +++ b/content/posts/2026/08/29/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/index.md @@ -5,7 +5,7 @@ lastmod: "2026-08-31T12:20:55+00:00" description: "A Fully Stateless Jakarta Faces Marketplace with Server-Side Rendering — No HttpSession, No Saved ViewState, No Sticky Sessions (see the poc on: AliFaces…" authors: - "angelo-rubini" -image: "alifaces-overview-1.png" +image: "alifaces-overview-1.jpg" categories: - "Apache Tomcat" - "Arm" @@ -37,7 +37,7 @@ The stack is deliberately mainstream: **Jakarta Faces 4.1, Mojarra 4.1.14, Prime The goal is simple: **any web node should be able to serve the next request, regardless of which node served the previous one.** -[![](alifaces-overview.png)](alifaces-overview.png) +[![](alifaces-overview.jpg)](alifaces-overview.jpg) ## Stateless Faces: an old idea, revisited @@ -80,7 +80,7 @@ This is not a return to an obsolete architecture. Large e-commerce experiences s SSR remains useful for meaningful initial HTML, public content, SEO, reduced mandatory client-side work and caching. Jakarta Faces already starts from the server-rendered side; AliFaces combines it with stateless web nodes, CDN-delivered assets, potential edge caching and selective PrimeFaces Ajax. > **Server-Side Rendering is not the opposite of a modern frontend. It is one of the tools modern frontends use.** -[![](alifaces-ssr-flow.png)](alifaces-ssr-flow.png) +[![](alifaces-ssr-flow.jpg)](alifaces-ssr-flow.jpg) ## Modern UI is independent of the rendering model @@ -110,7 +110,7 @@ One boundary is intentionally visible: with `InMemorySharedStore`, the cart can Replace that adapter with Redis, a database or a data grid and both nodes use shared, persistent and atomic state. Faces pages and application services do not change. -[![](alifaces-architecture-poster.png)](alifaces-architecture-poster.png) +[![](alifaces-architecture-poster.jpg)](alifaces-architecture-poster.jpg) ## Takeaway diff --git a/content/posts/2026/08/29/sqlite-across-every-port-one-contract-one-encrypted-file-format/Zmxvd2NoYXJ0IFRECiAgICBBW0FwcGxpY2F0aW9u-72376f2d.png b/content/posts/2026/08/29/sqlite-across-every-port-one-contract-one-encrypted-file-format/Zmxvd2NoYXJ0IFRECiAgICBBW0FwcGxpY2F0aW9u-72376f2d.png new file mode 100644 index 000000000..d826c1d65 Binary files /dev/null and b/content/posts/2026/08/29/sqlite-across-every-port-one-contract-one-encrypted-file-format/Zmxvd2NoYXJ0IFRECiAgICBBW0FwcGxpY2F0aW9u-72376f2d.png differ diff --git a/content/posts/2026/08/29/sqlite-across-every-port-one-contract-one-encrypted-file-format/index.md b/content/posts/2026/08/29/sqlite-across-every-port-one-contract-one-encrypted-file-format/index.md index 5df7a33a1..5162f7ff7 100644 --- a/content/posts/2026/08/29/sqlite-across-every-port-one-contract-one-encrypted-file-format/index.md +++ b/content/posts/2026/08/29/sqlite-across-every-port-one-contract-one-encrypted-file-format/index.md @@ -16,7 +16,7 @@ related_posts: frozen: false --- -![A locked SQLite database connected to mobile, web, desktop, and watch applications](https://www.codenameone.com/blog/sqlite-portable-encrypted.jpg) +![A locked SQLite database connected to mobile, web, desktop, and watch applications](sqlite-portable-encrypted.jpg) The original `com.codename1.db` implementation delegated SQLite calls to the database supplied by each operating system. We knew this was less portable than the rest of Codename One, but fixing it meant taking ownership of SQLite on every target. That looked like a deep rabbit hole, so we exposed escape hatches instead. The [pluggable SpatiaLite work we described in 2018](https://www.codenameone.com/blog/spatial-pluggable-sqlite/) is one example. | **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at [codenameone.com](https://www.codenameone.com/). @@ -45,7 +45,7 @@ These were not edge cases around a working abstraction. They meant a query teste The new `DatabaseConformanceSuite` defines the contract once. Seven device tests exercise lifecycle, statements, cursors, transactions, encryption, and legacy behavior on every port-status target. The current reports show those tests passing on Android, both iOS renderers, JavaScript, native Linux, native Windows, macOS, tvOS, and watchOS. -![Diagram](https://mermaid.ink/img/Zmxvd2NoYXJ0IFRECiAgICBBW0FwcGxpY2F0aW9uIGNvZGU8YnIvPmNvbS5jb2RlbmFtZTEuZGJdIC0tPiBCW1BvcnRhYmxlIGRhdGFiYXNlIGNvbnRyYWN0XQogICAgQiAtLT4gQ1tBbmRyb2lkPGJyLz5wbGF0Zm9ybSBTUUxpdGUgb3IgU1FMQ2lwaGVyXQogICAgQiAtLT4gRFtpT1MgYW5kIEFwcGxlIHRhcmdldHM8YnIvPnN5c3RlbSBTUUxpdGUgb3IgY2lwaGVyIGVuZ2luZV0KICAgIEIgLS0-IEVbSmF2YVNjcmlwdDxici8-U1FMaXRlIGluIFdlYkFzc2VtYmx5XQogICAgQiAtLT4gRltXaW5kb3dzIGFuZCBMaW51eDxici8-bmF0aXZlIFNRTGl0ZV0KICAgIEIgLS0-IEdbU2ltdWxhdG9yPGJyLz5TUUxpdGUgSkRCQ10KICAgIEhbT25lIGNvbmZvcm1hbmNlIHN1aXRlXSAtLT4gQwogICAgSCAtLT4gRAogICAgSCAtLT4gRQogICAgSCAtLT4gRgogICAgSCAtLT4gRw==?type=png&bgColor=ffffff) +![Diagram](Zmxvd2NoYXJ0IFRECiAgICBBW0FwcGxpY2F0aW9u-72376f2d.png) Cursor navigation now derives from two primitives, `rewind()` and `stepForward()`, instead of being reimplemented on every port. Transactions return to autocommit after either commit or rollback. Blobs and typed parameters behave consistently. Windows and Linux finally open a database instead of returning `null`. diff --git a/content/posts/2026/08/29/sqlite-across-every-port-one-contract-one-encrypted-file-format/sqlite-portable-encrypted.jpg b/content/posts/2026/08/29/sqlite-across-every-port-one-contract-one-encrypted-file-format/sqlite-portable-encrypted.jpg index 530b90d12..7ee0c9e19 100644 Binary files a/content/posts/2026/08/29/sqlite-across-every-port-one-contract-one-encrypted-file-format/sqlite-portable-encrypted.jpg and b/content/posts/2026/08/29/sqlite-across-every-port-one-contract-one-encrypted-file-format/sqlite-portable-encrypted.jpg differ diff --git a/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-11.54.27-1024x504.jpg b/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-11.54.27-1024x504.jpg new file mode 100644 index 000000000..c99eb70c2 Binary files /dev/null and b/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-11.54.27-1024x504.jpg differ diff --git a/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-11.54.27-1024x504.png b/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-11.54.27-1024x504.png deleted file mode 100644 index d4ae733f2..000000000 Binary files a/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-11.54.27-1024x504.png and /dev/null differ diff --git a/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-11.54.48-1024x483.jpg b/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-11.54.48-1024x483.jpg new file mode 100644 index 000000000..c6ff0aced Binary files /dev/null and b/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-11.54.48-1024x483.jpg differ diff --git a/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-11.54.48-1024x483.png b/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-11.54.48-1024x483.png deleted file mode 100644 index 0a6d4de75..000000000 Binary files a/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-11.54.48-1024x483.png and /dev/null differ diff --git a/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-18.07.44-1024x340.jpg b/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-18.07.44-1024x340.jpg new file mode 100644 index 000000000..5d861fe17 Binary files /dev/null and b/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-18.07.44-1024x340.jpg differ diff --git a/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-18.07.44-1024x340.png b/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-18.07.44-1024x340.png deleted file mode 100644 index 8f46d50da..000000000 Binary files a/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/Screenshot-2026-08-30-at-18.07.44-1024x340.png and /dev/null differ diff --git a/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/index.md b/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/index.md index 663e3309c..24690d68e 100644 --- a/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/index.md +++ b/content/posts/2026/08/30/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/index.md @@ -29,7 +29,7 @@ Sources are here, issues and pull requests are very welcome: [github.com/geertja ## File support **Parquet.** A Parquet file opens in a window with a Visual tab and a Query tab. -![](Screenshot-2026-08-30-at-11.54.48-1024x483.png) +![](Screenshot-2026-08-30-at-11.54.48-1024x483.jpg) * The Visual tab shows the number of rows and row groups, the writer and format version, and a table of columns with their SQL type, physical type, encoding, compression codec, compressed and uncompressed size, minimum, maximum and null count. * A bar in the size column shows each column's share of the file. @@ -37,7 +37,7 @@ Sources are here, issues and pull requests are very welcome: [github.com/geertja * The Query tab is an SQL editor over the file, pre-filled with a `read_parquet` query and commented examples. **Excel.** A workbook opens as a spreadsheet: lettered columns, numbered rows, a name box and formula bar above the grid, and one tab per sheet along the bottom. -![](Screenshot-2026-08-30-at-11.54.27-1024x504.png) +![](Screenshot-2026-08-30-at-11.54.27-1024x504.jpg) * Header cells have a dropdown with Sort A to Z, Sort Z to A and a filter by value, sorting renumbers the rows, filtering hides rows and shows their original numbers in blue, as Excel does. * Columns can be dragged to reorder and resized. @@ -92,7 +92,7 @@ After `s.` it lists the columns of `s`, which may be a table, a view, a common t **Documentation.** As seen above, DuckDB keywords and types are colored, and hovering shows a summary, the syntax and an example, with a link to the DuckDB documentation. Standard keywords such as `FROM`, `GROUP BY` and `INSERT` are documented for what DuckDB adds to them. Hovering a function shows its signature and description. The same text appears in the completion documentation pane. **Code templates.** Thirty-one templates cover common patterns, such as `dqual` for top-N per group, `dpiv` for a cross-tab, `dasof` for a time-series join, `dcsv` and `dpq` for reading files, `dcopy` for writing Parquet, `dmacro` for macros and `dvals` for inline data. -![](Screenshot-2026-08-30-at-18.07.44-1024x340.png) +![](Screenshot-2026-08-30-at-18.07.44-1024x340.jpg) Type the abbreviation and press Tab. They can be edited under Tools › Options › Editor › Code Templates › SQL, and [the full list is in the repository README](https://github.com/geertjanw/Apache-NetBeans-Data-Wrangler#code-templates). diff --git a/content/posts/2026/08/31/javafx-links-of-august-2026/index.md b/content/posts/2026/08/31/javafx-links-of-august-2026/index.md index e4db01ea7..a037eac64 100644 --- a/content/posts/2026/08/31/javafx-links-of-august-2026/index.md +++ b/content/posts/2026/08/31/javafx-links-of-august-2026/index.md @@ -5,7 +5,7 @@ description: "Here are the JavaFX LinksOfTheMonth of August 2026. We took a summ canonical: "https://webtechie.be/post/javafx-links-of-august-2026/" authors: - "frankdelporte" -image: "jfxcentral.png" +image: "jfxcentral.jpg" categories: - "JavaFX" related_posts: diff --git a/content/posts/2026/08/31/javafx-links-of-august-2026/jfxcentral.jpg b/content/posts/2026/08/31/javafx-links-of-august-2026/jfxcentral.jpg new file mode 100644 index 000000000..d2a1d0c89 Binary files /dev/null and b/content/posts/2026/08/31/javafx-links-of-august-2026/jfxcentral.jpg differ diff --git a/content/posts/2026/08/31/javafx-links-of-august-2026/jfxcentral.png b/content/posts/2026/08/31/javafx-links-of-august-2026/jfxcentral.png deleted file mode 100644 index a1b0a7523..000000000 Binary files a/content/posts/2026/08/31/javafx-links-of-august-2026/jfxcentral.png and /dev/null differ diff --git a/content/posts/2026/09/01/announcing-bx-word-native-microsoft-word-automation-for-boxlang/Imagen2-1024x978.jpg b/content/posts/2026/09/01/announcing-bx-word-native-microsoft-word-automation-for-boxlang/Imagen2-1024x978.jpg new file mode 100644 index 000000000..9630083bb Binary files /dev/null and b/content/posts/2026/09/01/announcing-bx-word-native-microsoft-word-automation-for-boxlang/Imagen2-1024x978.jpg differ diff --git a/content/posts/2026/09/01/announcing-bx-word-native-microsoft-word-automation-for-boxlang/Imagen2-1024x978.png b/content/posts/2026/09/01/announcing-bx-word-native-microsoft-word-automation-for-boxlang/Imagen2-1024x978.png deleted file mode 100644 index aabf8883b..000000000 Binary files a/content/posts/2026/09/01/announcing-bx-word-native-microsoft-word-automation-for-boxlang/Imagen2-1024x978.png and /dev/null differ diff --git a/content/posts/2026/09/01/announcing-bx-word-native-microsoft-word-automation-for-boxlang/bx-word-1-700x373.jpg b/content/posts/2026/09/01/announcing-bx-word-native-microsoft-word-automation-for-boxlang/bx-word-1-700x373.jpg index 308c396d3..42491acc4 100644 Binary files a/content/posts/2026/09/01/announcing-bx-word-native-microsoft-word-automation-for-boxlang/bx-word-1-700x373.jpg and b/content/posts/2026/09/01/announcing-bx-word-native-microsoft-word-automation-for-boxlang/bx-word-1-700x373.jpg differ diff --git a/content/posts/2026/09/01/announcing-bx-word-native-microsoft-word-automation-for-boxlang/index.md b/content/posts/2026/09/01/announcing-bx-word-native-microsoft-word-automation-for-boxlang/index.md index 65513a92a..10284134e 100644 --- a/content/posts/2026/09/01/announcing-bx-word-native-microsoft-word-automation-for-boxlang/index.md +++ b/content/posts/2026/09/01/announcing-bx-word-native-microsoft-word-automation-for-boxlang/index.md @@ -5,7 +5,7 @@ lastmod: "2026-09-01T11:31:19+00:00" description: "Every enterprise runs on Word documents. Contracts. RFPs. Proposals. Board reports. Offer letters. HR handbooks. Compliance policies. Invoices. Statements…" authors: - "cristobal-escobar" -image: "Imagen2-1024x978.png" +image: "Imagen2-1024x978.jpg" categories: - "BoxLang" - "Developer Tools" diff --git a/content/posts/2026/09/02/mongodb-search-server-improved/Screenshot-2026-09-01-at-13.48.21-scaled.jpg b/content/posts/2026/09/02/mongodb-search-server-improved/Screenshot-2026-09-01-at-13.48.21-scaled.jpg new file mode 100644 index 000000000..b0b3980d2 Binary files /dev/null and b/content/posts/2026/09/02/mongodb-search-server-improved/Screenshot-2026-09-01-at-13.48.21-scaled.jpg differ diff --git a/content/posts/2026/09/02/mongodb-search-server-improved/Screenshot-2026-09-01-at-13.48.21-scaled.png b/content/posts/2026/09/02/mongodb-search-server-improved/Screenshot-2026-09-01-at-13.48.21-scaled.png deleted file mode 100644 index 007c0a4ba..000000000 Binary files a/content/posts/2026/09/02/mongodb-search-server-improved/Screenshot-2026-09-01-at-13.48.21-scaled.png and /dev/null differ diff --git a/content/posts/2026/09/02/mongodb-search-server-improved/index.md b/content/posts/2026/09/02/mongodb-search-server-improved/index.md index d4a39bb43..ea233510d 100644 --- a/content/posts/2026/09/02/mongodb-search-server-improved/index.md +++ b/content/posts/2026/09/02/mongodb-search-server-improved/index.md @@ -4,7 +4,7 @@ date: "2026-09-02T10:00:00+00:00" description: "The MongoDB Search Server for Java adds faceting, sorting, highlighting, weighted fields, and negative filters, with BSON pipeline tips and Docker deployment." authors: - "erik-hatcher" -image: "Screenshot-2026-09-01-at-13.48.21-scaled.png" +image: "Screenshot-2026-09-01-at-13.48.21-scaled.jpg" categories: - "Mongo" related_posts: @@ -145,7 +145,7 @@ Dates are faceted using the same style as numbers, using boundaries and an optio Two features covered in one request, sorting and highlighting; the digested/default parameters are shown in the request section of the response: **/search?q=sunshine\&project=title,plot,year\&search=title,plot\&sort=year%20asc\&highlight=title,plot** -![](unnamed-6-1024x1022.png) +![](unnamed-6-1024x1022.jpg) The highlight parameter is a comma-separated list of field names used to highlight query terms. Highlighting snippets are returned in a _highlights section of each returned document. See commit [ea58891](https://github.com/mongodb-developer/mongodb-search-java-server/commit/e7ea5889114e58ccf6b677d5bab6683a9e8aa5e6) for details. diff --git a/content/posts/2026/09/02/mongodb-search-server-improved/unnamed-6-1024x1022.jpg b/content/posts/2026/09/02/mongodb-search-server-improved/unnamed-6-1024x1022.jpg new file mode 100644 index 000000000..1133c869f Binary files /dev/null and b/content/posts/2026/09/02/mongodb-search-server-improved/unnamed-6-1024x1022.jpg differ diff --git a/content/posts/2026/09/02/mongodb-search-server-improved/unnamed-6-1024x1022.png b/content/posts/2026/09/02/mongodb-search-server-improved/unnamed-6-1024x1022.png deleted file mode 100644 index e3398843e..000000000 Binary files a/content/posts/2026/09/02/mongodb-search-server-improved/unnamed-6-1024x1022.png and /dev/null differ diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/Screenshot-2026-09-03-at-11.21.04-AM.jpg b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/Screenshot-2026-09-03-at-11.21.04-AM.jpg new file mode 100644 index 000000000..14c0dc90b Binary files /dev/null and b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/Screenshot-2026-09-03-at-11.21.04-AM.jpg differ diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/Screenshot-2026-09-03-at-11.21.04-AM.png b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/Screenshot-2026-09-03-at-11.21.04-AM.png deleted file mode 100644 index 4ffd4f3f7..000000000 Binary files a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/Screenshot-2026-09-03-at-11.21.04-AM.png and /dev/null differ diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/index.md b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/index.md index 05a5183da..164f1a78e 100644 --- a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/index.md +++ b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/index.md @@ -5,7 +5,7 @@ lastmod: "2026-09-03T19:18:50+00:00" description: "With this project, I am not trying to build a complete WMS. Instead, I want to use a logistics scenario I know well to explore how an AI agent can become part of a real business workflow and where it can add value. In this first part, we will introduce the WMS scenario and identify where an AI agent can help. In Part 2, we will define and connect the agent using Java and Spring AI. Finally, in Part 3, we will execute the plan, gather context, make the replenishment decision, and act when necessary." authors: - "ricardo-mello" -image: "Screenshot-2026-09-03-at-11.21.04-AM.png" +image: "Screenshot-2026-09-03-at-11.21.04-AM.jpg" categories: - "AI" related_posts: @@ -41,7 +41,7 @@ You can start with the Overview page, which walks through the main WMS flow and The complete source code is available [here](https://github.com/mongodb-developer/mongodb-jvm-showcase/tree/main/java/use-cases/agentic-wms). A Warehouse Management System, or simply WMS, is a software system used to manage and control the movement of products inside a warehouse. It typically handles processes such as receiving goods, tracking inventory, shipping products, replenishment, and many others. A warehouse may store products owned by the company operating it, but it may also store products for other companies. In this article, we will call these companies **depositors**: -![](p1-00_wms-flow-1024x732.png) +![](p1-00_wms-flow-1024x732.jpg) A depositor owns the products stored in the warehouse, while the warehouse is responsible for receiving, storing, managing, and shipping them. A single warehouse may serve multiple depositors at the same time. For example, products from *Amazon* , *Nike* , or *Walmart* could be stored and managed in the same warehouse, while the inventory of each depositor remains separated. A real WMS can support many more processes, but for our application, we will focus on a smaller part of this flow: ![](p1-01_-flow-1024x250.png) @@ -207,7 +207,7 @@ The important point is that the agent does not replace the existing WMS services Instead, the agent acts as an **orchestrator**, deciding which available tools to use based on the goal and the context it gathers. The following diagram shows where the agent becomes part of the WMS flow: -![](p1-03_agent_flow-1024x671.png) +![](p1-03_agent_flow-1024x671.jpg) The diagram may look like a sequence of steps, but this is not a traditional hard-coded workflow where the application defines every decision in advance. diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/p1-00_wms-flow-1024x732.jpg b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/p1-00_wms-flow-1024x732.jpg new file mode 100644 index 000000000..e0e3c58d9 Binary files /dev/null and b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/p1-00_wms-flow-1024x732.jpg differ diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/p1-00_wms-flow-1024x732.png b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/p1-00_wms-flow-1024x732.png deleted file mode 100644 index a812608a4..000000000 Binary files a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/p1-00_wms-flow-1024x732.png and /dev/null differ diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/p1-03_agent_flow-1024x671.jpg b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/p1-03_agent_flow-1024x671.jpg new file mode 100644 index 000000000..7793929ac Binary files /dev/null and b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/p1-03_agent_flow-1024x671.jpg differ diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/p1-03_agent_flow-1024x671.png b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/p1-03_agent_flow-1024x671.png deleted file mode 100644 index 775cde859..000000000 Binary files a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/p1-03_agent_flow-1024x671.png and /dev/null differ diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/Screenshot-2026-09-03-at-11.35.41-AM.jpg b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/Screenshot-2026-09-03-at-11.35.41-AM.jpg new file mode 100644 index 000000000..3ec52e88f Binary files /dev/null and b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/Screenshot-2026-09-03-at-11.35.41-AM.jpg differ diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/Screenshot-2026-09-03-at-11.35.41-AM.png b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/Screenshot-2026-09-03-at-11.35.41-AM.png deleted file mode 100644 index ac3b600c5..000000000 Binary files a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/Screenshot-2026-09-03-at-11.35.41-AM.png and /dev/null differ diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/index.md b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/index.md index 9d10d7a43..478c901d5 100644 --- a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/index.md +++ b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/index.md @@ -5,7 +5,7 @@ lastmod: "2026-09-04T14:05:01+00:00" description: "We will look at how the agent is built with Java and Spring AI, how its capabilities and boundaries are defined, how it is triggered by the WMS, and how the planner turns the agent’s goal into an execution plan." authors: - "ricardo-mello" -image: "Screenshot-2026-09-03-at-11.35.41-AM.png" +image: "Screenshot-2026-09-03-at-11.35.41-AM.jpg" categories: - "AI" related_posts: diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/index.md b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/index.md index a50b51e91..fa51a7ca5 100644 --- a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/index.md +++ b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/index.md @@ -23,7 +23,7 @@ In this third and final part, we will build on the execution plan created in [Pa A live version of the Agentic WMS is available[here](https://agentic-wms-39763860545.southamerica-west1.run.app/), and the complete source code is available[here](https://github.com/mongodb-developer/mongodb-jvm-showcase/tree/main/java/use-cases/agentic-wms). Let's revisit the complete agent flow. The first stages: **Define the Agent, Trigger the Agent, and Plan,** were covered in the previous article. Now we will focus on executing the tasks, using the available tools, gathering context, and making the replenishment decision. -![](p3-flow-765x1024.png) +![](p3-flow-765x1024.jpg) With the execution plan created in [Part 2](https://foojay.io/today/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/), the [AgentRunner](https://github.com/mongodb-developer/mongodb-jvm-showcase/blob/ea5c87c042867a0ea0c71f9ca80c41b466bd2981/java/use-cases/agentic-wms/src/main/java/com/devrel/wms/agent/AgentRunner.java#L56) starts processing the tasks one at a time. For each task, the runner reads its description and capability, executes it, stores the result, and then continues with the next task: @@ -236,7 +236,7 @@ private boolean decidedToStop(String capability, String result) { ``` If replenishment is not required, the remaining REPLENISHMENT and NOTIFICATION tasks are marked as SKIPPED, and the execution is completed: -![](p3-07_skipped-1024x492.png) +![](p3-07_skipped-1024x492.jpg) The runner marks those tasks as SKIPPED and completes the execution: @@ -317,7 +317,7 @@ At this point, the agent has made the decision and performed the actions require ## Complete When there are no more tasks to execute, the agent run is completed and a summary is generated: -![](p3-08_draft-1024x607.png) +![](p3-08_draft-1024x607.jpg) If a replenishment request was created, it is now available on the[Replenishments](https://agentic-wms-39763860545.southamerica-west1.run.app/#replenishment) page for review: ![](p3-09_replenishment-1024x467.png) diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-07_skipped-1024x492.jpg b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-07_skipped-1024x492.jpg new file mode 100644 index 000000000..0243485f9 Binary files /dev/null and b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-07_skipped-1024x492.jpg differ diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-07_skipped-1024x492.png b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-07_skipped-1024x492.png deleted file mode 100644 index 5ccda1d9b..000000000 Binary files a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-07_skipped-1024x492.png and /dev/null differ diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-08_draft-1024x607.jpg b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-08_draft-1024x607.jpg new file mode 100644 index 000000000..1052e6ea8 Binary files /dev/null and b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-08_draft-1024x607.jpg differ diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-08_draft-1024x607.png b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-08_draft-1024x607.png deleted file mode 100644 index e6da0f196..000000000 Binary files a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-08_draft-1024x607.png and /dev/null differ diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-flow-765x1024.jpg b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-flow-765x1024.jpg new file mode 100644 index 000000000..5d552e261 Binary files /dev/null and b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-flow-765x1024.jpg differ diff --git a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-flow-765x1024.png b/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-flow-765x1024.png deleted file mode 100644 index 0c6bf943f..000000000 Binary files a/content/posts/2026/09/03/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/p3-flow-765x1024.png and /dev/null differ diff --git a/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/index.md b/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/index.md index 20543f2f8..e4606a36d 100644 --- a/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/index.md +++ b/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/index.md @@ -4,7 +4,7 @@ date: "2026-09-04T05:51:45+00:00" description: "From Spec-Driven Development to Living Specifications in Java Projects Coding agents have changed the speed at which we can produce software. But…" authors: - "maximillian-arruda" -image: "https://raw.githubusercontent.com/dearrudam/articles/refs/heads/main/sdd/sdd4j/sldd-flow-en.png" +image: "sldd-flow-en-f997f58a.png" categories: - "AI" - "Developer Tools" @@ -42,7 +42,7 @@ What caught my attention was the idea of bringing engineering discipline to AI-a The cycle progressed incrementally from product intent to implementation and verification: -![](https://raw.githubusercontent.com/dearrudam/articles/refs/heads/main/sdd/sdd4j/sldd-flow-en.png) +![](sldd-flow-en-f997f58a.png) Instead of giving the agent an isolated prompt and immediately asking for code, each step produced context for the next one. @@ -118,7 +118,7 @@ That does not make the specification useless. It simply means that it represents This leads us to a model that became increasingly important: -![](https://raw.githubusercontent.com/dearrudam/articles/refs/heads/main/sdd/sdd4j/spec-test-code-en.png) +![](spec-test-code-en-25ee1006.png) And yes, the arrows matter, because software evolves in both directions: @@ -169,7 +169,7 @@ we can express something observable: By assigning a stable identifier to that requirement, we can establish a relationship such as: -![](https://raw.githubusercontent.com/dearrudam/articles/refs/heads/main/sdd/sdd4j/req-test-comp-en.png) +![](req-test-comp-en-bf7cacc8.png) The agent still has the freedom to reason about the implementation, but the expected behavior now has a deterministic verification boundary. @@ -218,7 +218,7 @@ Instead of making the main specification workflow understand every possible arch Conceptually: -![](https://raw.githubusercontent.com/dearrudam/articles/refs/heads/main/sdd/sdd4j/sdd4j-arch-adapter.png) +![](sdd4j-arch-adapter-7c65b88d.png) The core remains concerned with specifications, testable requirements, traceability, and convergence. @@ -254,7 +254,7 @@ The same requirement presented earlier could therefore be expressed in an SDD4J We preserve the same intent: -![](https://raw.githubusercontent.com/dearrudam/articles/refs/heads/main/sdd/sdd4j/req-test-comp-en.png) +![](req-test-comp-en-bf7cacc8.png) but in the language configured for the project. diff --git a/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/req-test-comp-en-bf7cacc8.png b/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/req-test-comp-en-bf7cacc8.png new file mode 100644 index 000000000..0e28b543d Binary files /dev/null and b/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/req-test-comp-en-bf7cacc8.png differ diff --git a/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/sdd4j-arch-adapter-7c65b88d.png b/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/sdd4j-arch-adapter-7c65b88d.png new file mode 100644 index 000000000..45eb948c3 Binary files /dev/null and b/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/sdd4j-arch-adapter-7c65b88d.png differ diff --git a/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/sldd-flow-en-f997f58a.png b/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/sldd-flow-en-f997f58a.png new file mode 100644 index 000000000..824adf7d5 Binary files /dev/null and b/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/sldd-flow-en-f997f58a.png differ diff --git a/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/spec-test-code-en-25ee1006.png b/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/spec-test-code-en-25ee1006.png new file mode 100644 index 000000000..a7a082a0a Binary files /dev/null and b/content/posts/2026/09/04/from-spec-driven-development-to-living-specifications-in-java-projects/spec-test-code-en-25ee1006.png differ diff --git a/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/index.md b/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/index.md index 15729bbd7..2caabd667 100644 --- a/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/index.md +++ b/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/index.md @@ -5,7 +5,7 @@ lastmod: "2026-09-07T06:08:21+00:00" description: "Java applications are usually associated with APIs, databases, messaging systems, and cloud infrastructure. But Java can also interact with the physical…" authors: - "igor-de-souza" -image: "pico_led_on_off-1024x683.png" +image: "pico_led_on_off-1024x683.jpg" categories: - "Embedded" - "Quarkus" @@ -13,7 +13,7 @@ related_posts: frozen: false --- -![](pico_top-1024x267.png) +![](pico_top-1024x267.jpg) Java applications are usually associated with APIs, databases, messaging systems, and cloud infrastructure. But Java can also interact with the physical world—reading sensors, controlling LEDs, driving motors, and communicating with microcontrollers. @@ -166,7 +166,7 @@ public class PicoService { ``` ConfigurableFirmata identifies the Pico's built-in LED as logical pin 25. -![](pico_led_on_off-1024x683.png) +![](pico_led_on_off-1024x683.jpg) It is important to distinguish logical GPIO numbers from physical header positions. The RP2040 support documentation describes 30 logical pins, four analog inputs, and 16 PWM-capable pins. The analog inputs use logical indexes 26 through 29. See the official [ConfigurableFirmata board-support documentation](https://github.com/firmata/ConfigurableFirmata/blob/master/BoardSupport.md "ConfigurableFirmata board-support documentation") for the complete mapping. ![](pico_gpio.jpg) diff --git a/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/pico_led_on_off-1024x683.jpg b/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/pico_led_on_off-1024x683.jpg new file mode 100644 index 000000000..13898f0f1 Binary files /dev/null and b/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/pico_led_on_off-1024x683.jpg differ diff --git a/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/pico_led_on_off-1024x683.png b/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/pico_led_on_off-1024x683.png deleted file mode 100644 index 749bfd0fd..000000000 Binary files a/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/pico_led_on_off-1024x683.png and /dev/null differ diff --git a/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/pico_top-1024x267.jpg b/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/pico_top-1024x267.jpg new file mode 100644 index 000000000..ade0bca01 Binary files /dev/null and b/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/pico_top-1024x267.jpg differ diff --git a/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/pico_top-1024x267.png b/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/pico_top-1024x267.png deleted file mode 100644 index 5f6ee22c8..000000000 Binary files a/content/posts/2026/09/07/bringing-raspberry-pico-to-quarkus-with-firmata/pico_top-1024x267.png and /dev/null differ diff --git a/content/posts/2026/10/01/announcing-foojay-2-0/calendar-september-new.jpg b/content/posts/2026/10/01/announcing-foojay-2-0/calendar-september-new.jpg new file mode 100644 index 000000000..48ee798e6 Binary files /dev/null and b/content/posts/2026/10/01/announcing-foojay-2-0/calendar-september-new.jpg differ diff --git a/content/posts/2026/10/01/announcing-foojay-2-0/calendar-september-new.png b/content/posts/2026/10/01/announcing-foojay-2-0/calendar-september-new.png deleted file mode 100644 index c6f56a4b7..000000000 Binary files a/content/posts/2026/10/01/announcing-foojay-2-0/calendar-september-new.png and /dev/null differ diff --git a/content/posts/2026/10/01/announcing-foojay-2-0/calendar-september-old.jpg b/content/posts/2026/10/01/announcing-foojay-2-0/calendar-september-old.jpg new file mode 100644 index 000000000..c4f04bf31 Binary files /dev/null and b/content/posts/2026/10/01/announcing-foojay-2-0/calendar-september-old.jpg differ diff --git a/content/posts/2026/10/01/announcing-foojay-2-0/calendar-september-old.png b/content/posts/2026/10/01/announcing-foojay-2-0/calendar-september-old.png deleted file mode 100644 index 6b92049d4..000000000 Binary files a/content/posts/2026/10/01/announcing-foojay-2-0/calendar-september-old.png and /dev/null differ diff --git a/content/posts/2026/10/01/announcing-foojay-2-0/index.md b/content/posts/2026/10/01/announcing-foojay-2-0/index.md index 7293a8bdd..d3966f369 100644 --- a/content/posts/2026/10/01/announcing-foojay-2-0/index.md +++ b/content/posts/2026/10/01/announcing-foojay-2-0/index.md @@ -360,8 +360,8 @@ feed we can read, and 52 upcoming meetups sit on the calendar as I write this.** Both screenshots below show September 2026, taken on the first of the month: {{< gallery cols="1" >}} -calendar-september-old.png | The old calendar. 11 entries for the month, each one typed into WordPress by hand. -calendar-september-new.png | The same month on the new site. 23 entries, none of them typed in. +calendar-september-old.jpg | The old calendar. 11 entries for the month, each one typed into WordPress by hand. +calendar-september-new.jpg | The same month on the new site. 23 entries, none of them typed in. {{< /gallery >}} Same month, twice the community. The old calendar carried 11 entries. The new diff --git a/scripts/README.md b/scripts/README.md index 8a3cb9555..bf9615a47 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -124,6 +124,7 @@ them take `--dry-run` (report, change nothing) and most take `--path `. | `HeaderlessTables.java` | the empty header row that makes a WordPress table a GFM table again — 111 tables across 54 posts had a delimiter row with no header above it, which Goldmark renders as a wall of literal pipes. Empty rather than promoting the first row: 86 of the 111 open with a legend or a note box, not a header | | `NormalizeMarkdown.java` | setext headings → ATX, decorative `
    ` spacers dropped | | `images.py` | the WordPress-era media weight — animated GIF → animated WebP, large PNG → JPEG, oversized rasters resized, animated `image:` heroes given a still poster. Took the built site from 1.39 GB to 0.69 GB, under GitHub Pages' 1 GB artifact limit. **The one script here that outlives cutover** (content keeps arriving) and the one that isn't jbang Java — writing an *animated* WebP needs Pillow, which Java has no equivalent for | +| `external_images.py` | hotlinked images pulled into the post's own bundle — 393 posts referenced 1710 images on 115 hosts they don't control and **129 across 46 posts are already dead**. Shrinks in a temp dir before the file enters the repo (455 MB raw would pass the 1 GB artifact limit, and nothing rewrites git history), verifies the bytes really are an image, and reports a failure rather than rewriting a reference to a file that isn't there. **All 393 posts are done**: 1710 external references down to 212, and those 212 are unrecoverable (44 dead, 9 bot-walled, 4 mermaid.ink, 5 live CI badges) rather than pending. Run `images.py` over the same bundles afterwards for the GIFs | | `Descriptions.java` | two Yoast defects in `description:` — the spaces it dropped building one from the body (`…pattern.What you'll learn`, 22 posts), and the `" - by "` tail it stamps on an auto-generated one (290 posts, removed only when the name is one the post actually credits). Prints what it can't tell apart from a type name, or from prose | | `SanitizeSlugs.java` | slugs → lowercase `[a-z0-9_-]` | | `PostsToBundles.java` | flat post files → leaf bundles | diff --git a/scripts/cleanup/external_images.py b/scripts/cleanup/external_images.py new file mode 100644 index 000000000..c2c035c8e --- /dev/null +++ b/scripts/cleanup/external_images.py @@ -0,0 +1,336 @@ +#!/usr/bin/env python3 +"""Pull every EXTERNAL image a post references into that post's own bundle. + +Run by hand, like cleanup/images.py, and for the same reason: it talks to ~100 +third-party hosts and needs Pillow. + + python3 scripts/cleanup/external_images.py --dry-run + python3 scripts/cleanup/external_images.py --path content/posts/2024/01/05/... + python3 scripts/cleanup/external_images.py --path content/posts --limit 20 + +WHY. 393 posts referenced 1710 images on 115 hosts they do not control, and 129 +of those across 46 posts are ALREADY DEAD -- a broken glyph mid-article on the +live site today. Hotlinking also spends a stranger's bandwidth on every page +view, leaks each reader's IP to whoever owns the host, and puts 455 MB of +pictures outside anything this repo can measure or shrink. + +The durable half of the fix is in shared/HtmlToMarkdown.localizeImages, which +now localizes any host, so a re-scrape produces local files. This is the one-off +sweep for what is already in content/, and the two agree ON THE FILENAME by +construction (see local_name): a file this script wrote is found by the +scraper's own extension-blind stem lookup and never downloaded again. + +FOUR THINGS THIS DOES ON PURPOSE. + +1. IT SHRINKS BEFORE THE FILE EVER ENTERS THE REPO. The originals average + 330 KB and reach 15.5 MB; 455 MB of them would put the built site past + GitHub Pages' 1 GB artifact limit, whose warning arrives on a run that is + otherwise GREEN. Downloading the original into content/ and shrinking it + afterwards would also leave the full-size blob in git history for ever, so + the download lands in a temp directory, is re-encoded there with + cleanup/images.py's own measured rules, and only the result is moved in. + +2. IT VERIFIES THE BYTES ARE AN IMAGE. A dead third-party URL rarely 404s + cleanly: it serves a login wall, a "not found" page or a placeholder, all of + them HTML with a 200. Writing that as foo.png would turn a visibly broken + image into a file that is broken for ever and looks localized. + +3. IT FINISHES EACH BUNDLE BEFORE STARTING THE NEXT. images.py learned this the + expensive way -- it converted every GIF and rewrote references at the END, a + commit landed mid-run, and four images broke on the live site. + +4. A FAILURE LEAVES THE REFERENCE ALONE AND IS REPORTED. A 403 is a bot wall, + not proof of deletion (Medium and Oracle answer a script with 403/410 and a + browser with 200), so those stay hotlinked and get named at the end rather + than being rewritten to a file that is not there. +""" + +import argparse +import hashlib +import re +import shutil +import sys +import tempfile +import urllib.error +import urllib.parse +import urllib.request +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +try: + import images as imagelib # cleanup/images.py -- the shrink rules + from PIL import Image +except ImportError as e: + sys.exit(f"needs Pillow and cleanup/images.py next to this script: {e}") + +# Identify ourselves rather than pose as a browser -- the rule fetch/JugEvents.java +# follows. A browser UA is still needed for the hosts behind a WAF that 403s a +# bare Python one, so it is the FALLBACK and not the first thing tried. +UA = "foojay-website-image-localizer/1.0 (+https://github.com/foojayio/website)" +UA_BROWSER = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 " + "(KHTML, like Gecko) Chrome/124.0 Safari/537.36") + +# Every shape an image reference takes in content/, all four live today. +REF_PATTERNS = [ + re.compile(r'!\[[^\]]*\]\(\s*(https?://[^)\s]+)'), # ![alt](url) + re.compile(r'\{\{<\s*img[^>]*?src="(https?://[^"]+)"'), # {{< img src="url" >}} + re.compile(r']+src="(https?://[^"]+)"', re.I), # raw in a preserved block + re.compile(r'^image:\s*"?(https?://[^"\s]+)', re.M), # the frontmatter hero +] +URL_EXT = re.compile(r'\.(jpe?g|png|gif|webp|svg|avif|bmp)$', re.I) +EXT_FOR_TYPE = { + "image/jpeg": ".jpg", "image/jpg": ".jpg", "image/png": ".png", + "image/gif": ".gif", "image/webp": ".webp", "image/avif": ".avif", + "image/svg+xml": ".svg", "image/bmp": ".bmp", +} +# A live SERVICE rather than a picture: a GitHub Actions badge reports whether a +# build passes RIGHT NOW, so a frozen copy asserts a stale CI result for ever. +SKIP = re.compile(r'(?i)^https?://(?:[^/]+\.)?github\.com/[^?#]*/badge\.svg(?:[?#]|$)') +# WordPress replaced an emoji CHARACTER with an , and the alt is that +# character -- so the original is recoverable exactly. Restored as text instead +# of downloading 23 emoji SVGs into eight bundles. Same pass as +# HtmlToMarkdown.restoreWordPressEmoji, so a re-scrape agrees. +EMOJI_IMG = re.compile(r'!\[([^\]]+)\]\(https?://s\.w\.org/images/core/emoji/[^)]+\)') + + +def short_hash(url): + return hashlib.sha256(url.encode("utf-8")).hexdigest()[:8] + + +def local_name(url, content_type): + """The filename to store `url` under -- BYTE-IDENTICAL to what + HtmlToMarkdown.externalStem + its extension choice produce, which is what + keeps a re-scrape from downloading the same image a second time. + + The URL hash is not decoration. Third-party basenames collide constantly: + 58 bundles in content/ reference an external URL whose basename is already + the name of a file sitting in that bundle (`lambda.gif`, `layers.png`, + `banner-1.png`). Without the hash the reference would silently be repointed + at a picture from a different source, which nothing downstream would report. + """ + path = urllib.parse.urlparse(url).path + name = path[path.rfind("/") + 1:] + ext = None + m = URL_EXT.search(name) + if m: + ext = m.group(0).lower() + name = name[: -len(ext)] + if ext == ".jpeg": + ext = ".jpeg" # keep what the URL said; images.py treats both + name = re.sub(r"[^A-Za-z0-9._-]", "-", name) + name = re.sub(r"-{2,}", "-", name).strip("-.") + if len(name) > 40: + name = name[:40].rstrip("-.") + if not name or not any(c.isalpha() for c in name): + host = urllib.parse.urlparse(url).netloc.lower() + host = host[4:] if host.startswith("www.") else host + name = re.sub(r"[^a-z0-9]+", "-", host) + if ext is None: + base = (content_type or "").split(";")[0].strip().lower() + ext = EXT_FOR_TYPE.get(base) + if ext is None: + return None + return f"{name}-{short_hash(url)}{ext}" + + +def fetch(url, timeout): + """(bytes, content_type, None) on success, (None, None, reason) otherwise. + + Tries our own UA and then a browser one, because a 403 says something about + the CLIENT and not about the file -- several of these hosts sit behind a WAF + that rejects a bare Python agent. Only the status codes that mean "not you" + are retried; a 404 is answered once. + """ + last = None + for ua in (UA, UA_BROWSER): + req = urllib.request.Request(url, headers={"User-Agent": ua, "Accept": "image/*,*/*"}) + try: + with urllib.request.urlopen(req, timeout=timeout) as r: + return r.read(), r.headers.get("Content-Type", ""), None + except urllib.error.HTTPError as e: + last = f"HTTP {e.code}" + if e.code not in (401, 403, 405, 406, 429): + break + except Exception as e: # timeout, DNS, TLS, reset + last = type(e).__name__ + break + return None, None, last + + +def existing_for(folder, name): + """A file already in this bundle for the same URL, whatever extension it now + carries -- images.py may have re-encoded .png to .jpg. Extension-blind on the + hashed stem, which is exactly HtmlToMarkdown.findByStem.""" + stem = name[: name.rfind(".")] + for p in sorted(folder.glob(stem + ".*")): + return p.name + return None + + +def shrink(tmp_path, args): + """images.py's own rules, applied in the temp directory so an oversized + original never enters the repo. Returns the path that survived. + + THE GIF BRANCH IS WHERE THE WEIGHT IS. Of the 166 MB the first 20 posts + pulled in, 120 MB was 39 screen-recording GIFs -- one of them 15.5 MB -- and + a GIF is the one format neither of the raster passes touches. Converting it + here rather than after the move is what keeps the original out of git + history, and it is the expensive step: minutes per large GIF, which is why a + batch of these is a background job and not something to wait on. + + convert_gif() rewrites references and unlinks the source itself; in a temp + directory both are no-ops, and the caller repoints the URL at whatever + filename comes back.""" + ext = tmp_path.suffix.lower() + if ext == ".gif" and tmp_path.stat().st_size > args.gif_min: + if imagelib.convert_gif(tmp_path, args.budget, False) is not None: + webp = tmp_path.with_suffix(".webp") + if webp.is_file(): + return webp + if ext == ".png" and tmp_path.stat().st_size > args.png_min: + r = imagelib.png_to_jpeg(tmp_path, args.png_jpeg_quality, args.cap, False) + if r is not None: + return tmp_path.with_suffix(".jpg") + if tmp_path.suffix.lower() in imagelib.RASTER: + imagelib.shrink_raster(tmp_path, args.cap, args.jpeg_quality, False) + return tmp_path + + +def index_files(root): + if root.is_file() and root.name in imagelib.INDEX_NAMES: + return [root] + return sorted(p for p in root.rglob("*") if p.name in imagelib.INDEX_NAMES) + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--path", action="append", default=None, + help="content dir, post bundle or index.md (repeatable)") + ap.add_argument("--limit", type=int, default=0, help="max bundles to touch") + ap.add_argument("--dry-run", action="store_true") + ap.add_argument("--timeout", type=int, default=30) + ap.add_argument("--cap", type=int, default=1600, help="max long edge in px") + ap.add_argument("--jpeg-quality", type=int, default=82) + ap.add_argument("--png-min", type=int, default=300_000) + ap.add_argument("--png-jpeg-quality", type=int, default=85) + ap.add_argument("--gif-min", type=int, default=200_000, + help="convert animated GIFs above this to WebP") + ap.add_argument("--budget", type=int, default=3_000_000, + help="per-file target for the GIF ladder; matches images.py") + args = ap.parse_args() + + roots = [Path(p) for p in (args.path or ["content"])] + for r in roots: + if not r.exists(): + sys.exit(f"no such path: {r}") + + indexes = [] + for r in roots: + indexes.extend(index_files(r)) + + localized = dead = skipped = emoji_restored = 0 + downloaded = stored = 0 + touched_bundles = 0 + failures = [] + + for md in indexes: + text = md.read_text(encoding="utf-8") + urls = [] + for pat in REF_PATTERNS: + for m in pat.finditer(text): + if m.group(1) not in urls: + urls.append(m.group(1)) + emoji_here = EMOJI_IMG.findall(text) + if not urls and not emoji_here: + continue + if args.limit and touched_bundles >= args.limit: + break + touched_bundles += 1 + folder = md.parent + print(f"\n{md}") + + # WordPress emoji images -> the character itself. Before the downloads, + # so those URLs are gone from the list rather than fetched. + if emoji_here: + new = EMOJI_IMG.sub(lambda m: m.group(1), text) + if new != text: + emoji_restored += len(emoji_here) + print(f" restored {len(emoji_here)} WordPress emoji image(s) to the character") + text = new + urls = [u for u in urls if "s.w.org/images/core/emoji/" not in u] + + for url in urls: + if SKIP.search(url): + skipped += 1 + print(f" live badge, left hotlinked: {url}") + continue + + # Already localized on an earlier run? Cheap, and it makes the whole + # script safe to re-run: no request, no rewrite of an unchanged file. + probe = local_name(url, None) + if probe: + have = existing_for(folder, probe) + if have: + text = text.replace(url, have) + print(f" have {have}") + continue + + body, ctype, why = fetch(url, args.timeout) + if body is None: + dead += 1 + failures.append((md, url, why)) + print(f" DEAD {why:<12} {url}") + continue + + name = local_name(url, ctype) + if name is None: + skipped += 1 + failures.append((md, url, f"unknown type {ctype!r}")) + print(f" SKIP unknown image type {ctype!r}: {url}") + continue + + with tempfile.TemporaryDirectory() as td: + tmp = Path(td) / name + tmp.write_bytes(body) + try: + with Image.open(tmp) as im: + im.verify() + except Exception: + if tmp.suffix.lower() != ".svg": + skipped += 1 + failures.append((md, url, "not a decodable image")) + print(f" SKIP not an image ({len(body)} bytes): {url}") + continue + before = tmp.stat().st_size + final = tmp if args.dry_run else shrink(tmp, args) + after = final.stat().st_size + downloaded += before + stored += after + if args.dry_run: + print(f" would localize {url} -> {final.name} " + f"({before/1024:.0f} KB)") + else: + shutil.move(str(final), folder / final.name) + print(f" {before/1024:>7.0f} KB -> {after/1024:>7.0f} KB {final.name}") + text = text.replace(url, final.name) + localized += 1 + + if not args.dry_run and text != md.read_text(encoding="utf-8"): + md.write_text(text, encoding="utf-8") + + print(f"\n{touched_bundles} bundle(s) touched") + print(f" localized {localized}") + print(f" emoji restored {emoji_restored}") + print(f" left alone {skipped} (live badges / not an image)") + print(f" unreachable {dead}") + if downloaded: + print(f" downloaded {downloaded/1e6:.1f} MB -> stored {stored/1e6:.1f} MB" + f" ({100 - stored*100/downloaded:.0f}% smaller)") + if failures: + print("\nleft hotlinked, needs a human (a 403 is a bot wall, not proof the file is gone):") + for md, url, why in failures: + print(f" {why:<22} {url}\n in {md}") + + +if __name__ == "__main__": + main() diff --git a/scripts/cleanup/images.py b/scripts/cleanup/images.py index b51885527..86a607991 100644 --- a/scripts/cleanup/images.py +++ b/scripts/cleanup/images.py @@ -190,9 +190,8 @@ def rewrite_in_bundle(folder, old, new): """Repoint every reference to `old` at `new`, in this bundle's index only. Bundle images are referenced by BARE FILENAME (resource-url.html resolves a - name against the page's own folder), which is what makes a text replacement - safe -- the name is distinctive, and it appears in exactly these shapes, all - of which are live in content/: + name against the page's own folder), so a text replacement is the right + shape -- the name appears in exactly these four ways, all live in content/: ![alt](shot.gif) markdown image image: "shot.gif" the hero in frontmatter @@ -200,13 +199,31 @@ def rewrite_in_bundle(folder, old, new): raw HTML in a preserved block Scoped to this bundle, so a same-named image in another post is never touched. + + WHOLE FILENAMES ONLY, and this is not defensive tidiness -- a plain + text.replace() corrupted two posts. One bundle holds both `dummies.png` and + `image-764x1024-dummies.png`; converting the first rewrote the SUFFIX of the + second, so its hero pointed at `image-764x1024-dummies.jpg`, a file nothing + ever wrote. `add-mnemonic-bookmark.png` went the same way. Nothing reported + it either: Hugo publishes a bundle resource that no longer matches a + reference without a word, and the hero is a card thumbnail and og:image on + every listing page -- validate/BuiltSite.java is what caught it, from eight + pages at once. + + The lookbehind blocks a match preceded by another filename character, which + is exactly the `-dummies.png` case, while still matching every shape a real + reference takes: `](name.png)`, `image: "name.png"`, `name.png | caption` + and `src="name.png"`. The lookahead blocks `name.png2` without blocking a + filename at the end of a sentence. """ + pattern = re.compile(r"(? Hugo migration scripts. Now used @@ -159,8 +163,11 @@ private HtmlToMarkdown() { .set(FlexmarkHtmlConverter.SETEXT_HEADINGS, false) .set(FlexmarkHtmlConverter.TYPOGRAPHIC_SMARTS, false); - // Images hosted on foojay.io die at cutover, so they are pulled local. - // Third-party images (youtube thumbs, badges, ...) are left untouched. + // EVERY image in a body is pulled local, whatever host serves it -- see + // localizeImages. Images on foojay.io die at cutover; a third-party image + // dies whenever its host feels like it, which is not a hypothetical: of the + // 1549 distinct external image URLs content/ referenced, 129 already 404 and + // render as a broken glyph on 46 posts today. private static final Pattern IMAGE_HREF = Pattern.compile("(?i)\\.(jpe?g|png|gif|webp|svg|avif)(?:[?#].*)?$"); @@ -176,6 +183,15 @@ public static final class Options { // "WordPress genuinely serves both foo.png and foo.jpg". An Options is built // per content item and never shared across threads, so no synchronization. final Set fetchedThisItem = new HashSet<>(); + // Absolute URL -> the filename it was stored under, for THIS item. Two + // jobs, both of which only exist now that any host is localized: + // several references to one URL share one file, and two DIFFERENT URLs + // can never end up sharing one. Third-party basenames collide constantly + // -- content/ references `image.png` from four hosts and `unnamed-4.png` + // from two -- and a collision here is silent: Files.exists() would + // short-circuit and the second reference would quietly display the first + // host's picture. Same per-item, single-threaded lifetime as the set. + final Map localizedThisItem = new HashMap<>(); public Options(Path imageBaseDir, String imageUrlPrefix, String localHostSuffix, String userAgent, int timeoutMs) { @@ -1251,12 +1267,30 @@ static List outermostMatches(Element root, String selector) { // ---- image localization --------------------------------------------- /** - * Downloads every foojay-hosted image referenced in the body into this item's - * own image directory (imageBaseDir/itemSubpath/) and rewrites the reference - * to the local path. Covers both /srcset and lightbox links - * to image files. Third-party images (kept working after cutover) are left as-is. + * Downloads every image referenced in the body -- on ANY host -- into this + * item's own image directory (imageBaseDir/itemSubpath/) and rewrites the + * reference to the local path. Covers both /srcset and + * lightbox links to image files. + * + * IT USED TO LOCALIZE ONLY foojay.io, AND THAT WAS THE BUG. The reasoning was + * that a third-party image "keeps working after cutover" -- but a host we do + * not control is exactly the one that can stop serving without telling us, + * and the audit says it already has: 393 posts reference 1710 external + * images, and 129 of them across 46 posts are dead NOW. Hotlinking also + * spends someone else's bandwidth on every page view and leaks every reader's + * IP to whoever owns the host. + * + * A localized image is also one the site can SHRINK. cleanup/images.py caps + * the long edge and re-encodes, which is what keeps the build inside GitHub + * Pages' 1 GB artifact limit; a hotlink is 330 KB on average and outside + * anything this repo can measure or fix. + * + * Two exclusions, both because localizing would freeze something that is + * meant to be live rather than preserve something that is meant to be + * permanent -- see SKIP_LOCALIZING. */ static void localizeImages(Element content, Options opts, String itemSubpath) { + restoreWordPressEmoji(content); for (Element img : content.select("img[src]")) { String local = localizeImage(img.absUrl("src"), opts, itemSubpath); if (local != null) { @@ -1276,36 +1310,179 @@ static void localizeImages(Element content, Options opts, String itemSubpath) { } } + /** + * WordPress's emoji replacement, undone: it rewrites an emoji CHARACTER an + * author typed into `\uD83D\uDE80`, and the alt is the character itself -- so the original is + * recoverable exactly rather than approximated. + * + * Run before localization, so these become text instead of 23 emoji SVGs + * downloaded into eight post bundles. It is also what content/ should hold on + * its own terms: this file already treats an emoji in a BODY as the author's + * writing (see stripEmoji, which takes them out of titles only), and a + * contributor writing the same post today would type the character. + */ + static void restoreWordPressEmoji(Element content) { + for (Element img : content.select("img[src*=/images/core/emoji/]")) { + String alt = img.attr("alt"); + if (alt.isBlank()) continue; // nothing to put back; localize it instead + img.replaceWith(new TextNode(alt)); + } + } + + /** + * Left hotlinked on purpose: a URL that is a live SERVICE rather than a + * picture. A GitHub Actions `badge.svg` reports whether a build passes right + * now (5 of these in content/), so a frozen copy would assert a two-year-old + * CI result for ever -- preserving it is the opposite of being accurate. + * + * Deliberately short. Everything else is localized, including the 15 + * mermaid.ink diagrams (9 of which are already dead, which is the argument + * rather than against it -- though the real fix for those is a ```mermaid + * fence, which this site renders itself). + */ + private static final Pattern SKIP_LOCALIZING = Pattern.compile( + "(?i)^https?://(?:[^/]+\\.)?github\\.com/[^?#]*/badge\\.svg(?:[?#]|$)"); + + /** A URL path that already names its own image format. */ + private static final Pattern URL_IMAGE_EXTENSION = + Pattern.compile("(?i)\\.(jpe?g|png|gif|webp|svg|avif|bmp)$"); + + /** Content-Type -> the extension to store it under. */ + private static final Map EXTENSION_FOR_TYPE = new LinkedHashMap<>(); + static { + EXTENSION_FOR_TYPE.put("image/jpeg", ".jpg"); + EXTENSION_FOR_TYPE.put("image/jpg", ".jpg"); + EXTENSION_FOR_TYPE.put("image/png", ".png"); + EXTENSION_FOR_TYPE.put("image/gif", ".gif"); + EXTENSION_FOR_TYPE.put("image/webp", ".webp"); + EXTENSION_FOR_TYPE.put("image/avif", ".avif"); + EXTENSION_FOR_TYPE.put("image/svg+xml", ".svg"); + EXTENSION_FOR_TYPE.put("image/bmp", ".bmp"); + } + + /** Downloaded bytes above which cleanup/images.py has real work to do -- + * Frontmatter.MAX_IMAGE_BYTES is 4 MB, so this warns well before the check + * fails rather than after. */ + private static final int SHRINK_ABOVE_BYTES = 1_000_000; + /** * Localizes one image URL into this item's image directory, returning its new - * site-absolute path, or null to leave the reference unchanged (not a - * foojay-hosted image, or the download failed). Idempotent: an already- - * downloaded file is not fetched again, and an already-RE-ENCODED one is - * recognised under its new extension rather than fetched back (see - * convertedSibling). + * site-absolute path, or null to leave the reference unchanged (a data: URI, + * a live badge, something that turned out not to be an image, or a download + * that failed). + * + * IDEMPOTENT, and that is the whole difficulty now that any host is in scope: + * + * - A foojay-hosted image keeps the exact behaviour it always had -- stored + * under its own basename, so not one byte of what is already in content/ + * moves, and convertedSibling still recognises a file cleanup/images.py + * re-encoded. + * - AN EXTERNAL IMAGE IS STORED UNDER `-.`, and + * the hash is not decoration. Third-party basenames collide constantly: + * content/ has 58 bundles where an external URL's basename is ALREADY the + * name of a file sitting in that bundle (`lambda.gif`, `layers.png`, + * `banner-1.png`). Without the hash, Files.isRegularFile() sees that file, + * short-circuits, and the reference silently displays a picture from a + * different source -- the one failure mode this store cannot have, because + * nothing downstream would ever report it. With it, "the file exists" + * provably means "this URL was already downloaded". + * - The lookup is by STEM, ignoring the extension, so a file images.py later + * re-encoded (`foo-3f2a1b7c.png` -> `.jpg`) is found rather than + * re-downloaded, and so a URL that carries no extension at all (221 of + * content/'s external references -- Medium, Hashnode and Google + * user-content serve images from extension-less paths) costs no request on + * a re-run either. That is transfer/Authors.java's avatar rule, which is + * why 203 converted avatars survive a re-scrape. */ static String localizeImage(String absoluteUrl, Options opts, String itemSubpath) { - String filename = localImageFilename(absoluteUrl, opts.localHostSuffix); - if (filename == null) return null; + if (absoluteUrl == null || absoluteUrl.isBlank() || absoluteUrl.startsWith("data:")) return null; + if (SKIP_LOCALIZING.matcher(absoluteUrl).find()) return null; + + URI uri; + try { + uri = URI.create(absoluteUrl); + } catch (IllegalArgumentException e) { + return null; + } + if (uri.getHost() == null) return null; + String dirRel = (itemSubpath == null || itemSubpath.isBlank()) ? "" : itemSubpath + "/"; - Path out = opts.imageBaseDir.resolve(dirRel + filename); + Path dir = opts.imageBaseDir.resolve(dirRel.isEmpty() ? "" : dirRel); + + // Same URL twice in one body -- one file, one download. + String seen = opts.localizedThisItem.get(absoluteUrl); + if (seen != null) return opts.imageUrlPrefix + dirRel + seen; + + boolean onLocalHost = uri.getHost().endsWith(opts.localHostSuffix); + String stem = null; + String filename; + if (onLocalHost) { + filename = localImageFilename(absoluteUrl, opts.localHostSuffix); + if (filename == null) return null; + } else { + stem = externalStem(absoluteUrl, uri); + String ext = urlExtension(uri); + filename = ext == null ? null : stem + ext; // null until the fetch names the format + } + try { - if (!Files.exists(out)) { - String converted = convertedSibling(out.getParent(), filename, opts); - if (converted != null) { - System.out.println(" keeping " + converted + " (cleanup/images.py re-encoded " - + filename + "); not re-downloading"); - return opts.imageUrlPrefix + dirRel + converted; + // Already on disk? Then nothing is fetched. For an external image the + // stem carries the URL hash, so this is an identity check and not a + // guess about two files that happen to share a name. + String onDisk = onLocalHost + ? (Files.isRegularFile(dir.resolve(filename)) ? filename : convertedSibling(dir, filename, opts)) + : findByStem(dir, stem, opts); + if (onDisk != null) { + if (!onDisk.equals(filename)) { + System.out.println(" keeping " + onDisk + " (already localized; not re-downloading)"); + } + opts.localizedThisItem.put(absoluteUrl, onDisk); + return opts.imageUrlPrefix + dirRel + onDisk; + } + + Connection.Response res = Jsoup.connect(absoluteUrl) + .userAgent(opts.userAgent) + .timeout(opts.timeoutMs) + .ignoreContentType(true) + .maxBodySize(0) + .execute(); + + // WHAT CAME BACK HAS TO BE AN IMAGE. A dead third-party URL rarely + // 404s cleanly -- it serves a login wall, a "post not found" page or + // a placeholder, all of them HTML with a 200. Writing that to + // foo.png would replace a broken image with a file that is broken + // for ever and looks localized. + String type = res.contentType() == null ? "" : res.contentType().toLowerCase(Locale.ROOT); + String baseType = type.contains(";") ? type.substring(0, type.indexOf(';')).trim() : type.trim(); + if (!baseType.startsWith("image/")) { + System.err.println(" NOT an image, left hotlinked: " + absoluteUrl + + " (Content-Type: " + (baseType.isEmpty() ? "none" : baseType) + ")"); + return null; + } + if (filename == null) { + String ext = EXTENSION_FOR_TYPE.get(baseType); + if (ext == null) { + System.err.println(" unknown image type, left hotlinked: " + absoluteUrl + + " (" + baseType + ")"); + return null; } - Connection.Response res = Jsoup.connect(absoluteUrl) - .userAgent(opts.userAgent) - .timeout(opts.timeoutMs) - .ignoreContentType(true) - .maxBodySize(0) - .execute(); - Files.createDirectories(out.getParent()); - Files.write(out, res.bodyAsBytes()); - opts.fetchedThisItem.add(filename); + filename = stem + ext; + } + + byte[] bytes = res.bodyAsBytes(); + Path out = dir.resolve(filename); + Files.createDirectories(out.getParent()); + Files.write(out, bytes); + opts.fetchedThisItem.add(filename); + opts.localizedThisItem.put(absoluteUrl, filename); + if (!onLocalHost) { + System.out.println(" localized " + absoluteUrl + " -> " + filename + + " (" + bytes.length / 1024 + " KB)"); + } + if (bytes.length > SHRINK_ABOVE_BYTES) { + System.out.printf(" %s is %.1f MB -- run cleanup/images.py before committing%n", + filename, bytes.length / 1e6); } return opts.imageUrlPrefix + dirRel + filename; } catch (IOException e) { @@ -1314,6 +1491,70 @@ static String localizeImage(String absoluteUrl, Options opts, String itemSubpath } } + /** `.png` etc. when the URL path names its format, else null. */ + private static String urlExtension(URI uri) { + String path = uri.getPath(); + if (path == null) return null; + Matcher m = URL_IMAGE_EXTENSION.matcher(path); + return m.find() ? m.group().toLowerCase(Locale.ROOT) : null; + } + + /** + * The stem an external image is stored under: a readable piece of its own + * name plus 8 hex characters of its URL (see localizeImage for why the hash + * is mandatory). A URL with no usable name -- `.../max/1400/0*QMIuX6OHkdz` + * -- falls back to its host, so the file is still recognisable in a bundle. + */ + static String externalStem(String absoluteUrl, URI uri) { + String path = uri.getPath() == null ? "" : uri.getPath(); + String name = path.substring(path.lastIndexOf('/') + 1); + int dot = name.lastIndexOf('.'); + if (dot > 0) name = name.substring(0, dot); + name = name.replaceAll("[^A-Za-z0-9._-]", "-").replaceAll("-{2,}", "-"); + name = name.replaceAll("^[-.]+", "").replaceAll("[-.]+$", ""); + if (name.length() > 40) name = name.substring(0, 40).replaceAll("[-.]+$", ""); + if (name.isBlank() || name.chars().noneMatch(Character::isLetter)) { + String host = uri.getHost().toLowerCase(Locale.ROOT); + if (host.startsWith("www.")) host = host.substring(4); + name = host.replaceAll("[^a-z0-9]+", "-"); + } + return name + "-" + shortHash(absoluteUrl); + } + + /** First 8 hex characters of the SHA-256 of a URL. Stable across runs, which + * is what makes the existence check above a no-fetch fast path. */ + static String shortHash(String value) { + try { + byte[] d = MessageDigest.getInstance("SHA-256").digest(value.getBytes(java.nio.charset.StandardCharsets.UTF_8)); + StringBuilder sb = new StringBuilder(8); + for (int i = 0; i < 4; i++) sb.append(String.format("%02x", d[i])); + return sb.toString(); + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException("SHA-256 is required by every JDK", e); + } + } + + /** + * A file in dir whose name is `stem` plus any extension, or null. Extension- + * blind on purpose: it finds the file cleanup/images.py re-encoded (the stem + * never moves, only the suffix) and it answers for a URL whose own path + * carried no extension to begin with. A sibling fetched in THIS run is not a + * match, the same guard convertedSibling makes. + */ + static String findByStem(Path dir, String stem, Options opts) { + if (stem == null || !Files.isDirectory(dir)) return null; + try (Stream entries = Files.list(dir)) { + return entries + .map(p -> p.getFileName().toString()) + .filter(n -> n.startsWith(stem + ".") && !opts.fetchedThisItem.contains(n)) + .sorted() + .findFirst() + .orElse(null); + } catch (IOException e) { + return null; + } + } + /** * cleanup/images.py's container conversions -- source extension -> the extension * it writes. Each is a plain Path.with_suffix() there, so the stem never moves diff --git a/scripts/transfer/Posts.java b/scripts/transfer/Posts.java index 623d896c5..5005a8703 100644 --- a/scripts/transfer/Posts.java +++ b/scripts/transfer/Posts.java @@ -461,8 +461,12 @@ static PostData scrapePost(String url) throws IOException { HtmlToMarkdown.Options opts = new HtmlToMarkdown.Options( d.bundleDir, "", "foojay.io", USER_AGENT, REQUEST_TIMEOUT_MS); - // Pull the hero (og:image) local too, so it isn't hotlinked from the - // WordPress site that goes away at cutover. Non-foojay images are left as-is. + // Pull the hero (og:image) local too, so it isn't hotlinked -- from the + // WordPress site that goes away at cutover, or from a third-party host + // that can drop it whenever it likes. 60 posts hotlink their hero today + // and 10 of those URLs already 404, which on a hero means a blank card + // wherever the post is shared. localizeImage handles any host now, so + // verifyRemoteHero below is reached only when the download DIDN'T work. String localHero = HtmlToMarkdown.localizeImage(d.image, opts, ""); if (localHero != null) d.image = stillPoster(d.bundleDir, localHero); else d.image = verifyRemoteHero(d.bundleDir, d.image, d.slug); diff --git a/scripts/validate/Frontmatter.java b/scripts/validate/Frontmatter.java index 103e38079..d5f0990ef 100644 --- a/scripts/validate/Frontmatter.java +++ b/scripts/validate/Frontmatter.java @@ -1,6 +1,14 @@ ///usr/bin/env jbang "$0" "$@" ; exit $? //DEPS org.yaml:snakeyaml:2.2 -//JAVA 17+ +// 21, NOT 17: checkTitleEmoji's TITLE_EMOJI uses \p{IsExtended_Pictographic}, +// and Java's Unicode emoji properties (that one and the \p{IsEmoji} the comment +// there rejects) only arrived in JDK 21. On 17 the pattern does not fail where it +// is used -- it throws PatternSyntaxException from the static initialiser, so the +// WHOLE check dies before running a single rule. jbang honours this line, so a 17 +// here provisions exactly the JDK that cannot compile the pattern; that is what +// red-flagged PR #59, on a script that had been passing locally on 26 all along. +// Verified both ways: `jbang --java 17` reproduces the crash, `--java 21` passes. +//JAVA 21+ import org.yaml.snakeyaml.Yaml; diff --git a/themes/foojay/static/css/style.css b/themes/foojay/static/css/style.css index 213561364..5fac84226 100644 --- a/themes/foojay/static/css/style.css +++ b/themes/foojay/static/css/style.css @@ -2873,6 +2873,37 @@ body.lightbox-open { overflow: hidden; } .sponsors-cta h2 { margin: 0 0 .5rem; font-size: 1.35rem; } .prose .sponsors-cta h2 { margin-top: 0; } .sponsors-cta p { color: var(--ink-soft); } +/* The derived reach figures, as a bullet list inside a CENTRED card. Two + things make that work rather than look broken: the
      is inline-block, so + the list as a whole centres while its lines stay left-aligned (centred + bullet text is unreadable at three items), and the marker is drawn by + ::before rather than left to list-style, which cannot be positioned. + Both selectors are class-on-class because .prose ul and .prose li + li are + (0,1,1) and beat a single class -- the specificity trap that has already + bitten the series nav and the sitemap tables. */ +.prose .sponsors-cta__stats { + display: inline-block; + margin: 0 0 1.25rem; + padding: 0; + text-align: left; + list-style: none; + color: var(--ink-soft); +} +.prose .sponsors-cta__stats li { + position: relative; + margin: .3rem 0; + padding-left: 1.35rem; +} +.prose .sponsors-cta__stats li::before { + content: ""; + position: absolute; + left: .3rem; + top: .62em; + width: .4rem; + height: .4rem; + border-radius: 50%; + background: var(--brand-accent); +} .sponsors-cta__links { margin-bottom: 0; } .sponsor-mini-list { display: flex; flex-direction: column; gap: .85rem; }