<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>JTechLog - Viczián István magyar nyelvű Java blogja</title>
 <subtitle>Kötetlen hangvételű blog a Java világából</subtitle>
 <icon>https://www.jtechlog.hu/favicon.ico</icon>
 <link href="https://www.jtechlog.hu/atom.xml" rel="self"/>
 <link href="https://www.jtechlog.hu" rel="alternate"/>
 <updated>2026-04-06T17:06:39+00:00</updated>
 <id>https://www.jtechlog.hu</id>
 <author>
   <name>Viczián István</name>
 </author>

 
 <entry>
   <title>Magyarországi Web Konferencia 2026</title>
   <link href="https://www.jtechlog.hu/2026/04/06/magyarorszagi-web-konferencia-2026.html"/>
   <updated>2026-04-06T09:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2026/04/06/magyarorszagi-web-konferencia-2026</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/artifacts/posts/magyarorszagi-web-konferencia-2026/logo.svg&quot; alt=&quot;Magyarországi Web Konferencia 2026&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Újra megrendezik a &lt;a href=&quot;https://webkonf.hu/&quot;&gt;Magyarországi Web Konferenciát&lt;/a&gt; 2026. április 18-án, az Óbudai Egyetemen.&lt;/p&gt;

&lt;p&gt;Egyetlen nap alatt több mint húsz előadás közül lehet válogatni fejlesztés, web, DevOps, UX, AI, valamint low-code/no-code témákban. A &lt;a href=&quot;https://webkonf.hu/program&quot;&gt;program&lt;/a&gt; már elérhető, a részvétel pedig ingyenes, de regisztrációhoz kötött.&lt;/p&gt;

&lt;p&gt;Java témában is több előadás lesz: szó esik majd a servletekről, a párhuzamos programozásról (virtual threadek), a funkcionális megközelítésről, a Springről és a Play Frameworkről, valamint az AI-ról is.&lt;/p&gt;

&lt;p&gt;Én is tartok előadást &lt;em&gt;“Merre tart a Java és a Spring 2026-ban?”&lt;/em&gt; címmel.&lt;/p&gt;

&lt;p&gt;Ha érdekel a téma, gyere el — és ha ott leszel, szívesen beszélgetek veled személyesen is!&lt;/p&gt;

&lt;p&gt;Álljon itt az előadásom rövid összefoglalója:&lt;/p&gt;

&lt;p&gt;A Java továbbra is az egyik leggyorsabban fejlődő platform: félévente érkeznek az új verziók, legutóbb 2026 márciusában a Java 26. Az elmúlt kiadások alapján jól kirajzolódik, merre tart az ökoszisztéma. Az előadásban áttekintem a legfontosabb irányokat: performancia, párhuzamosság (virtual threads, structured concurrency), Data Oriented Programming, egyszerűbb tanulhatóság, integrálhatóság (Project Detroit), és természetesen az elmaradhatatlan AI. A Spring is megállíthatatlanul zakatol, a Boot már lassan a 4.1, a Framework a 7-es verziónál, és… az AI. Az előadás célja, hogy segítsen eligazodni a trendek között, és megmutassa, mely technológiákra érdemes már most felkészülni.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>ThreadLocal, Project Reactor Context és a Java 25 ScopedValue</title>
   <link href="https://www.jtechlog.hu/2026/03/15/context.html"/>
   <updated>2026-03-15T09:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2026/03/15/context</id>
   <content type="html">&lt;p&gt;Előfordul, hogy az egyik metódusból értéket kell átadnunk egy másik metódusnak anélkül, hogy azt paraméterként adnánk át.
Lehet ez amiatt, mert a két metódus között nincs közvetlen hívás, és nincs ráhatásunk a közbülső
metódusokra.&lt;/p&gt;

&lt;p&gt;Ilyen lehet pl. a bejelentkezett felhasználó, a tranzakció, vagy a log MDC.
Ezeket gyakran környezetnek (contextnek) nevezik, pl. Security Context, Transaction Context, Mapped Diagnostic Context.&lt;/p&gt;

&lt;p&gt;Másképp kell ezt megoldani Servlet API-ra épülő megoldásnál (ThreadLocal), pl. Spring MVC-nél, és máshogy reaktív módon,
pl. a Project Reactorra épülő Spring WebFlux esetén (context). Sőt, a 25-ös Javaban megjelent a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ScopedValue&lt;/code&gt; osztály a 
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ThreadLocal&lt;/code&gt; osztály kiváltására.&lt;/p&gt;

&lt;p&gt;A poszthoz tartozó példaprogram elérhető a &lt;a href=&quot;https://github.com/vicziani/jtechlog-context&quot;&gt;GitHubon&lt;/a&gt;.&lt;/p&gt;

&lt;iframe width=&quot;854&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/Md773sAecf8?si=b-DXAxQMmYO28T0q&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;A poszt még két videót tartalmaz.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Otthoni hálózat és labor (home lab)</title>
   <link href="https://www.jtechlog.hu/2026/01/24/otthoni-halozat-es-labor.html"/>
   <updated>2026-01-24T09:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2026/01/24/otthoni-halozat-es-labor</id>
   <content type="html">&lt;p&gt;Figyelem! A poszt nem AI-jal készült!&lt;/p&gt;

&lt;p&gt;Talán minden ott kezdődött, mikor az első Linux kernelt fordítottam egy 486-os PC-n.
A számítógéphez egy betárcsázós modem volt kötve, és a sötét szobában néztem, ahogy a konzolon
szaladnak végig a számomra érthetetlen sorok. Persze elhasalt. Majd újra elhasalt. De maradandó élmény volt, mikor
hiba nélkül végigfutott, és használatba vehettem az első saját kernelemet. (Azt ígérték, gyorsabb lesz,
hittem is, hogy gyorsabb, de valójában nem volt az.)&lt;/p&gt;

&lt;p&gt;Az egyetemen a gépteremben VAX/VMS-t használtunk, távoli terminállal, konzolos böngészővel és levelező programmal.
Fordítottam rajta Java forráskódot is. Percekig. Az asztali gépbe be volt dugva a külső winchester keret,
benne a saját disk, mi csak úgy hívtuk, rack. FTP-vel másoltam rá az MP3-akat az Internetről.&lt;/p&gt;

&lt;p&gt;Második munkahelyemen mondták: “Ha megírtad a programod, telepítsd is fel. Itt egy SSH elérés.”
Linux, JDK 1.4, Tomcat, 2008-at írunk. Ekkor még nem létezett a szó, DevOps.&lt;/p&gt;

&lt;p&gt;Később, mikor már komolyabb rendszerek fejlesztésében vettem részt, többször megfordultam nagyobb szervertermekben.
Egyszer bementünk a BIX-be, a Victor Hugo utcában. Mindig elvarázsoltak az embernyi rack szekrények,
rajta a villogó ledek, a deréknyi kötegek UTP kábelekből, és az RJ45 csatlakozó jellegzetes kattanása.&lt;/p&gt;

&lt;p&gt;Érdekes, gépet építeni sosem szerettem. Nem szerettem a SATA kábeleket, a PCI csatlakozókat, az elgörbült
CPU lábakat, a pasztázást, a jumpereket.&lt;/p&gt;

&lt;p&gt;Hálózatok 1 tantárgy teljesítéshez kötelező olvasmány volt a Tanenbaum-féle Számítógép-hálózatok könyv.
Nem varázsolt el. Most már igen, meg kellett rá érni.&lt;/p&gt;

&lt;p&gt;Mikor megjelent a Raspberry Pi, azonnal rendeltem. Sokáig a fiókban volt, de ma már folyamatosan megy.&lt;/p&gt;

&lt;p&gt;Ma a YouTube-on előszeretettel nézem azokat a timelaps videókat, ahol egy kábeldzsungelből egy rendezett
szervertermet varázsolnak. Ahol lelkes kollégák saját labor környezeteket (home hab) alakítanak ki, vagy egymás
megoldásaira reagálnak. (Párat meg is fogok osztani.)&lt;/p&gt;

&lt;p&gt;Eljött az idő, hogy én is kialakítsam az otthoni hálózatomat, és labor környezetemet.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/artifacts/posts/otthoni-halozat-es-labor/rack.jpg&quot; data-lightbox=&quot;post-images&quot;&gt;&lt;img src=&quot;/artifacts/posts/otthoni-halozat-es-labor/rack_380.jpg&quot; alt=&quot;Rack&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Java, Spring Boot natív fordítás</title>
   <link href="https://www.jtechlog.hu/2026/01/03/nativ-forditas.html"/>
   <updated>2026-01-03T09:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2026/01/03/nativ-forditas</id>
   <content type="html">&lt;p&gt;Cloudban egy viszonylag kevés erőforrással rendelkező virtuális gépen futtatok egy Spring Boot alkalmazást.
