Címke: AI

  • Készítsünk Playwright project-et Copilot-tal

    Készítsünk Playwright project-et Copilot-tal

    Megkésve, de törve nem, én is elkezdtem egyre több dologra használni az AI-t, ahogy az a korábbi bejegyzéseimből is látszik. Reggel gondoltam egy merészet, és megkértem a Copilot-ot, hogy kezdjünk el csinálni egy Playwright, TypeScript projectet, mindezt VSCode-ban, és csak CLI-jal. Meg kell mondjam, egész jól sikerültek az alapok, és időben is lényegesen hamarabb készült el, mintsem, ha kézzel kezdem el.

    Felbuzdulva ezen, megkértem, hogy integrálja bele az Allure riport készítést, ami elsőre nem volt teljes siker, mert nem tartalmazta a korábbi futásokat a kérésem ellenére, de ez is hamar javítva lett.

    Folytattam azzal, hogy egy ingyenes és publikus API hívásra írattam vele 3 tesztet, majd pedig kértem, hogy legyen 2 negatív is, amit ő elsőre úgy értett, hogy átírta a meglévőket. Ezt is hamar javítottuk.

    Kértem, hogy amit csináltunk, azt tegye bele egy Word fájlba, illetve még készítettem vele egy readme.md fájlt is. Szerintem egész jól sikerült, mindezt relatív kevés idő alatt, szóval biztosan fogom még folytatni vele a munkát.

    Íme a teljes lista:

    Project path: D:\Repositories\ai-playwright
    Earliest retrievable project record:
    approximately 08:55 local time (06:55 UTC)

    08:53 ? Initial workspace session

    • Opened the working area under D:\Repositories.

    08:55 ? Created the Playwright project

    • Created D:\Repositories\ai-playwright as a TypeScript Playwright project.
    • Configured Chromium, added example tests and a GitHub Actions workflow.
    • Installed dependencies and Chromium.
    • Verified that the two starter tests passed with npx playwright test.

    09:01 ? Changed reporting to Allure

    • Switched the default Playwright reporter to Allure.
    • Added Allure report generation and execution-history persistence.
    • Updated package.json, playwright.config.ts, .github/workflows/playwright.yml, .gitignore, and scripts/allure-history.js.
    • Configured CI to restore and save Allure history.
    • Verified the initial tests and report generation.

    09:07?09:23 ? Opened and fixed Allure history

    • Generated allure-report and started it with npm run allure:open.
    • Investigated why previous executions were not visible.
    • Fixed the issue by clearing old result files before each run while preserving history.
    • Verified that the report showed three executions per test instead of treating earlier executions as retries.

    09:26 ? Added Open-Meteo API tests

    • Added tests in tests/open-meteo-api.spec.ts.
    • Covered a valid forecast request, invalid latitude, and invalid longitude.
    • All three tests passed.

    09:28?09:34 ? Regenerated the report and improved assertions

    • Regenerated Allure with the API tests.
    • Added descriptive failure messages to the expect assertions.

    09:49?09:51 ? Added more negative API scenarios

    • Added a request missing required longitude.
    • Added a request with an unsupported current-weather variable.
    • The API test file reached five tests total.

    09:52 ? Verified all tests

    • Ran the full suite.
    • All seven tests passed.
    • Regenerated the Allure report with all tests.

    09:55?10:03 ? Fixed Allure generation in GitHub Actions

    • Investigated why the report was not generated in CI.
    • Updated the workflow to restore history, run Playwright, always generate the report, and upload the report artifact when possible.
    • Local verification passed.

    10:07?10:12 ? Discussed opening reports from CI

    • Clarified that GitHub Actions cannot directly open a browser on the runner.
    • Discussed GitHub Pages as the way to automatically host and view the report.
    • Explained how to open a downloaded report locally with npx allure open.

    10:20 ? Opened the Allure report again

    10:31 ? Added Playwright Codegen

    • Added the codegen script to package.json.
    • Usage: npm run codegen — https://example.com.
    • Discussed saving recorded tests with –output tests/recorded.spec.ts.

    10:34?10:48 ? Reviewed the project and exported coverage

    • Explained that the project is a Playwright test project, not the application under test.
    • Identified that baseURL and webServer are not configured.
    • Created D:\Repositories\ai-playwright\test-coverage.xlsx.
    • The workbook contains all seven test cases, behaviors, assertions, Allure statuses, and a test-scope coverage summary.

    Note: The earliest project-creation record available is the summarized 08:55 local-time session; the initial setup session does not contain a complete message-by-message transcript.

    10:56 – Added project README documentation

    • Created README.md in the project root.
    • Documented prerequisites and installation from scratch.
    • Documented browser and API test execution.
    • Documented Allure report generation, opening, and execution-history handling.
    • Documented Playwright Codegen usage.
    • Documented project configuration, structure, GitHub Actions CI behavior, and troubleshooting.
  • Névnapok plugin Gemini-vel generálva

    Gondoltam egy merészet, és megkértem a Gemini-t, hogy készítsen nekem egy WordPress Plugint, ami random Mészáros Lőrinc idézeteket jelenít meg. Megcsinálta.

    “Mindenkitől lojalitást várok el.”— Mészáros Lőrinc

    Nem álltam itt meg, megkértem, hogy csináljon egy névnap megjelenítőt, az aktuálisra, és a soron következőre.

    Ma: Hedvig
    Holnap: Lukács

    Íme:

    Itt egy komplett, egyfájlos WordPress bővítmény, amelyet közvetlenül beépíthetsz a weboldaladba. A bővítmény a látogató böngészőjének aktuális dátumát veszi alapul, kezeli a szökőéveket (a februári névnapeltolódást is), és shortcode segítségével bárhova könnyen elhelyezhető.

    Bővítmény kóda

    Hozz létre egy magyar-nevnapok.php fájlt a /wp-content/plugins/magyar-nevnapok/ mappában, és másold bele az alábbi kódot:

    PHP

    <?php
    /**
     * Plugin Name: Magyar Névnapok (Mai és Holnapi)
     * Description: Megjeleníti a mai és a holnapi névnapot shortcode segítségével.
     * Version: 1.0
     * Author: AI Assistant
     */
    
    if (!defined('ABSPATH')) {
        exit; // Közvetlen hozzáférés tiltása
    }
    
    class Magyar_Nevnapok_Plugin {
    
        // Névnap adatbázis (Hónap -> Nap -> Névnapok)
        private static $nevnapok = [
            1 => [
                1 => 'Fruzsina', 2 => 'Ábel', 3 => 'Genovéva, Benjámin', 4 => 'Titusz, Leona', 5 => 'Simon',
                6 => 'Boldizsár', 7 => 'Attila, Ramóna', 8 => 'Gyöngyvér', 9 => 'Marcell', 10 => 'Melánia',
                11 => 'Ágota', 12 => 'Ernő', 13 => 'Veronika', 14 => 'Bódog', 15 => 'Lóránt, Lóránd',
                16 => 'Gusztáv', 17 => 'Antal, Antónia', 18 => 'Piroska', 19 => 'Sára, Márió', 20 => 'Fábián, Sebestyén',
                21 => 'Ágnes', 22 => 'Vince, Artúr', 23 => 'Zelma, Rajmund', 24 => 'Timót', 25 => 'Pál',
                26 => 'Vanda, Paula', 27 => 'Angéla, Anzelm', 28 => 'Károly, Karola', 29 => 'Adél', 30 => 'Martina, Gerda',
                31 => 'Marcella'
            ],
            2 => [
                1 => 'Ignác', 2 => 'Karolina, Aida', 3 => 'Balázs', 4 => 'Ráhel, Csenge', 5 => 'Ágota, Ingrid',
                6 => 'Dorottya, Dóra', 7 => 'Tódor, Rómeó', 8 => 'Aranka', 9 => 'Abigél, Alex', 10 => 'Elvira',
                11 => 'Bertold, Marietta', 12 => 'Lívia, Lídia', 13 => 'Ella, Linda', 14 => 'Bálint, Valentin', 15 => 'Kolos, Georgina',
                16 => 'Julianna, Lilla', 17 => 'Donát', 18 => 'Bernadett', 19 => 'Zsuzsanna', 20 => 'Aladár, Álmos',
                21 => 'Eleonóra', 22 => 'Gerzson', 23 => 'Alfréd', 24 => 'Mátyás', 25 => 'Géza',
                26 => 'Edina', 27 => 'Ákos, Bátor', 28 => 'Elemér', 29 => 'Névnap szökőévben'
            ],
            3 => [
                1 => 'Albin', 2 => 'Lujza', 3 => 'Kornélia', 4 => 'Kázmér', 5 => 'Adorján, Adrián',
                6 => 'Leonóra, Inez', 7 => 'Tamás', 8 => 'Zoltán', 9 => 'Franciska, Fanni', 10 => 'Ildikó',
                11 => 'Szilárd', 12 => 'Gergely', 13 => 'Krisztián, Ajtony', 14 => 'Matild', 15 => 'Kristóf',
                16 => 'Henrietta', 17 => 'Patrick, Gertrúd', 18 => 'Ede, Sándor', 19 => 'József, Bánk', 20 => 'Klaudia',
                21 => 'Benedek', 22 => 'Beáta, Izolda', 23 => 'Emőke', 24 => 'Gábor, Karina', 25 => 'Irén, Írisz',
                26 => 'Emánuel', 27 => 'Hajnalka', 28 => 'Gedeon, Johanna', 29 => 'Auguszta', 30 => 'Zalán',
                31 => 'Árpád'
            ],
            4 => [
                1 => 'Hugó', 2 => 'Áron', 3 => 'Buda, Richárd', 4 => 'Izidor', 5 => 'Vince',
                6 => 'Vilmos, Bíbor', 7 => 'Herman', 8 => 'Dénes', 9 => 'Erhard', 10 => 'Zsolt',
                11 => 'Leó, Szaniszló', 12 => 'Gyula', 13 => 'Ida', 14 => 'Tibor', 15 => 'Anasztázia, Tas',
                16 => 'Csongor', 17 => 'Rudolf', 18 => 'Andrea, Ilma', 19 => 'Emma', 20 => 'Tivadar',
                21 => 'Konrád', 22 => 'Csilla, Noémi', 23 => 'Béla', 24 => 'György', 25 => 'Márk',
                26 => 'Ervin', 27 => 'Zita', 28 => 'Valéria', 29 => 'Péter', 30 => 'Katalin, Kitti'
            ],
            5 => [
                1 => 'Fülöp, Jakab', 2 => 'Zsigmond', 3 => 'Tímea, Irma', 4 => 'Mónika, Flórián', 5 => 'Györgyi',
                6 => 'Ivett, Frida', 7 => 'Gizella', 8 => 'Mihály', 9 => 'Gergely', 10 => 'Ármin, Pálmira',
                11 => 'Ferenc', 12 => 'Pongrác', 13 => 'Szervác, Imelda', 14 => 'Bonifác', 15 => 'Zsófia, Szonja',
                16 => 'Mózes, Botond', 17 => 'Paszkál', 18 => 'Erik, Alexandra', 19 => 'Ivó, Milán', 20 => 'Bernát, Felícia',
                21 => 'Konstantin', 22 => 'Júlia, Rita', 23 => 'Dezső', 24 => 'Eszter, Eliza', 25 => 'Orbán',
                26 => 'Fülöp, Evelin', 27 => 'Hella', 28 => 'Emil, Csanád', 29 => 'Magdolna', 30 => 'Janka, Zsanett',
                31 => 'Angéla, Petronella'
            ],
            6 => [
                1 => 'Tünde', 2 => 'Kármen, Anita', 3 => 'Klotild, Cecília', 4 => 'Bulcsú', 5 => 'Fatime, Fatima',
                6 => 'Norbert, Cintia', 7 => 'Róbert', 8 => 'Medárd', 9 => 'Félix', 10 => 'Margit, Gréta',
                11 => 'Barnabás', 12 => 'Villő', 13 => 'Antal, Anett', 14 => 'Vazul', 15 => 'Jolán, Vid',
                16 => 'Jusztin', 17 => 'Laura, Alida', 18 => 'Arnold, Levente', 19 => 'Gyárfás', 20 => 'Rafael',
                21 => 'Alajos, Leila', 22 => 'Paulina', 23 => 'Zoltán', 24 => 'Iván', 25 => 'Vilmos',
                26 => 'János, Pál', 27 => 'László', 28 => 'Levente, Irén', 29 => 'Péter, Pál', 30 => 'Pál'
            ],
            7 => [
                1 => 'Tihamér, Annamária', 2 => 'Ottó', 3 => 'Kornél, Soma', 4 => 'Ulrik', 5 => 'Emese, Sarolta',
                6 => 'Csaba', 7 => 'Apollónia', 8 => 'Ellák', 9 => 'Lukrécia', 10 => 'Amália',
                11 => 'Nóra, Lili', 12 => 'Izabella, Dalma', 13 => 'Jenő', 14 => 'Örs, Stella', 15 => 'Henrik, Roland',
                16 => 'Vali', 17 => 'Endre, Elek', 18 => 'Frigyes', 19 => 'Emília', 20 => 'Illés',
                21 => 'Dániel, Daniella', 22 => 'Magdolna', 23 => 'Lenke', 24 => 'Kinga, Kincső', 25 => 'Kristóf, Jakab',
                26 => 'Anna, Anikó', 27 => 'Olga, Liliána', 28 => 'Szabolcs', 29 => 'Márta, Flóra', 30 => 'Judit, Xénia',
                31 => 'Oszkár'
            ],
            8 => [
                1 => 'Boglárka', 2 => 'Lehel', 3 => 'Hermina', 4 => 'Domonkos, Dominika', 5 => 'Krisztina',
                6 => 'Berta, Bettina', 7 => 'Ibolya', 8 => 'László', 9 => 'Emőd', 10 => 'Lőrinc',
                11 => 'Zsuzsanna, Tiborc', 12 => 'Klára', 13 => 'Ipoly', 14 => 'Marcell', 15 => 'Mária',
                16 => 'Ábrahám', 17 => 'Jácint', 18 => 'Ilona', 19 => 'Huba', 20 => 'István',
                21 => 'Sámuel, Hajna', 22 => 'Menyhért', 23 => 'Bence', 24 => 'Bertalan', 25 => 'Lajos, Patrícia',
                26 => 'Izsó', 27 => 'Gáspár', 28 => 'Ágoston', 29 => 'Beatrix, Erna', 30 => 'Rózsa',
                31 => 'Erika, Bella'
            ],
            9 => [
                1 => 'Egyed, Egon', 2 => 'Rezső', 3 => 'Hilda', 4 => 'Rozália', 5 => 'Viktor, Lőrinc',
                6 => 'Zakariás', 7 => 'Regina', 8 => 'Mária, Adrienn', 9 => 'Ádám', 10 => 'Nikolett, Hunor',
                11 => 'Teodóra', 12 => 'Mária', 13 => 'Kornél', 14 => 'Szeréna, Roxána', 15 => 'Enikő, Melitta',
                16 => 'Edit', 17 => 'Zsófia', 18 => 'Diána', 19 => 'Vilhelmina', 20 => 'Friderika',
                21 => 'Máté, Mirella', 22 => 'Mór, Gellért', 23 => 'Tekla, Líviusz', 24 => 'Gellért, Mercédesz', 25 => 'Eufrozina, Kende',
                26 => 'Jusztina', 27 => 'Adalbert', 28 => 'Vencel', 29 => 'Mihály', 30 => 'Jeromos'
            ],
            10 => [
                1 => 'Malvin', 2 => 'Petra', 3 => 'Helga', 4 => 'Ferenc', 5 => 'Aurél',
                6 => 'Brúnó, Renáta', 7 => 'Amália', 8 => 'Koppány', 9 => 'Dénes', 10 => 'Gedeon',
                11 => 'Brigitta', 12 => 'Miksa', 13 => 'Kálmán, Ede', 14 => 'Helén', 15 => 'Teréz',
                16 => 'Gál', 17 => 'Hedvig', 18 => 'Lukács', 19 => 'Nándor', 20 => 'Vendel',
                21 => 'Orsolya', 22 => 'Előd', 23 => 'Gyöngyi', 24 => 'Salamon', 25 => 'Blanka, Bianca',
                26 => 'Dömötör', 27 => 'Szabina', 28 => 'Simon, Szimonetta', 29 => 'Nárcisz', 30 => 'Alfonz',
                31 => 'Farkas'
            ],
            11 => [
                1 => 'Marianna', 2 => 'Achilles', 3 => 'Győző', 4 => 'Károly', 5 => 'Imre',
                6 => 'Lénárd', 7 => 'Rezső', 8 => 'Zsombor', 9 => 'Tivadar', 10 => 'Réka',
                11 => 'Márton', 12 => 'Jónás, Renátó', 13 => 'Szilvia', 14 => 'Aliz', 15 => 'Albert, Lipót',
                16 => 'Ödön', 17 => 'Hortenzia, Gergő', 18 => 'Jenő', 19 => 'Erzsébet', 20 => 'Jolán',
                21 => 'Olivér', 22 => 'Cecília', 23 => 'Klementina', 24 => 'Emma', 25 => 'Katalin',
                26 => 'Virág', 27 => 'Virgil', 28 => 'Stefánia', 29 => 'Taksony', 30 => 'András, Andor'
            ],
            12 => [
                1 => 'Elza', 2 => 'Melinda, Vivien', 3 => 'Ferenc, Olívia', 4 => 'Borbála, Barbara', 5 => 'Vilma',
                6 => 'Miklós', 7 => 'Ambrus', 8 => 'Mária', 9 => 'Natália', 10 => 'Judit',
                11 => 'Árpád', 12 => 'Gabriella', 13 => 'Luca, Otília', 14 => 'Szilárda', 15 => 'Valér',
                16 => 'Etelka, Aletta', 17 => 'Lázár, Olimpia', 18 => 'Auguszta', 19 => 'Viola', 20 => 'Teofil',
                21 => 'Tamás', 22 => 'Zénó', 23 => 'Viktória', 24 => 'Ádám, Éva', 25 => 'Eugénia',
                26 => 'István', 27 => 'János', 28 => 'Kamilla', 29 => 'Tamás, Szeréna', 30 => 'Dávid',
                31 => 'Szilveszter'
            ]
        ];
    
        public function __construct() {
            add_shortcode('nevnapok', [$this, 'render_shortcode']);
        }
    
        /**
         * Névnap lekérése adott dátumra (kezeli a szökőéveket)
         */
        private function get_nevnap_by_timestamp($timestamp) {
            $month = (int)date('n', $timestamp);
            $day = (int)date('j', $timestamp);
            $is_leap_year = (date('L', $timestamp) == 1);
    
            // Szökőév esetén február 24. után a névnapok 1 nappal eltolódnak
            if ($is_leap_year && $month == 2) {
                if ($day == 24) {
                    return 'Szökőnap (Nincs külön névnap)';
                } elseif ($day > 24) {
                    $day--; // Február 25-29. a 24-28-ai névnapokat kapja
                }
            }
    
            return isset(self::$nevnapok[$month][$day]) ? self::$nevnapok[$month][$day] : 'Ismeretlen';
        }
    
        /**
         * Shortcode megjelenítése: [nevnapok]
         */
        public function render_shortcode($atts) {
            // Alapértelmezett beállítások felülírhatósága
            $atts = shortcode_atts([
                'mai_label'     => 'Mai névnap:',
                'holnapi_label' => 'Holnapi névnap:',
                'layout'        => 'block' // 'block' vagy 'inline'
            ], $atts, 'nevnapok');
    
            // WordPress időzóna beállítása alapján kérjük le az időt
            $now = current_time('timestamp');
            $tomorrow = strtotime('+1 day', $now);
    
            $mai_nevnap = $this->get_nevnap_by_timestamp($now);
            $holnapi_nevnap = $this->get_nevnap_by_timestamp($tomorrow);
    
            // HTML kimenet előállítása
            ob_start();
            ?>
            <div class="magyar-nevnapok-container layout-<?php echo esc_attr($atts['layout']); ?>">
                <div class="nevnap-item nevnap-mai">
                    <span class="nevnap-label"><?php echo esc_html($atts['mai_label']); ?></span>
                    <span class="nevnap-name"><?php echo esc_html($mai_nevnap); ?></span>
                </div>
                <div class="nevnap-item nevnap-holnapi">
                    <span class="nevnap-label"><?php echo esc_html($atts['holnapi_label']); ?></span>
                    <span class="nevnap-name"><?php echo esc_html($holnapi_nevnap); ?></span>
                </div>
            </div>
            <style>
                .magyar-nevnapok-container.layout-inline {
                    display: flex;
                    gap: 15px;
                    align-items: center;
                }
                .magyar-nevnapok-container .nevnap-label {
                    font-weight: bold;
                    margin-right: 4px;
                }
            </style>
            <?php
            return ob_get_clean();
        }
    }
    
    // Bővítmény inicializálása
    new Magyar_Nevnapok_Plugin();
    

    Használati útmutató

    1. Telepítés:
      • Hozz létre egy magyar-nevnapok nevű mappát a weboldalad wp-content/plugins/ könyvtárában.
      • Mentsd el a fenti kódot magyar-nevnapok.php néven ebbe a mappába.
      • Lépj be a WordPress admin felületére, és kapcsold be a Magyar Névnapok (Mai és Holnapi) bővítményt.
    2. Megjelenítés Shortcode-csal:Bármelyik oldalra, bejegyzésbe, widgetsávba vagy fejlécbe beillesztheted az alábbi shortcode-ok egyikét:
      • Alapértelmezett (blokk elrendezés):[ nevnapok ]
      • Egymás melletti (egysoros) elrendezés:[ nevnapok layout="inline" ]
      • Egyedi feliratok használata:[ nevnapok mai_label="Ma:" holnapi_label="Holnap:" layout="inline" ]

    1.Fájl létrehozása:

    Hozd létre a magyar-nevnapok.php fájlt a wp-content/plugins/magyar-nevnapok/ könyvtárban.

    2.Aktiválás:

    Lépj be a WordPress Adminba -> Bővítmények, majd aktiváld a „Magyar Névnapok” nevű bővítményt.

    3.Shortcode elhelyezése:

    Szúrd be a [ nevnapok ] shortcode-ot tetszőleges oldalba, blokkba vagy widgetbe.

  • Legáltalánosabb GIT parancsok

    Legáltalánosabb GIT parancsok

    Sosem voltam egy nagy karakter húszár, így előnybe részesítettem a grafikus ezközöket. Mostanában viszont egyre gyakrabban kényszerűlők rá, hogy parancssorosan oldjak meg dolgok, mint pl a GIT-elést. Gondoltam AI-val összegyűjtetem a legáltalánosabb parancsokat.

    Infografika a Git alapvető parancsairól: inicializálás, módosítások követése, commit, ágkezelés és távoli tároló

    A leggyakrabban használt Git parancsok kategóriák szerint csoportosítva:

    Alapvető beállítások & Inicializálás

    • git config --global user.name "Neved" – Beállítja a felhasználóneved a commitokhoz.
    • git config --global user.email "email@cimed.hu" – Beállítja az e-mail-címedet.
    • git init – Új, üres Git repót hoz létre az aktuális mappában.
    • git clone <URL> – Letölt egy meglévő távoli tárolót (repository-t) a gépedre.

    Változások nyomon követése & Commit

    • git status – Megmutatja a munkamenet állapotát (módosított, követetlen fájlok).
    • git add <fájlnév> – Hozzáadja a megadott fájlt a Staging Area-hoz.
    • git add . – Az összes módosított és új fájlt hozzáadja a Staging Area-hoz.
    • git commit -m "Üzenet" – Elmenti a Staging Area-ban lévő változtatásokat a megadott üzenettel.
    • git diff – Megmutatja a még el nem mentett (unstaged) módosításokat.

    Nézet & Történet

    • git log – Megjeleníti a korábbi commitok történetét.
    • git log --oneline – Tömör, egysoros formátumban listázza a commitokat.

    Ágak kezelése (Branching)

    • git branch – Listázza a helyi ágakat.
    • git branch <ág-név> – Létrehoz egy új ágat.
    • git checkout <ág-név> – Átvált a megadott ágra.
    • git checkout -b <ág-név> – Létrehoz egy új ágat és egyből át is vált rá.
    • git merge <ág-név> – A megadott ág tartalmát összefésüli az aktuális ággal.

    Távoli tároló (Remote)

    • git fetch – Letölti az új információkat a távoli tárolóból, de nem egyesíti őket.
    • git pull – Letölti és azonnal összefésüli a távoli ág változásait.
    • git push origin <ág-név> – Feltölti a helyi commitokat a távoli tárolóba.

    Módosítások visszavonása

    • git restore <fájlnév> – Visszaállítja a fájlt a legutóbbi commit állapotára (eldobja a nem elmentett módosításokat).
    • git reset HEAD~1 – Visszavonja a legutóbbi commitot, de a fájlokban lévő módosításokat megőrzi.

    Git Parancsok Gyorsútmutató

    KategóriaParancsLeírás
    Beállítás & Kezdésgit config --global user.name "Neved"Felhasználónév beállítása
    git config --global user.email "email@cimed.hu"E-mail-cím beállítása
    git initÚj helyi repó inicializálása
    git clone <URL>Távoli tároló letöltése
    Változások Kezelésegit statusMunkamenet állapotának ellenőrzése
    git add <fájl> vagy git add .Fájl(ok) hozzáadása a Staging Area-hoz
    git commit -m "Üzenet"Változtatások véglegesítése üzenettel
    git diffNem elmentett módosítások megtekintése
    Történet & Ágakgit log --onelineCommit előzmények tömör listázása
    git branchHelyi ágak listázása
    git checkout -b <ág-név>Új ág létrehozása és átváltás
    git merge <ág-név>Ág összefésülése az aktuálissal
    Távoli Tároló (Remote)git pullFrissítések letöltése és összefésülése
    git push origin <ág-név>Helyi commitok feltöltése
    Módosítások Visszavonásagit restore <fájl>Nem elmentett módosítások eldobása
    git reset HEAD~1Legutóbbi commit visszavonása (fájlok megmaradnak)
  • Duplikációk keresése, avagy power shell script íratása AI-val

    Duplikációk keresése, avagy power shell script íratása AI-val

    Ma ilyen AI-s napom van. Egyre jobban tör be a mindennapi munkámba, és úgy tűnik, hogy a hétvégeimet is ez teszi ki. Miért? Kérdezheted joggal. Megmondom. Az IT-ban, de gyanítom a többi szakmában is jobb, ha értünk hozzá, és megtanuljuk rutinosan használni, mintsem lemaradjunk róla, és nézzük bambán, ahogy az élet felsuhan előttünk.

    Nézzük, mire is mentem elsőre.

    Az alábbi PowerShell-script végigpásztázza a megadott mappát (és annak almappáit), a fájlok SHA256 hash értéke alapján azonosítja a duplikációkat, majd az eredményt kiírja a képernyőre és elmenti egy CSV-fájlba.

    PowerShell duplikáció-kereső script

    Hozz létre egy find-duplicates.ps1 fájlt, és másold bele az alábbi kódot:

    PowerShell

    # --- BEÁLLÍTÁSOK ---
    $TargetFolder = "C:\Elérési\Út\A\Mappához"   # Cseréld ki a vizsgálandó mappa útvonalára
    $OutputFile   = "C:\Elérési\Út\duplikatumok.csv" # Ide menti az eredményt
    
    Write-Host "Fájlok indexelése és hash értékek számítása..." -ForegroundColor Cyan
    
    # 1. Összes fájl lekérése és méret szerinti csoportosítása (gyorsítási lépés)
    $fileGroups = Get-ChildItem -Path $TargetFolder -Recurse -File -ErrorAction SilentlyContinue |
        Group-Group-Object -Property Length |
        Where-Object { $_.Count -gt 1 }
    
    $duplicates = @()
    $totalGroups = $fileGroups.Count
    $counter = 0
    
    # 2. Csak az azonos méretű fájlok SHA256 hash-ének ellenőrzése
    foreach ($group in $fileGroups) {
        $counter++
        Write-Progress -Activity "Duplikátumok keresése" -Status "Fájlcsoportok feldolgozása: $counter / $totalGroups" -PercentComplete (($counter / $totalGroups) * 100)
    
        $hashTable = $group.Group | Get-FileHash -Algorithm SHA256 | Group-Object -Property Hash | Where-Object { $_.Count -gt 1 }
    
        foreach ($hashGroup in $hashTable) {
            foreach ($file in $hashGroup.Group) {
                $duplicates += [PSCustomObject]@{
                    Hash     = $hashGroup.Name
                    Path     = $file.Path
                    SizeMB   = [math]::Round((Get-Item $file.Path).Length / 1MB, 2)
                }
            }
        }
    }
    
    # 3. Eredmények megjelenítése és mentése
    if ($duplicates.Count -gt 0) {
        Write-Host "`nTalált duplikátumok:" -ForegroundColor Green
        $duplicates | Format-Table -AutoSize -Property Hash, SizeMB, Path
    
        $duplicates | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8
        Write-Host "Az eredmények elmentve ide: $OutputFile" -ForegroundColor Yellow
    } else {
        Write-Host "`nNem találhatók duplikált fájlok." -ForegroundColor Green
    }
    

    Így használd:

    1. Nyisd meg a PowerShell-t (akár Rendszergazdaként, ha védett mappákat is vizsgálsz).
    2. Írd át a $TargetFolder változót a keresni kívánt mappára.
    3. Futtasd a scriptet:PowerShell.\find-duplicates.ps1

    Megjegyzés: Ha a PowerShell letiltja a scriptek futtatását, futtasd ezt a parancsot a munkamenetben:

    Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

    Majd második próbálkozásra

    Módosítottam a scriptet, hogy a célmappát (és opcióként a kimeneti CSV-fájl helyét is) paraméterként fogadja el.

    A módosított script kódja:

    PowerShell

    <#
    .SYNOPSIS
        Fájl duplikációkat kereső és gyűjtő PowerShell script.
    
    .DESCRIPTION
        A script végigpásztázza a paraméterként megadott mappát (és annak almappáit),
        és az SHA256 hash értékek alapján azonosítja a duplikátumokat.
        Az eredményt megjeleníti a konzolon és CSV-fájlba menti.
    
    .PARAMETER TargetFolder
        A vizsgálandó mappa útvonala (kötelező paraméter).
    
    .PARAMETER OutputFile
        A kimeneti CSV fájl útvonala (opcionális, alapértelmezett: .\duplikatumok.csv).
    #>
    
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, Position = 0, HelpMessage = "Kérjük, adja meg a vizsgálandó mappa útvonalát!")]
        [ValidateScript({ Test-Path $_ -PathType Container })]
        [string]$TargetFolder,
    
        [Parameter(Mandatory = $false, Position = 1)]
        [string]$OutputFile = ".\duplikatumok.csv"
    )
    
    # Abszolút útvonalak feloldása
    $TargetFolder = (Resolve-Path $TargetFolder).Path
    $OutputFile   = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($OutputFile)
    
    Write-Host "Mappa elemzése: $TargetFolder" -ForegroundColor Cyan
    Write-Host "Fájlok indexelése és méret szerinti csoportosítása..." -ForegroundColor Cyan
    
    # 1. Összes fájl lekérése és méret szerinti csoportosítása (gyorsítási lépés)
    $fileGroups = Get-ChildItem -Path $TargetFolder -Recurse -File -ErrorAction SilentlyContinue |
        Group-Object -Property Length |
        Where-Object { $_.Count -gt 1 }
    
    $duplicates = @()
    $totalGroups = $fileGroups.Count
    $counter = 0
    
    if ($totalGroups -eq 0) {
        Write-Host "`nNem találhatók azonos méretű fájlok, nincsenek duplikátumok." -ForegroundColor Green
        exit
    }
    
    # 2. Csak az azonos méretű fájlok SHA256 hash-ének ellenőrzése
    foreach ($group in $fileGroups) {
        $counter++
        Write-Progress -Activity "Duplikátumok keresése" -Status "Fájlcsoportok feldolgozása: $counter / $totalGroups" -PercentComplete (($counter / $totalGroups) * 100)
    
        $hashTable = $group.Group | Get-FileHash -Algorithm SHA256 | Group-Object -Property Hash | Where-Object { $_.Count -gt 1 }
    
        foreach ($hashGroup in $hashTable) {
            foreach ($file in $hashGroup.Group) {
                $duplicates += [PSCustomObject]@{
                    Hash     = $hashGroup.Name
                    Path     = $file.Path
                    SizeMB   = [math]::Round((Get-Item $file.Path).Length / 1MB, 2)
                }
            }
        }
    }
    
    # 3. Eredmények megjelenítése és mentése
    if ($duplicates.Count -gt 0) {
        Write-Host "`nTalált duplikátumok:" -ForegroundColor Green
        $duplicates | Format-Table -AutoSize -Property Hash, SizeMB, Path
    
        $duplicates | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8
        Write-Host "Az eredmények elmentve ide: $OutputFile" -ForegroundColor Yellow
    } else {
        Write-Host "`nNem találhatók duplikált fájlok." -ForegroundColor Green
    }
    

    Használati példák:

    1. Alapértelmezett használat (a mappa elérést megadva, az eredmény a beállítások szerint a duplikatumok.csv-be kerül):PowerShell.\find-duplicates.ps1 -TargetFolder "C:\Users\Public\Documents"
    2. Pozicionális paraméterként (nem kell kiírni a névadó kapcsolót):PowerShell.\find-duplicates.ps1 "D:\Képek"
    3. Egyedi CSV kimeneti fájlnév megadásával:PowerShell.\find-duplicates.ps1 -TargetFolder "D:\Dokumentumok" -OutputFile "C:\Riportok\doksi_duplikatumok.csv"

    Újdonságok a scriptben:

    • Automatikus mappa-ellenőrzés (ValidateScript): Ha nem létező vagy hibás mappa-útvonalat adsz meg, a script még a futás előtt jelez és leáll.
    • Mappa-kötelezőség (Mandatory = $true): Ha paraméter nélkül indítod el a scriptet, a PowerShell automatikusan megkérdezi tőled a célmappa útvonalát.

    Nem vagyok teljes mértékben elragadtatva az eredménytől, de mára ez bőven elég volt, majd folytatjuk…

  • Playwright 1.63 újdonságok

    Playwright 1.63 újdonságok

    Újdonságok

    A Playwright 1.63 frissítése megérkezett, és számtalan olyan funkciót hoz, amelyek lényegesen egyszerűbbé teszik a komplex tesztelési munkafolyamatokat, a párhuzamosítást és a hibakeresést.

    Az alábbiakban összefoglaltuk a kiadás legfontosabb újdonságait és fejlesztéseit.

    Key Features & Újdonságok

    1. Test Locks (Tesztreteszek)

    • Megoldást nyújt a közös erőforrások (pl. központi adatbázis, globális fiókbeállítások vagy külső API-k) használata miatti ütközésekre.
    • Lehetővé teszi zárolások (locks) megadását, így a tesztek automatikusan sorba állnak a kritikus erőforrások eléréséhez, elkerülve a párhuzamos futtatásból eredő hibákat.

    2. Step paraméterek és feliratok (test.step)

    • A test.step() mostantól elfogad egy params opciót, amellyel saját metaadatokat és paramétereket adhatsz át a lépésekhez.
    • A riportokban és a Trace Viewerben tisztábban nyomon követhetők az egyedi lépésekhez tartozó változók és hívási argumentumok.

    3. Aria Traces & Bővített Tracing

    • A Trace Viewer új aria pillanatképeket (snapshots) támogat.
    • Megkönnyíti a hozzáférhetőségi (accessibility) elemek és az ARIA fa állapotának elemzését hibakeresés közben.

    4. Új Scroll Opciók az akcióknál

    • A legtöbb akciónál (pl. .click()) megjelent egy új scroll opció ("auto" | "none").
    • Lehetőséget biztosít arra, hogy kikapcsold a Playwright automatikus „scroll-into-view” viselkedését, ha egy elem pozícióját manuálisan szeretnéd kezelni.

    5. Új teszt opciók és CLI parancsok

    • Nagyobb hozzáférhetőség tesztelése: Új reducedMotion, forcedColors és contrast opciók a testOptions alatt.
    • --add-reporter parancssori opció: Bővítheted a meglévő riporterek listáját ahelyett, hogy felülírnád a playwright.config.ts-ben megadottakat.
    • omitTags opció: Letisztultabb tesztcímek a riportokban (suppress-eli az automatikusan hozzáfűzött tegeket a list, line, dot, github és junit riportereknél).

    Eltávolított (Deprecated) API-k

    A 1.63-as verzió végleg kivezeti a régen elavultnak jelölt funkciókat:

    • Locator.ariaRef() (használd helyette a locator.ariaSnapshot() funkciót).
    • handle opció a BrowserContext.exposeBinding és Page.exposeBinding esetében.
    • logger opció a BrowserType.connect és connectOverCDP metódusoknál.
    • videosPath és videoSize konfig opciók (használd a recordVideo-t).

    Frissítés

    A legújabb verzióra való átálláshoz futtasd a projekt gyökerében az alábbi parancsot:

    Bash

    npm install -D @playwright/test@latest
    npx playwright install

    Test Lock minta

    A Playwright 1.63-ban megjelent Test Locks (Tesztreteszek) opció segítségével megakadályozhatod, hogy bizonyos tesztek egyszerre futjanak és ütközzenek a közös erőforrásokon (pl. ugyanazon tesztfiók beállításai, adatbázis vagy külső API-k), miközben a többi független teszt továbbra is párhuzamosan fut.

    Az alábbiakban bemutatjuk a legfontosabb használati módokat kódpéldákkal.

    1. Egyedi teszt zárolása egy megnevezett retesszel (lock)

    Ha van két vagy több teszted, amelyek ugyanazt a megosztott erőforrást módosítják, megadhatsz nekik egy azonos lock nevet az opciók között:

    TypeScript

    import { test, expect } from '@playwright/test';
    
    // Ez a teszt lefoglalja az 'admin-account' reteszt
    test('Adminisztrátor frissíti a cég nevét', { lock: 'admin-account' }, async ({ page }) => {
      await page.goto('https://example.com/admin/settings');
      await page.getByLabel('Cégnév').fill('Új Cégnév Kft.');
      await page.getByRole('button', { name: 'Mentés' }).click();
    
      await expect(page.getByText('Sikeres mentés')).toBeVisible();
    });
    
    // Ez a teszt megvárja, amíg az előző teszt elengedi az 'admin-account' reteszt
    test('Adminisztrátor módosítja az időzónát', { lock: 'admin-account' }, async ({ page }) => {
      await page.goto('https://example.com/admin/settings');
      await page.getByLabel('Időzóna').selectOption('Europe/Budapest');
      await page.getByRole('button', { name: 'Mentés' }).click();
    
      await expect(page.getByText('Sikeres mentés')).toBeVisible();
    });
    

    Hogyan működik? Amíg a Worker 1 az első tesztet futtatja az admin-account retesszel, addig a Worker 2 nem kezdi el a második tesztet. A két teszt egymás után fog lefutni, de a csomag többi, független tesztje (pl. termékkeresés, kosárkezelés) továbbra is teljesen párhuzamosan fut a többi workeren.

    2. Egész tesztcsoport zárolása (test.describe)

    Ha egy egész blokknyi teszt egyetlen közös erőforráson dolgozik, a lock opciót közvetlenül a test.describe() csoportra is ráteheted:

    TypeScript

    import { test, expect } from '@playwright/test';
    
    test.describe('Adatbázis konfigurációs tesztek', { lock: 'database-config' }, () => {
      
      test('Alapértelmezett nyelv beállítása', async ({ page }) => {
        // ... teszt kód
      });
    
      test('Rendszerértesítések kikapcsolása', async ({ page }) => {
        // ... teszt kód
      });
    
    });
    

    3. Több retesz egyidejű használata (Array)

    Egy teszt akár több megosztott erőforrás zárolását is kérheti egyszerre. Ehhez adj meg egy tömböt a lock paraméterben:

    TypeScript

    import { test, expect } from '@playwright/test';
    
    test(
      'Fizetési átjáró és szállítási beállítások egyidejű frissítése',
      { lock: ['payment-sandbox', 'shipping-api'] },
      async ({ page }) => {
        // Ez a teszt csak akkor indul el, ha mindkét retesz szabad
        await page.goto('https://example.com/admin/integrations');
        // ... teszt kód
      }
    );
  • Kraftie #85 – Az AI ára

    Kollégákkal, barátokkal mi is sokat beszélgetünk erről, és hát egyelőre úgy tűnik, hogy az történik, amit ők mondanak. Várom azt a változást, amikor az bizonyosodik be, amire én számítok, de ez az AI téma nagyon érdekes változásokat tartogat.