(Ez amúgy a &lt;a href=&quot;https://www.learnwebservices.com/&quot;&gt;Learn web services&lt;/a&gt; oldalamhoz készült példa alkalmazás,
mely CXF keretrendszerrel SOAP-os webszolgáltatást biztosít.)
Sajnos többször elfogyott a memória, így választhattam, hogy vagy natív binárist készítek belőle,
és bízom benne, hogy kevesebb memóriát foglal, vagy váltok egy erősebb gépre.&lt;/p&gt;

&lt;p&gt;Gondoltam itt az alkalom, hogy élesben kipróbáljam, hogy mit nyújt a GraalVM,
beváltja-e a hozzá fűzött reményeket. Külön érdekelt, hogy lesz-e gond a CXF
keretrendszerrel, melynek nincs GraalVM támogatása. Már most elárulom, a natív bináris
hetek óta fut gond nélkül.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Spring AI webinar a NETAcademián</title>
   <link href="https://www.jtechlog.hu/2025/10/22/netalive.html"/>
   <updated>2025-10-22T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2025/10/22/netalive</id>
   <content type="html">&lt;p&gt;A NETAcademia (, mely mögött a Training360 áll) NETA.live néven egy új, ingyenes előadássorozattal jelentkezik.&lt;/p&gt;

&lt;p&gt;Az első online webináron 2025. október 29-én 18:00-kor a Spring AI-ról fogok előadást tartani. Nem a hype-ot akarom tovább duzzasztani, hanem élő kódolás közben bemutatni a Spring AI lehetőségeit, azaz hogyan lehet LLM-hez kapcsolódni, RAG technikát alkalmazni, vagy egy MCP szervert fejleszteni, amit aztán agentek tudnak felhasználni.&lt;/p&gt;

&lt;p&gt;Az esemény alapvetően olyan Java fejlesztőknek szól, akik szeretnének megismerkedni a Spring AI képességeivel.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://netacademia.hu/pages/neta-live&quot;&gt;Regisztrálj az esemény oldalán&lt;/a&gt;, és kapcsolódj be te is a YouTube élő közvetítésbe, ahol kérdéseket is feltehetsz! Ha nem érsz rá, de regisztrálsz, akkor később is visszanézheted a felvételt.&lt;/p&gt;

&lt;iframe width=&quot;854&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/-hPa01Jo2lc?si=CDMb9jnSKI6q8Prv&quot; title=&quot;NETA.live webinar - Spring AI&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>Hogyan használják rosszul a BDD-t?</title>
   <link href="https://www.jtechlog.hu/2025/05/28/bdd-hibak.html"/>
   <updated>2025-05-28T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2025/05/28/bdd-hibak</id>
   <content type="html">&lt;p&gt;A Behavior-Driven Development (röviden BDD) már egy 2000-es évek elejétől létező
módszer. Még a mai napig is sokan használják, sőt vezetik be létező vagy
új projekteken.&lt;/p&gt;

&lt;p&gt;Sajnos azonban azt vettem észre, hogy sokan félreértik és hibásan használják.
Az Interneten is rengeteg rossz példa terjed, sőt a különböző nagy nyelvi
modellek is hibás megoldásokat hoznak (nyilván az előbbi példák alapján), ezekből is
fogok többet is mutatni.
Ezzel azonban nem segíti, hanem inkább hátráltatja a projekt előrehaladását.&lt;/p&gt;

&lt;p&gt;Ebben a posztomban megpróbálom összegyűjteni, hogy hol lehet elrontani a BDD
használatát, valamint milyen rossz gyakorlatokat látok a mai napig.
Saját tapasztalatokat és erősen szubjektív elemeket is tartalmaz.
Ez a korábbi &lt;a href=&quot;https://www.jtechlog.hu/2022/08/20/fejlesztok-es-tesztelok.html&quot;&gt;Fejlesztőként mivel akadályozom a tesztelők munkáját?&lt;/a&gt;
írásom folytatásaként is felfogható.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Spring Data JPA és a Blaze-Persistence</title>
   <link href="https://www.jtechlog.hu/2025/01/05/jpa-es-blaze-persistence.html"/>
   <updated>2025-01-05T09:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2025/01/05/jpa-es-blaze-persistence</id>
   <content type="html">&lt;h2 id=&quot;bevezetés&quot;&gt;Bevezetés&lt;/h2&gt;

&lt;p&gt;A JPA, új nevén Jakarta Persistence egy szabvány, mely relációs adatbázisok elérését teszi lehetővő, object-relational mapping (ORM) használatával. Ennek különböző implementációi vannak, talán a legelterjedtebb a Hibernate. A Jakarta Persistence-re épül a Spring Data JPA, ami a repository mintát valósítja meg, valamint újabb lehetőségeket is az a JPA-hoz.&lt;/p&gt;

&lt;p&gt;A JPA azonban nem fejlődik olyan dinamikusan, valamint több megszorítás, illetve kényelmetlenség is van benne.&lt;/p&gt;

&lt;p&gt;Kényelmetlen a Criteria API használata, valamint korlátozott a DTO-k kezelése.
Valamint nem támogat olyan hatékony SQL megoldásokat, mint a Window Functions vagy a Common Table Expression (CTE).&lt;/p&gt;

&lt;p&gt;Ezeken egyrészt próbál segíteni a konkrét implementáció, mint pl. a Hibernate. (Ekkor persze elszakadunk a szabványtól.)
Valamint a Spring Data JPA-val is több problémát próbál orvosolni. Vagy választhatjuk a mindkét előbbi technológiához jól illeszkedő Blaze-Persistence-t is kiegészítésül, mely további lehetőségeket rejt.&lt;/p&gt;

&lt;p&gt;A példa alkalmazás forráskódja megtalálható a &lt;a href=&quot;https://github.com/vicziani/jtechlog-blaze&quot;&gt;GitHubon&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Események a Spring Modulith-ban</title>
   <link href="https://www.jtechlog.hu/2024/07/24/spring-modulith-esemenyek.html"/>
   <updated>2024-07-24T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2024/07/24/spring-modulith-esemenyek</id>
   <content type="html">&lt;p&gt;Következő videóm témája, hogy egy modularizált alkalmazás felépítésekor az eseménykezelés segít nekünk abban,
hogy a modulok lazán kapcsolódjanak egymáshoz. A Spring Modulith ezt kiegészíti, biztosabbá teszi a hiba- és tranzakciókezelést, valamint képes
ezeket az eseményeket más service-ek felé is elküldeni valamilyen message brokeren keresztül.&lt;/p&gt;

&lt;p&gt;Lesz szó modularizált alkalmazásról, eseménykezelésről, Spring Modulithról, tranzakciókezelésről, Testcontainersről, Kafkáról.&lt;/p&gt;

&lt;iframe width=&quot;854&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/pofgNVVaoEE?si=hnf4EMP5CxhR5Bko&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;A példa alkalmazás forráskódja megtalálható a &lt;a href=&quot;https://github.com/vicziani/jtechlog-spring-modulith&quot;&gt;GitHubon&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A Spring Modulit modulkezeléséről írtam korábban egy posztot &lt;a href=&quot;/2022/12/19/spring-modulith.html&quot;&gt;Modularizált alkalmazás fejlesztése a Spring Modulith-tal&lt;/a&gt; címmel.&lt;/p&gt;

&lt;p&gt;A poszt végén a videóhoz képest &lt;em&gt;extra tartalom&lt;/em&gt; is van.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Bevezetés a Testcontainers használatába Spring Boot alkalmazásban</title>
   <link href="https://www.jtechlog.hu/2024/07/16/testcontainers.html"/>
   <updated>2024-07-16T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2024/07/16/testcontainers</id>
   <content type="html">&lt;p&gt;Megjelent az első videóm, melynek témája, hogy hogyan lehet használni a Testcontainers-t Spring Boot alkalmazásban.&lt;/p&gt;

&lt;iframe width=&quot;854&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/p7oy3VCGBbo?si=ya31H8N8AlXAFXRp&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;A videóhoz a forráskód is elérhető a &lt;a href=&quot;https://github.com/vicziani/jtechlog-testcontainers&quot;&gt;GitHubon&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ha valaki mégis a szöveges tartalomhoz ragaszkodik, olvasson tovább.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>OAuth 2.0 támogatás a Spring Boot 3.3-ban és a Pécs IT Meetup</title>
   <link href="https://www.jtechlog.hu/2024/06/27/spring-security-pecs-meetup.html"/>
   <updated>2024-06-27T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2024/06/27/spring-security-pecs-meetup</id>
   <content type="html">&lt;p&gt;A Spring Boot 3.3 verzióban tovább egyszerűsítették az OAuth 2.0 integrációt.
Az előző verziók esetén, amennyiben a JWT tokenben a felhasználónév nem a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sub&lt;/code&gt; claim alatt szerepelt,
saját magunk kellett ezt kiolvasni, pl. egy saját &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JwtDecoder&lt;/code&gt; bean
megadásával. Amennyiben a JWT token tartalmazta a szerepköröket is,
saját &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JwtAuthenticationConverter&lt;/code&gt; beant kellett felvennünk, mely
képes volt a szerepkörök kiolvasására.&lt;/p&gt;

&lt;p&gt;Erre a Spring Boot 3.3 verziótól kezdve nincs szükség, hiszen beállíthatjuk ezt
az &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;application.properties&lt;/code&gt; állományban, és a Spring Boot
automatikusan konfigurál egy &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JwtAuthenticationConverter&lt;/code&gt; (vagy reaktív
esetben egy &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ReactiveJwtAuthenticationConverter&lt;/code&gt; beant).&lt;/p&gt;

&lt;p&gt;Ezt is említettem a &lt;a href=&quot;https://www.meetup.com/pecs-it-meetup/events/301596694&quot;&gt;XV. Pécs IT Meetupon&lt;/a&gt;.
A meghívást ezennel is köszönöm a Kovács Bálintnak, a meetup egyik szervezőjének,
aki többedmagával a &lt;a href=&quot;https://www.webstar.hu/&quot;&gt;Webstar&lt;/a&gt; céget is képviselte.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/artifacts/posts/2024-06-27-spring-security-pecs-meetup/meetup.webp&quot; alt=&quot;XV. Pécs IT Meetup&quot; /&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Telemetria és a Java</title>
   <link href="https://www.jtechlog.hu/2024/06/11/telemetria-es-java.html"/>
   <updated>2024-06-11T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2024/06/11/telemetria-es-java</id>
   <content type="html">&lt;p&gt;Napjainkban a telemetria egy nagyon fejlődő terület, napról napra jelennek meg új eszközök
és szabványok, melyeket igen nehéz nyomonkövetni. 
Ez a poszt ebben szeretne egy kis rendet tenni, hiszen úgy lehet valamit a legjobban megismerni,
hogyha másoknak elmagyarázod.&lt;/p&gt;

&lt;p&gt;A telemetria (&lt;em&gt;telemetry&lt;/em&gt;) klasszikusan egy rendszer különböző elemein mérési adatok előállítása és továbbítása egy központi
helyre. Ennek célja, hogy a múltbéli és jelenlegi adatok elemzésével meg lehessen bizonyosodni a rendszer
helyes működéséről, észlelni, esetleg előre jelezni lehessen annak hibáit. Erre különböző eszközöket és folyamatokat
használunk, melyek biztosítják a rendszer folyamatos megfigyelhetőségét (&lt;em&gt;observability&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Szoftverrendszer esetén is pontosan erről van szó, különböző mérési adatokat állítunk elő különböző szinteken,
pl. operációs rendszer szinten mérjük a CPU, memória és lemezhasználatot, de alkalmazás/szolgáltatás szinten
mérhető a bejelentkezett felhasználók, beérkező kérések, tranzakciók száma, válaszidők.
Ezen adatokból kinyert információkból következtethetünk a szoftver állapotára, hibára.
A túl magas válaszidő biztos valami problémára utal, de az rossz jel lehet, ha hirtelen lecsökken 
a tranzakciószám.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>AWS Lambda és a Spring Cloud Function</title>
   <link href="https://www.jtechlog.hu/2024/05/10/amazon-lambda.html"/>
   <updated>2024-05-10T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2024/05/10/amazon-lambda</id>
   <content type="html">&lt;p&gt;Az AWS Lambda egy AWS szolgáltatás, mely lehetővé teszi, hogy a különböző programozási nyelven
megírt alkalmazásainkat (függvényeinket) anélkül tudjuk futtatni, hogy gondunk lenne az
azt kiszolgáló infrastruktúrára. A szolgáltatás a serverless computing kategóriába tartozik,
ami kicsit megtévesztő, hiszen itt is van futtató környezet, azonban ez számunkra
láthatatlan. A másik ismert megnevezése a Function as a Service (FaaS). Természetesen
más cloud szolgáltatóknak is van hasonló megoldásuk, a Microsoftnál az Azure Functions, a Google-nél
a Cloud Functions.&lt;/p&gt;

&lt;p&gt;A függvények tipikusan valamilyen beérkező eseményre reagálnak, ami lehet egy felhasználói kérés,
valamilyen üzenet más szolgáltatás (pl. S3) felöl, vagy üzenet
brókeren keresztül beérkező üzenet, pl. valamilyen IoT eszköz, vagy alkalmazás irányából.
Miután megírjuk a választott programozási nyelven a függvényünket, azt össze kell csomagolni,
és telepíteni. Ez lehet akár egy tömörített fájl, akár egy container image. 
A szolgáltatás rugalmassága miatt ma akár bármilyen programozási nyelven írhatunk ilyen
függvényeket.&lt;/p&gt;

&lt;p&gt;A futtatókörnyezettel nem kell foglalkozni, azt a szolgáltatás önmaga kezeli. Ez magában foglalja
a hardvert és az operációs rendszert, annak frissítését, erőforrás kezelést, automatikus skálázást és
naplózást. És fizetnünk is csak annyit kell, amennyit futott a függvényünk, idő alapján (ezredmásodperc alapon).&lt;/p&gt;

&lt;p&gt;A kód futtatása természetesen konténerekben történik, melyek tartalmazzák az adott programozási nyelv 
futtatókörnyezetét. Azonban a szolgáltatás nem mindig indít minden bejövő eseményhez új
konténert, hanem megpróbálja azokat újrahasznosítani. Ennek egyik következménye,
hogy bizonyos kérések kiszolgálása tovább tart, mikor a konténert el kell indítani (ún. cold start).
Bizonyos kérések kiszolgálása azonban nagyon gyorsan megtörténik (ún. warm start).
A nem használt konténereket a szolgáltatás automatikusan leállítja.
Másrészt mivel a kérések kiszolgálása ugyanabban a konténerben futhat, lehet ezeknek egymásra hatása (pl. ha
használják a fájlrendszert).&lt;/p&gt;

&lt;p&gt;Egy AWS Lambda konténer rendelkezésére álló memória konfigurálható 128 és 10240 MB között, természetesen egy ezredmásodperc
ára is annál nagyobb, minél több memóriát használ a konténer. Valamint 512 MB és 10240 MB között tudunk hozzá
tárhelyet is rendelni, minél többet, annál nagyobb felárral.&lt;/p&gt;

&lt;p&gt;Amennyiben saját image-t állítunk elő, először a Amazon Elastic Container Registry (Amazon ECR)
szolgáltatásba kell feltöltenünk.&lt;/p&gt;

&lt;p&gt;Ha a Lambda függvényünket REST-en akarjuk meghívni, akkor még az API Gateway szolgáltatást kell használnunk.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/artifacts/posts/2024-03-27-amazon-lambda/aws.drawio.svg&quot; alt=&quot;Architektúra&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ezek alapján mikor érdemes az AWS Lambdát használni? Olyan funkciók megvalósítására ideális, 
amik eseményekre reagálnak, nincs rá folyamatosan szükségünk, nem kell azonnali választ adnunk, 
és az üzenetek beérkezése nem egyenletes.
Ilyen lehet pl. a kép- és videófeldolgozás, bejövő események adatainak aggregálása, (PDF) dokumentumok generálása.&lt;/p&gt;

&lt;p&gt;Vannak azonban esetek, amelyeknél el kell gondolkodnunk, hogy tényleg az AWS Lambda-e a jó választás.
Ilyenek például a klasszikus webes alkalmazások. Itt egy gyenge forgalom esetén lehet, hogy a cold start miatt
nagyobb lesz a válaszidő. Valamint egy nagyon nagy terhelésű alkalmazás esetén pedig lehet, hogy az idő alapú
számlázás nem a legkedvezőbb.&lt;/p&gt;

&lt;p&gt;A Spring Cloud Function egy olyan projekt, mely a Spring ökoszisztéma tagja, Spring Boothoz illeszkedik, és segítségével az üzleti logikát
Java 8 funkcionális interfészek implementálásával tudjuk megvalósítani. Ezáltal teljesen leválasztja az infrastruktúrális
elemekről. Azonban adapterekkel, konfigurációt használva össze tudjuk kapcsolni az üzleti logikát különböző
szolgáltatásokkal, pl. AWS Lambdaval is. A Spring Cloud Stream használatával pedig különböző message brokerrekkel, mint
pl. RabbitMQ-val vagy Apache Kafkával.&lt;/p&gt;

&lt;p&gt;Mivel nem mindegy, hogy a function mennyi memóriát használ, és mennyi idő alatt indul el, ezért a Java bytekód nem feltétlenül
a legjobb választás. Azonban a Spring Boot alkalmazásokat könnyű natívvá fordítani.&lt;/p&gt;

&lt;p&gt;Ebben a posztban azt mutatom be, hogyan lehet egy natívra fordított, Spring Cloud Functiont használó 
alkalmazást AWS Lambda függvényként futtatni.&lt;/p&gt;

&lt;p&gt;(A példa ingyenesen kipróbálható az &lt;a href=&quot;https://aws.amazon.com/free&quot;&gt;AWS Free Tier&lt;/a&gt; használatával. Bankkártya adatok megadása szükséges.)&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Project Reactor és a szálkezelés</title>
   <link href="https://www.jtechlog.hu/2024/02/01/project-reactor-szalkezeles.html"/>
   <updated>2024-02-01T09:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2024/02/01/project-reactor-szalkezeles</id>
   <content type="html">&lt;p&gt;A Project Reactor egy Springhez közel álló reaktív könyvtár. Erre épül a Spring Framework 5-ben megjelent WebFlux webes keretrendszer
reaktív webes alkalmazások készítésére. Ez nagyban hasonlít a Spring MVC-re, azonban reaktív módon működik.
Ezzel találkozhatunk akkor is, ha &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WebClient&lt;/code&gt;-et használunk REST webszolgáltatások hívására
(ez a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RestTemplate&lt;/code&gt;-et hivatott leváltani, de úgy tűnik, hogy mégis szükség van egy szinkron megvalósításra is,
ezért jelent meg a 6.1-es Spring Frameworkben a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RestClient&lt;/code&gt;). A reaktív elvekről és keretrendszerekről
már írtam a &lt;a href=&quot;https://www.jtechlog.hu/2021/08/03/reaktiv-programozas.html&quot;&gt;Reaktív programozás&lt;/a&gt; posztomban.&lt;/p&gt;

&lt;p&gt;A Reactor ún. &lt;em&gt;concurrency-agnostic&lt;/em&gt;, ami azt jelenti, hogy nem erőltet ránk semmilyen párhuzamossági modellt.
Azonban a fejlesztőnek lehetőséget ad a szálak használatára.&lt;/p&gt;

&lt;p&gt;Ez a poszt azzal foglalkozik, hogy lehet szálakat használni, hogyan befolyásolja a szálak
használatát a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;publishOn&lt;/code&gt; és &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;subscribeOn&lt;/code&gt; operátor (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mono&lt;/code&gt; és &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Flux&lt;/code&gt; osztályokban lévő metódusok).&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>A REST API hypertext-driven legyen</title>
   <link href="https://www.jtechlog.hu/2023/10/11/hateoas.html"/>
   <updated>2023-10-11T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2023/10/11/hateoas</id>
   <content type="html">&lt;p&gt;Bár erős vitákat tapasztalok a REST körül, valahogy a hypertext-driven API-val
ritkán találkozom.&lt;/p&gt;

&lt;p&gt;Roy T. Fielding, a REST megálmodója a gyakran idézett &lt;a href=&quot;https://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven&quot;&gt;REST APIs must be hypertext-driven&lt;/a&gt;
cikkjében a következőt mondja:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;In other words, if the engine of application state (and hence the API) is not being driven by hypertext, then it cannot be RESTful and cannot be a REST API. Period.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Erre erősít rá a &lt;a href=&quot;https://martinfowler.com/articles/richardsonMaturityModel.html&quot;&gt;Richardson Maturity Model&lt;/a&gt; is, mely
három lépésben mutatja be a REST alapvető elemeit:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Level 1 - Resources&lt;/li&gt;
  &lt;li&gt;Level 2 - HTTP Verbs&lt;/li&gt;
  &lt;li&gt;Level 3 - Hypermedia Controls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;És egy API csak akkor nevezhető RESTfulnak, ha az összes szinten leírtakat teljesíti, igen a hypermedia control használatát is.&lt;/p&gt;

&lt;p&gt;De mit is jelent ez? Az állítás egyszerű: a kliensnek minden előzetes tudás nélkül igénybe kell tudnia venni a
RESTful API mögötti szolgáltatásokat, és ez linkek segítségével valósulhat meg.&lt;/p&gt;

&lt;p&gt;Pl. az előző &lt;a href=&quot;/2023/08/31/workflow-es-rest.html&quot;&gt;Workflow REST API-n posztomban&lt;/a&gt; szereplő Issue Tracker alkalmazás
a következőképp adja vissza a hibajegyek listáját:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;_embedded&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;jtl:issueResourceList&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Write a post about REST&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;state&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;NEW&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;_links&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;self&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;href&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://localhost:8080/api/issues/1&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;actions&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;href&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://localhost:8080/api/issues/1/actions&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;_links&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;self&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;href&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://localhost:8080/api/issues&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Látható a hibajegyek listáját reprezentáló URL-jét tartalmazó &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;self&lt;/code&gt; link, valamint hibajegyenként
a hibajegyet reprezentáló URL-jének linkje szintén &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;self&lt;/code&gt; névvel, valamint a hibajegyhez tartozó
lépéseket reprenzentáló URL &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;actions&lt;/code&gt; névvel.&lt;/p&gt;

&lt;p&gt;Ez a Hypermedia as the engine of application state (HATEOAS), melyet szintén Roy T. Fielding
vezetett be a disszertációjában. A HATEOAS szerint a szerver a kliens számára
linkekkel jelzi, hogy mit tehet.&lt;/p&gt;

&lt;p&gt;Az elv mögötte az, hogy a REST API-t is úgy lehessen használni, mint a webet. Ahol vannak oldalak és
linkek és semmilyen előzetes információra nincs szükségem a használatához.&lt;/p&gt;

&lt;p&gt;Hogy hogyan viszonyul ez az OpenAPI-hoz (Swaggerhez)? Elvileg a cél ugyanaz, és míg a HATEOAS
a REST gonolatiságához illeszkedik, az OpenAPI inkább az RPC-hez.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Workflow REST API-n</title>
   <link href="https://www.jtechlog.hu/2023/08/31/workflow-es-rest.html"/>
   <updated>2023-08-31T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2023/08/31/workflow-es-rest</id>
   <content type="html">&lt;p&gt;Bár kétségtelenül a REST a legelterjedtebb kommunikációs mód, akár ugyanolyan
platformon fejlesztett alkalmazások között is, REST API tervezéskor
nekem sok kérdés merül fel, melyre nem kapok megnyugtató választ,
és sok olyan megoldással találkozom, amelyek nem felelnek meg a REST elveknek,
vagy egyszerűen csak nem tetszenek.&lt;/p&gt;

&lt;p&gt;Sokáig próbáltam megfogalmazni, hogy mi az alapvető problémám, és talán most
sikerült közelebb kerülni. Vegyünk két microservice-t, melyek mindegyike Javaban készült,
Spring Boot használatával. Mindkét oldalon a programozási nyelv alapeleme az osztályok,
ahol érvényesül az egységbezárás, azaz az attribútumok mellett ott vannak
a metódusok, a megfelelő paraméterekkel és visszatérési értékekkel. Ez
a legtöbb fejlesztőnek triviális.&lt;/p&gt;

&lt;p&gt;A REST a kettő között viszont egy teljesen
más absztrakció. Bár a REST nem mondja ki, hogy csak HTTP-vel együtt használható,
más protokollal működni még nem láttam.
A REST alapfogalma az erőforrás, és az azon végzett műveletek, melyeket a HTTP metódusok valósítanak meg, mint a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GET&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POST&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUT&lt;/code&gt; és &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DELETE&lt;/code&gt;.
Ez nehezen feleltethető meg az objektumorientált világnak.
Egy objektum létrehozására tipikusan konstruktort használunk, ebből nem feltétlen egy van.
Ezen kívül egy objektumnak lehet több metódusa, amik nem feltétlenül feleltethetőek meg a HTTP metódusoknak,
hiszen nem csak ezeket az alapműveleteket használjuk, valamint lehet belőle sokkal több is, mint négy.
Míg a Java nyelv szabvány, addig a REST csak egy ajánlás, és az sincs megfelelően
definiálva, hogy hogyan kéne implementálni, az meg aztán pláne nincs, hogy a kettőt
hogyan feleltessük meg egymásnak. És ennek az az eredménye, hogy minden projekten
teljesen más megoldásokat látok, a legtöbb helyen kompromisszumokkal.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/artifacts/posts/2023-08-31-workflow-es-rest/absztakciok.png&quot; alt=&quot;Absztrakciók&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Az RPC alapú kommunikáció esetén igazából nincs ilyen probléma, mert nem szükséges
átfordítás, nincs szükség az absztrakció váltására. Hiszen ott is eljárások vannak,
paraméterekkel és visszatérési értékekkel. A Spring Frameworkben volt is ilyen
lehetőség, hogy egy távoli eljáráshívás történt, azonban a protokollt
kódolás nélkül cserélni lehetett alatta, pl. választhattunk RMI-t, 
vagy ki emlékszik még a Hessian és Burlap protokollokra.
Sajnos ez azóta eltűnt.
A SOAP esetén sem volt akkora probléma az átfordítás, hiszen ott is vannak
az operációk (eljárásnak felel meg), és a paraméter, valamint a visszatérési
érték is egy-egy (XML) dokumentum. Vannak modernebb RPC alapú kommunikációs
protokollok is, mint pl. JSON-RPC, vagy az egyre inkább elterjedő 
multiplatform gRPC, bináris Protocol Buffers formátummal.&lt;/p&gt;

&lt;p&gt;Amennyiben CRUD alkalmazásról van szó, a REST használata talán triviális. De ha 
egy olyan alkalmazásról beszélünk, amiben komoly üzleti logika van (és hiszem,
hogy a legtöbb alkalmazásnak ilyennek kéne lennie, csak a fejlesztők “butítják le”
CRUD alkalmazássá, amely végső soron oda is vezethet, hogy borzasztó felhasználói 
felületek kerülnek kifejlesztésre), akkor már több kérdés merül fel.&lt;/p&gt;

&lt;p&gt;Vegyünk például egy hibajegykezelő alkalmazást (issue tracker), mely rendelkezzen egy minimális
üzleti logikával. Ha hibajegy kerül felvételre, az &lt;em&gt;új&lt;/em&gt; (&lt;em&gt;new&lt;/em&gt;) állapottal kerül létrehozásra.
Amennyiben valaki elkezd rajta dolgozni, átkerül &lt;em&gt;folyamatban&lt;/em&gt; (&lt;em&gt;in_progress&lt;/em&gt;) állapotba.
Amennyiben elkészült, átkerül &lt;em&gt;megoldott&lt;/em&gt; (&lt;em&gt;resolved&lt;/em&gt;) állapotba. Bár a legtöbb hibajegykezelő
alkalmazás lehetővé teszi, hogy egyedi munkafolyamatot lehessen benne létrehozni,
ettől most tekintsünk el, mert akkor megint más problémák merülnek fel.
Ezt egy egyszerű állapotdiagrammal lehet a legegyszerűbben szemléltetni.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/artifacts/posts/2023-08-31-workflow-es-rest/allapotatmenet-diagram.png&quot; alt=&quot;Absztrakciók&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Talán egy hibajegy felvételét még el tudom képzelni REST API-n (bár már ott is vannak
kérdéseim), azonban a különböző munkafolyamat lépések implementálásakor már 
bizonytalanabb vagyok. Ez a poszt ezt a problémakört járja körbe,
forráskódokkal alátámasztva.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Hőmérséklet monitorozása</title>
   <link href="https://www.jtechlog.hu/2023/08/18/homerseklet-monitorozas.html"/>
   <updated>2023-08-18T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2023/08/18/homerseklet-monitorozas</id>
   <content type="html">&lt;p&gt;Nagyon régóta érdekel az IoT (Internet of Things, azaz Internetre köthető kütyük) világa, ugyanis ezek azok az eszközök,
melyek összekötik a virtuális világót a való világgal. Már régóta &lt;a href=&quot;2013/12/30/raspberry-pi-alapok.html&quot;&gt;rendelkezem egy Raspberry PI számítógéppel&lt;/a&gt;,
melyet azóta is lelkesen használok egy alacsony fogyasztású home serverként. Telepítve van rá a Prometheus és Grafana, mely
a DevOps világban egy kvázi standard monitorozó eszköz. Mindkettő ingyenesen használható, nyílt forráskódú eszköz.
A Prometheus különösen alkalmas idősorok hatékony tárolására, gyors lekérdezésére, aggregált műveletek végrehajtására. Az idősorok
olyan megfigyelések, melyeket egymást követő időpontokban (időszakokban) regisztrálták, és ez az időbeliség az adatok fontos tulajdonsága.
Ilyen például egy szerverrel kapcsolatban a bizonyos időpontokban lekérdezett CPU és memóriahasználat, vagy a háttértárakon lévő szabad
hely mérete. A Grafana használatával ezeket tudjuk vizualizálni, gyönyörű dashboardokat létrehozni és akár riasztásokat
beállítani.&lt;/p&gt;

&lt;p&gt;De melyik is lehet az az IoT eszköz, melyet a legegyszerűbben, lehetőleg barkácsolás nélkül és olcsón lehetne bekötni ebbe a rendszerbe?
Már régóta szemezem a Xiaomi Mi Temperature and Humidity Monitor 2 hőmérséklet-, és páratartalom mérővel, amihez most 2000 Ft-ért
lehet hozzájutni az &lt;a href=&quot;https://mstore.hu/xiaomi-mi-temprerature-humidity-monitor-2-1473&quot;&gt;mStore akciója keretében&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/artifacts/posts/2023-08-18-homerseklet-monitorozas/xiaomi-temperature-and-humidity-monitor.jpg&quot; alt=&quot;Xiaomi Mi Temperature and Humidity Monitor 2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ez pontosan a LYWSD03MMC modell, mely egy precíz Sensirion szenzorral, 1,5”-os LCD kijelzővel rendelkezik, és Bluetooth 4.2 BLE
vezeték nélküli kapcsolaton keresztül kommunikál. Egy CR2032 elemmel működik, ezt külön szerezzük be, mert nem része
a csomagnak. Ezzel akár fél-egy évig képes üzemelni. Természetesen Bluetooth-on tud kapcsolódni mobiltelefonhoz, illetve
Bluetooth Gateway-hez, azonban én direktbe, egy Linuxos számítógéppel, jelen esetben egy Raspberry PI-vel szeretnék
hozzá kapcsolódni, és kinyerni belőle az adatokat. (Nincs szükség egyedi firmware telepítésére.)&lt;/p&gt;

&lt;p&gt;Ezt utána csak be kell kötni a Prometheusba, mely időközönként lekérdezi és eltárolja az adatokat, majd egy Grafana dashboardot
létrehozni, mely megjeleníti azokat.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/artifacts/posts/2023-08-18-homerseklet-monitorozas/dashboard.png&quot; data-lightbox=&quot;post-images&quot;&gt;&lt;img src=&quot;/artifacts/posts/2023-08-18-homerseklet-monitorozas/dashboard_700px.png&quot; alt=&quot;Grafana dashboard&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Közben természetesen szerettem volna megismerni a kapcsolódó technológiákat is.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>JTechLog Technology Radar</title>
   <link href="https://www.jtechlog.hu/2023/08/12/technology-radar.html"/>
   <updated>2023-08-12T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2023/08/12/technology-radar</id>
   <content type="html">&lt;p&gt;Emlékszem régebben mennyire nagy esemény volt mindig, mikor kijött a Thoughtworks
&lt;a href=&quot;https://www.thoughtworks.com/radar&quot;&gt;Technology Radar&lt;/a&gt; legfrissebb kiadása.
A Thoughtworksről annyit kell tudni, hogy 1999-ben csatlakozott a céghez
Martin Fowler, és több munkatársával együtt jelentős és meghatározó könyveket írtak,
melyeket én is javaslok elolvasni. Ezek például:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Martin Fowler - Refactoring&lt;/li&gt;
  &lt;li&gt;Martin Fowler - Patterns of Enterprise Application Architecture&lt;/li&gt;
  &lt;li&gt;Jez Humble, David Farley - Continuous Delivery&lt;/li&gt;
  &lt;li&gt;Sam Newman - Building Microservices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A cég mindig nagyon haladó gondolkodású volt, és bizonyos időközönként
közreadta a Technology Radart, melyben grafikusan ábrázolták, hogy mi is
a véleményük az épp aktuális technológiákról, eszközökről, módszertanokról.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Gondolatok a modell osztályokról, entitásokról, DTO-król</title>
   <link href="https://www.jtechlog.hu/2023/08/01/modell-osztalyok.html"/>
   <updated>2023-08-01T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2023/08/01/modell-osztalyok</id>
   <content type="html">&lt;p&gt;Nagyon szeretem azokat az írásokat, melyek különböző területekről származó fogalmakat
próbálnak valamilyen egységes rendszerbe foglalni, a fogalmaknak egységes elnevezést 
adni. Ilyen volt a 
&lt;a href=&quot;https://reflectoring.io/book/&quot;&gt;Tom Hombergs - Get Your Hands Dirty on Clean Architecture (2nd edition)&lt;/a&gt;
könyv, mely a modell osztályokkal próbálta ezt tenni. Különösen tetszett, hogy nem egy megoldást
fogad el igaznak, hanem ismerteti a különböző megoldásokat, összehasonlítva azok előnyeit és hátrányait.&lt;/p&gt;

&lt;p&gt;A mostanában  fejlesztett alkalmazások vagy a klasszikus háromrétegű (3-layer) architektúrával készülnek,
vagy a modernebb Hexagonal vagy Clean Architecture-t használják.&lt;/p&gt;

&lt;p&gt;Egy klasszikus Spring Boot alkalmazás esetén a három réteg a repository, service, controller.
Java EE esetén ez a web, üzleti és EIS (Enterprise Information System) rétegek. Én egységesen
úgy fogok rájuk hivatkozni, hogy prezentációs, üzleti logika és perzisztens réteg.&lt;/p&gt;

&lt;p&gt;Clean Architecture esetén is megjelennek ezek, az alapvető különbség a függőségek irányában van,
hiszen amíg a klasszikus háromrétegű alkalmazás esetén az üzleti logika réteg függ a perzisztens
rétegtől, addig a Clean Architecture esetén a perzisztens réteg függ az üzleti logika rétegtől.&lt;/p&gt;

&lt;p&gt;Minden rétegben szükség van azonban az adatokat tároló osztályokra, nevezzük ezeket modell osztályoknak.
Manapság ezek egyszerű POJO (Plain Old Java Object) osztályok, pár attribútummal, konstruktorokkal, getter/setter metódusokkal.&lt;/p&gt;

&lt;p&gt;Kérdés, hogy ebbe a fogalomrendszerbe hogyan illeszkednek be az entitások, DTO-k, stb.?
Melyik rétegben helyezkednek el? Illetve kell-e, és hogyan kell ezek között a megfeleltetést elvégezni (mapping), 
konvertálni?
Ez a poszt ebben próbál egyfajta rendet tenni.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Spring Security és Spring Boot</title>
   <link href="https://www.jtechlog.hu/2023/03/28/spring-security-spring-boot.html"/>
   <updated>2023-03-28T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2023/03/28/spring-security-spring-boot</id>
   <content type="html">&lt;p&gt;Frissítve: 2023. november 15.&lt;/p&gt;

&lt;p&gt;Technológiák: Spring Security 6.1, Spring Boot 3.1, Thymeleaf, Spring Data JPA, H2&lt;/p&gt;

&lt;p&gt;(Azért írtam meg ezt a posztot, mert sokan kerestek a Spring Security-re,
továbbá 2022 novemberében kijött a Spring Security 6 és Spring Boot 3, valamint
teljesértékű Spring Security poszt Spring Boottal eddig hiányzott. 
A &lt;a href=&quot;/2010/01/10/spring-security.html&quot;&gt;Spring Security használata Springgel Frameworkkel poszt&lt;/a&gt; 
továbbra is elérhető.)&lt;/p&gt;

&lt;p&gt;A Spring Security egy olyan keretrendszer, mely támogatja az autentikációt,
autorizációt és védelmet biztosít bizonyos támadási formák ellen. A Spring Security
a de-facto szabványos eszköz a biztonság megvalósítására Springes alkalmazásokon belül.&lt;/p&gt;

&lt;p&gt;A Spring Security támogatja a felhasználónév és jelszó párossal történő bejelentkezést,
de ezen kívül pl. webszolgáltatások védelmére támogatja a HTTP BASIC, HTTP Digest
és tanúsítvány alapú bejelentkezést, sőt az OAuth 2.0 használatát is.&lt;/p&gt;

&lt;p&gt;A felhasználók és a hozzá kapcsolódó szerepkörök tárolhatóak memóriában, adatbázisban, LDAP szerveren, stb. 
Ezekhez adottak beépített implementációk, de saját is készíthető. Támogatja a jelszó hashelését
különböző algoritmusokkal. A felhasználóval kapcsolatos információkat képes cache-elni is. Különböző eseményekre eseménykezelőket lehet 
aggatni, pl. bejelentkezés, így könnyen megoldható pl. audit naplózás.&lt;/p&gt;

&lt;p&gt;Az alkalmazáson belül szerepkörökhöz lehet kötni bizonyos url-eket, valamint metódus szinten is
meg lehet adni, hogy milyen szerepkörrel rendelkező felhasználó hívhatja meg.&lt;/p&gt;

&lt;p&gt;A poszthoz egy példa projekt is tartozik, mely &lt;a href=&quot;https://github.com/vicziani/jtechlog-boot-security&quot;&gt;elérhető a GitHub-on&lt;/a&gt;. 
Egyszerű Spring Boot webes alkalmazás, Spring Data JPA perzisztens réteggel, Thymeleaf template engine-nel.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Modularizált alkalmazás fejlesztése a Spring Modulith-tal</title>
   <link href="https://www.jtechlog.hu/2022/12/19/spring-modulith.html"/>
   <updated>2022-12-19T09:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2022/12/19/spring-modulith</id>
   <content type="html">&lt;h2 id=&quot;bevezetés&quot;&gt;Bevezetés&lt;/h2&gt;

&lt;p&gt;A microservice alkalmazások népszerűsége továbbra is töretlen. Miért is választják sokan ezt
az architektúrát? Egyik ok természetesen a hype factor, sokan szeretnék kipróbálni, valamint
hogy bekerüljön az önéletrajzukba. További ok, hogy sokan megcsömörlöttek a monolitikus
alkalmazásoktól, hiszen sok kötöttséggel járnak mind fejlesztés, mind üzemeltetési oldalról.
Ebből talán a legfontosabb, hogy gyakori jellemzője a spagetti kód, ennek következményeképp ha valahol
belenyúlunk az alkalmazásba, lehet, hogy másik helyen romlik el, ezért ha telepíteni akarunk,
ha biztosra akarunk menni, a teljes alkalmazást újra kéne tesztelnünk. Erre megoldás lehet
a microservice architektúra, ahol az alkalmazásunkat lazán kapcsolódó szolgáltatásokra
bontjuk fel. Ezzel kapcsolatban azonban a leggyakrabban elhangzó kérdés, hogy hol
a határ, hol vágjunk, mi alapján bontsuk szét az alkalmazásunkat szolgáltatásokra.
Monolitikus alkalmazásnál további kötöttségek a technológiai kötöttségek, 
valamint hogy a teljes alkalmazást egyben lehet csak telepíteni.
És érdekes módon, csak ritkán szoktam azzal az indokkal találkozni, hogy azért
választották a microservice architektúrát, mert gond volt a skálázhatósággal,
aminek pedig nagy szerepe volt a kialakulásában.&lt;/p&gt;

&lt;p&gt;Gyakran elfelejtjük, hogy egy monolitikus alkalmazásnak sem kéne szükségszerűen
egyben lennie, hanem azt is felépíthetjük lazán kapcsolt komponensekből.
A hiányzó láncszem itt a modul. A modularizált monolitikus alkalmazást
szokás modulith-nak nevezni. Ennek létét két okból is fontosnak tartom.
Egyrészt úgy vélem, hogy ahol nem tudnak modularizált alkalmazást fejleszteni,
ott nem érdemes a microservice architektúrával foglalkozni, ugyanis ezek
a technológiák nem mutatják meg, hogy hogy kell vágni. És a rossz vágásnak
az eredménye ugyanúgy spagetti lesz, de már meg lesz nehezítve az
elosztottságból adódó technológiai és üzemeltetési bonyodalmakkal is.
Többek által is jónak tartott út a microservice-ek felé, hogy először modularizáljuk
az alkalmazásunkat, majd utána emeljük ki a moduljainkat külön service-ekbe.
A másik ok, amit érdemes észben tartani, hogy már egyre több helyről
hallani, hogy a microservice architektúra nem vált be, nem váltotta be
az ígéreteket, a szervezet még nem állt készen (pl. agilis módszertanok, DevOps, CI/CD hiánya - igen, ezek
a microservice-ek előfeltételei), nem volt szükség skálázhatóságra, még rosszabb lett performanciában, stb.&lt;/p&gt;

&lt;p&gt;Technológiailag a modulok azonban elég kevésbé támogatottak. Kezdeti próbálkozás volt az OSGi,
azonban komplexitása miatt nem terjedt el, pedig olyan igéretei vannak, mint a futás közbeni plugin telepítés,
valamint egy library-nek különböző verziói a classpath-on. Szabványos megoldást a
Java Platform Module System próbált adni a Java 9-ben, de annak ellenére, hogy már mikor
megjelent, szintén nem sikerült még elterjednie. A leggyakrabban használt megoldás a
build rendszer által biztosított modularizáció, gondoljunk itt a Maven multi module projectre.
Illetve a Gradle is azt hangoztatja, hogy multi module projektek kezelésében jobb és
gyorsabb, mint a Maven. Azonban ez is plusz komplexitással jár, különösen a build folyamat, a CI/CD terén.&lt;/p&gt;

&lt;p&gt;A kézenfekvő megoldás a Java csomagok használata lenne, azonban ez sajnos túl kevés eszközt ad a kezünkbe,
a láthatósági módosítók csak nagyon szegényes hozzáférés szabályozást nyújtanak.
Ennek kiegészítésére jelent meg az &lt;a href=&quot;https://spring.io/projects/spring-modulith&quot;&gt;Spring Modulith&lt;/a&gt; projekt, mely több jó megoldást is ad. 
Nem hiszek feltétlenül abban, hogy ez az eszköz el fog terjedni, de a benne lévő 
ötleteket érdemes ismerni, és akár a saját projekjeinkben is bevezetni.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Perzisztens réteg technológiák és a MyBatis</title>
   <link href="https://www.jtechlog.hu/2022/10/06/mybatis.html"/>
   <updated>2022-10-06T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2022/10/06/mybatis</id>
   <content type="html">&lt;h2 id=&quot;bevezetés&quot;&gt;Bevezetés&lt;/h2&gt;

&lt;p&gt;Amikor adatbázist kell választani, főleg a relációs adatbázisok és az SQL kerülnek szóba.
Az ezzel való kapcsolattartásra az alkalmazás oldalon főleg a JPA szabványt, és 
annak valamelyik implementációját, pl. a Hibernate-et használjuk.&lt;/p&gt;

&lt;p&gt;Régóta sokan ódzkodnak ettől a technológiától, különböző okok miatt.
Hamar lehet vele eredményeket elérni, azonban nagyon nehéz megérteni a mélységeit.
Ennek hiányában azonban az alkalmazásunk rosszul teljesíthet, az N + 1 probléma miatt
nagyon sok SQL utasítást adhat ki, és mivel a JPA implementáció ezeket generálja,
nem tudjuk finoman szabályozni. A JPA ezen kívül nehezebben alkalmazható egy
már meglévő, esetleg nem körültekintően megtervezett adatbázisra, sokkal inkább támogatja azt,
ha a Java osztályokból indulunk ki.&lt;/p&gt;

&lt;p&gt;Ezért érdemes megnézni, hogy milyen alternatív technológiák vannak, és ezek
milyen jellemzőkkel rendelkeznek.&lt;/p&gt;

&lt;p&gt;A technológia kiválasztása valamilyen szinten hat az alkalmazásunk architektúrájára is.
Többrétegű alkalmazás esetén a perzisztens réteg tartja a kapcsolatot az adatbázissal. 
Itt különböző architektúrális mintákat használhatunk, ebből egy pár darab:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Repository pattern, a Domain Driven Design (DDD) könyvből&lt;/li&gt;
  &lt;li&gt;Table és Row Data Gateway a Patterns of Enterprise Application Architecture (Martin Fowler) könyvből&lt;/li&gt;
  &lt;li&gt;Data Mapper ugyanonnan&lt;/li&gt;
  &lt;li&gt;Data Access Object (DAO) a Java EE tervezési minták közül&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bizonyos neveket ráadásul bizonyos technológiák is használnak, ilyen pl. a repository,
melyet a Spring Framework is használ a perzisztens rétegének elnevezésére, amit
a Spring Data JPA is átvett.&lt;/p&gt;

&lt;p&gt;Az eredeti tervem az volt, hogy ezek jelentését részletesen kifejtem, és összehasonlítom 
őket. De rossz hírem van. Arra jöttem rá, hogy ezeket a fogalmak nincsenek jól
definiálva, nem összehasonlíthatóak, és &lt;a href=&quot;https://stackoverflow.com/questions/804751/what-is-the-difference-between-the-data-mapper-table-data-gateway-gateway-da&quot;&gt;mindenki másra használja ezeket&lt;/a&gt;. És ezt
a különböző technológiák tovább bonyolítják, ugyanis saját komponenseik
elnevezésére használják ezeket a fogalmakat, helytelenül.&lt;/p&gt;

&lt;p&gt;(Egy szemléletes példa erre, hogy a DDD szerint a repository egy olyan objektum, mely
az üzleti logika és az és az üzleti objektumok adatbázisból olvasásáért vagy oda írásáért felelős ún. 
mapping réteg között helyezkedik el, és az üzleti objektumokat a kollekciókhoz hasonlóan kezeli. Ezen túl
komplex lekérdezési lehetőséget is biztosít úgy, hogy a lekérdezési feltételeket dinamikusan lehet
összeállítani. A Spring Data JPA repository-ja ezzel pont ellentétes, előre definiálnunk kell
a metódusokat, melyek csak egy jól meghatározott feltétellel hívhatóak meg.
Saját véleményem szerint a repository-nak a JPA Criteria Query API-ja sokkal jobban megfelel.)&lt;/p&gt;

&lt;p&gt;Ezért úgy döntöttem, nem én fogok ezekben a fogalmakban rendet szabni, hanem inkább
egy tulajdonság rendszert állítok össze, ami alapján a perzisztens technológiák
osztályozhatóak. Ez legyen a következő:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Szabvány-e vagy egyedi implementáció&lt;/li&gt;
  &lt;li&gt;Ingyenes-e&lt;/li&gt;
  &lt;li&gt;SQL lekérdező nyelvet kell használni, vagy saját nyelve van, amiből maga generál le SQL utasításokat&lt;/li&gt;
  &lt;li&gt;Van-e benne mapping, azaz az adatbázisból jövő adatokat automatikusan meg tudja-e feleltetni az objektumokkal&lt;/li&gt;
  &lt;li&gt;Elég-e interfészeket definiálni, amihez maga generálja ki az implementációt.&lt;/li&gt;
  &lt;li&gt;Képes-e metódusnév alapján implementációt generálni&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A mapping tipikusan reflectionnel működik, és rendelkezik alapkonfigurációval 
(pl. az attribútum neve megegyezik az oszlopnévvel), de ez személyre is szabható.&lt;/p&gt;

&lt;p&gt;Azt is eldöntöttem, hogy nem a különböző tervezési minták neveit fogom használni, hanem 
a különböző technológiák elnevezési konvencióit.&lt;/p&gt;

&lt;p&gt;Ezek alapján a JPA:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Szabványos, a Java EE szabvány része, implementációi pl. a Hibernate vagy az EclipseLink&lt;/li&gt;
  &lt;li&gt;Mindkét elterjedt implementációja ingyenes&lt;/li&gt;
  &lt;li&gt;Saját nyelve van, a JPQL, vagy a Criteria Query API is használható&lt;/li&gt;
  &lt;li&gt;(Object-Relational Mapping) ORM eszköz, azaz megfelelteti az objektumokat az adatbázisból jövő adatokkal&lt;/li&gt;
  &lt;li&gt;Nem elég interfészeket definiálni&lt;/li&gt;
  &lt;li&gt;Ezért metódusnév alapján sem tud implementációt generálni&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Spring Boot 3 újdonságai</title>
   <link href="https://www.jtechlog.hu/2022/09/13/spring-boot-3.html"/>
   <updated>2022-09-13T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2022/09/13/spring-boot-3</id>
   <content type="html">&lt;p&gt;Frissítve: 2023. október 3.&lt;/p&gt;

&lt;h2 id=&quot;bevezetés&quot;&gt;Bevezetés&lt;/h2&gt;

&lt;p&gt;Mivel a hétvégén megkaptam, hogy írjak már Javas cikkeket, így ebben a posztban
a Spring Boot 3 újdonságait veszem sorra. A Spring Boot 3-as sorozat már a Spring
Framework 6-os sorozatára építkezik, ennek újdonságait nem fogom külön tárgyalni. 
A poszt megírásának a pillanatában a legfrissebb verzió a 3.1.4.&lt;/p&gt;

&lt;p&gt;Az említendő változások a következő területeket érintik:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Alapkövetelmény a Java 17&lt;/li&gt;
  &lt;li&gt;Jakarta EE 9 függőségek&lt;/li&gt;
  &lt;li&gt;Problem Details&lt;/li&gt;
  &lt;li&gt;Tracing&lt;/li&gt;
  &lt;li&gt;Natív futtatható fájl elkészítése&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Fejlesztőként mivel akadályozom a tesztelők munkáját?</title>
   <link href="https://www.jtechlog.hu/2022/08/20/fejlesztok-es-tesztelok.html"/>
   <updated>2022-08-20T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2022/08/20/fejlesztok-es-tesztelok</id>
   <content type="html">&lt;h2 id=&quot;bevezetés&quot;&gt;Bevezetés&lt;/h2&gt;

&lt;p&gt;Frissítve: 2022. november 04-én, kiegészítve a &lt;em&gt;Rossz gyakorlat: Egy projekten már teszteltünk, nem vált be&lt;/em&gt;, 
a &lt;em&gt;Rossz gyakorlat: nem megfelelő üzleti fogalmakat használok&lt;/em&gt;, a &lt;em&gt;Rossz gyakorlat: nem megfelelő branch-en történik a tesztelés&lt;/em&gt;, és a &lt;em&gt;Rossz gyakorlat: nem bontom részproblémákra a problémát&lt;/em&gt; fejezetekkel&lt;/p&gt;

&lt;p&gt;Frissítve: 2022. augusztus 21-én, kiegészítve a &lt;em&gt;Naplózás fontossága&lt;/em&gt; résszel, valamint a cache-re vonatkozó ajánlásokkal&lt;/p&gt;

&lt;p&gt;Ahhoz, hogy sikeres szoftvert tudjunk szállítani, hiszem, hogy nagyon fontos a fejlesztők és
a tesztelők közötti szoros együttműködés. És mikor tesztelőket említek, ugyanúgy gondolok
a manuális és automata tesztelőkre is. Az irányzat, mely a fejlesztők és az üzemeltetők 
közötti kapcsolat fontosságát hangsúlyozza, a DevOps nevet kapta. Célja egy olyan kultúra
kialakítása, gyakorlatok és eszközök kiválasztása, ahol a fejlesztők és az üzemeltetők
közös munkával tudnak gyorsan, megbízhatóan alkalmazásokat és megoldásokat szállítani.
Ez a fogalom manapság igencsak felkapott, &lt;em&gt;de méltatlannak érzem, hogy a tesztelőkkel 
való közös munka fontosságának kiemelése korántsem ennyire hangsúlyos&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Történetileg kialakult, hogy a fejlesztés és az üzemeltetés a legtöbb cégnél elvált 
egymástól, tisztán elválasztott szervezeti egységekben, sőt akár külön cégekben működtek, 
melyek között a kommunikáció finoman szólva is döcögős volt. Sőt, úgy érződött, hogy a két csoportnak
eltérő a célja. Az üzemeltetők stabilitást, biztonságot, tervezhetőséget szerettek volna,
míg a fejlesztők mindig az örökös változásért, fejlődésért harcoltak. Észrevehetjük,
ugyanez megfigyelhető a tesztelőknél is, egyrészt a különválás, a nehézkes kommunikáció,
és a látszólag ellentétes cél. Van, hogy a fejlesztők által késznek minősített alkalmazást
a tesztelők “visszadobnak”. Kezdjük felismerni, hogy az üzemeltetés és a fejlesztés
szétválasztása káros, &lt;em&gt;de vajon így érezzük a tesztelők munkájával kapcsolatban is&lt;/em&gt;?
Ráadásul az egyes agilis módszertanok, mint pl. a Scrum szerint a csapat felelős
a sprint végén a kész termék leszállításáért, és ebben olyan egyenrangú csapattagok vesznek részt,
akik persze rendelkeznek speciális ismeretekkel, pl. üzleti elemzés, fejlesztés, tesztelés vagy
üzemeltetés.&lt;/p&gt;

&lt;p&gt;Voltam olyan helyen, ahol a fentebb bemutatott elszigeteltség jelen volt, és mindig dolgoztam ennek
csökkentésén. Voltan olyan projekten is, ahol ezen különböző ismeretekkel rendelkező
szakemberek egy csapatban dolgoztak. Régóta tartok fejlesztői tanfolyamokat, köztük
kezdő fejlesztői tanfolyamokat, amin egyre több tesztelővel találkozok, aki el akar mozdulni
az automata tesztelés irányába. Sőt részt vettem tesztelői bootcampek megszervezésében is, ahol nagyon sokat
tanultam a tesztelő kollégáimtól, és beleláthattam ennek a szakmának a szépségeibe is, és erősítették bennem a hitet,
hogy mennyire fontos az együttműködés. Sőt, automata teszt eszközökkel kapcsolatos képzéseket is tartok, amin szintén sok tesztelő vesz részt.&lt;/p&gt;

&lt;p&gt;Ezen tapasztalataim alapján, és a tesztelők (akár szünetekben elmesélt) történeteit meghallgatva gyakran úgy látom,
hogy a fejlesztőknek a teszteléssel kapcsolatban rengeteg tévhit él a fejében, és rengeteg rossz gyakorlatot folytatnak. Ebben a posztban ezeket próbálom felsorolni, megcáfolni. Lesz szó általános elvekről, de pár helyen lemegyek technológiai szintre is. Egyes szám első személyben fogok írni, fejlesztő lévén, még akkor is,
ha magam nem így gondolkozom, így megpróbálok senkit sem megsérteni. Félreértés ne essék, nem ellentéteket szeretnék szítani, hanem megoldásokat kínálni.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Gondolatok az objektumorientált programozásról</title>
   <link href="https://www.jtechlog.hu/2022/04/22/osztaly-invarians.html"/>
   <updated>2022-04-22T08:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2022/04/22/osztaly-invarians</id>
   <content type="html">&lt;p&gt;Egy fejlesztő számára a legtöbbször öröm egy új keretrendszer vagy lib kipróbálása, és használatba vétele,
azonban szerintem ugyanilyen fontos újra és újra visszanyúlni az objektumorientált alapokhoz, az osztályok és
metódusok tervezéshez. Ebben a posztban egy egyszerű példán keresztül próbálom bemutatni, hogy ennek is
milyen mélységei lehetnek, és mennyire nem egyértelmű a jó megoldás kiválasztása. Az itt megismert fogalmak
használata egyszerűsíti a fejlesztők közötti kommunikációt is.&lt;/p&gt;

&lt;p&gt;A posztot az ihlette, hogy szó esett az invariánsról a Clean Code könyvben. És nem sokkal később 
a Domain-Driven Design könyvben is megemlítették.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Szoftverfejlesztés okosan Pythonnal</title>
   <link href="https://www.jtechlog.hu/2022/02/03/Szoftverfejlesztes-okosan-Pythonnal.html"/>
   <updated>2022-02-03T09:00:00+00:00</updated>
   <id>https://www.jtechlog.hu/2022/02/03/Szoftverfejlesztes-okosan-Pythonnal</id>
   <content type="html">&lt;p&gt;Bár egyetértek azzal, hogy a programozással kapcsolatos szakirodalom nyelve
az angol, mégis üdvözlöm a magyar nyelvű könyveket, és blogokat
(hiszen ezért írom a JTechLogot is). Ezek a tartalmak itthon egy olyan
réteget is meg tudnak szólítani, akik esetleg kedvet kapva, ezen
az úton elindulva elkezdik fogyasztani az angol szakirodalmat is.
Gondolok például az középiskolásokra, felsőoktatási intézmények
diákjaira, manapság annyira népszerű
bootcampeken tanulókra, rokon szakmákból érdeklődőkre (pl. üzleti
elemzők, manuális tesztelők, matematikusok, stb.)&lt;/p&gt;

&lt;p&gt;Ezért is tartom rajta a szemem a magyar nyelven megjelenő
könyveken. Sok megkeresés érkezik hozzám azzal kapcsolatban is,
hogy mivel ajánlott kezdeni, és a programozással kapcsolatos
fórumokon, listákon, csoportokon is újra és újra előjön a kérdés.
Mindig érdekelt az is, hogy egy kezdőknek szóló könyv hogyan
próbál bevezetni rendkívül absztrakt fogalmakat, mennyire hoz új példákat,
mennyire mer elrugaszkodni az eddigi tanítási módszerektől.
Különösen a magyar szerzők könyveinek örülök.&lt;/p&gt;

&lt;p&gt;Már 2020-ban láttam Guta Gábor &lt;em&gt;Szoftverfejlesztés okosan Pythonnal : agilis csapatok közös nyelve&lt;/em&gt;
című könyvét, és múltkor, mikor ki szerettem volna venni a könyvtárból, hogy 
belelapozzak, és nem találtam benn, döntöttem el, hogy írok neki, hátha van neki
egy-két elfekvőben lévő példány. Gáborral már régóta ismerjük egymást,
akkor még mindketten Javaval foglalkoztunk, azóta váltott át, és merült bele
nagyon mélyen a Python világába. Mostanában ebben a témában ad elő
különböző szakmai konferenciákon is, pl. kifejezetten ajánlom a 
&lt;em&gt;Python és a turbó csiga&lt;/em&gt; című előadását a Python teljesítményhangolásról,
mely a HWSW free! meetup-sorozaton &lt;a href=&quot;https://www.youtube.com/watch?v=MCJZWrPVgcs&quot;&gt;hangzott el&lt;/a&gt; 2020. februárjában.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/artifacts/posts/images/szoftverfejlesztes-okosan-pythonnal-agilis-csapatok-kozos-nyelve.jpg&quot; data-lightbox=&quot;post-images&quot;&gt;&lt;img src=&quot;/artifacts/posts/images/szoftverfejlesztes-okosan-pythonnal-agilis-csapatok-kozos-nyelve-thumb.jpg&quot; alt=&quot;Kép leírása&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 
</feed>
