<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>AGH on Benedykt Huszcza | Blog</title><link>https://blog.huszcza.dev/pl/tags/agh/</link><description>Recent content in AGH on Benedykt Huszcza | Blog</description><generator>Hugo -- gohugo.io</generator><language>pl</language><lastBuildDate>Tue, 18 Mar 2025 16:00:00 +0000</lastBuildDate><atom:link href="https://blog.huszcza.dev/pl/tags/agh/index.xml" rel="self" type="application/rss+xml"/><item><title>EnsembleAI 2025</title><link>https://blog.huszcza.dev/pl/p/ensemble-ai-2025/</link><pubDate>Tue, 18 Mar 2025 16:00:00 +0000</pubDate><guid>https://blog.huszcza.dev/pl/p/ensemble-ai-2025/</guid><description>&lt;img src="https://blog.huszcza.dev/p/cover.png" alt="Featured image of post EnsembleAI 2025" />&lt;p>W dniach &lt;strong>14-16.03.25&lt;/strong> razem z zespołem mieliśmy okazję wziąć udział w hackathonie w Krakowie. Uczestniczyliśmy już w poprzedniej edycji, więc jeśli chcecie dowiedzieć się więcej o tym wydarzeniu, serdecznie zapraszam do lektury wpisu &lt;a class="link" href="https://kaszkowiak.org/blog/ensemble-ai/" target="_blank" rel="noopener"
>Macieja&lt;/a>. &lt;br>
W skrócie – było to nasze pierwsze starcie z tworzeniem sieci neuronowych. Co więcej, uczyliśmy się wszystkiego na bieżąco, więc wyzwanie było naprawdę spore. Mimo wszystko udało nam się zająć &lt;strong>12 miejsce&lt;/strong>, co było dla nas duużym osiągnięciem!
W tym roku poszło nam jeszcze lepiej – udało nam się wywalczyć 3 miejsce!&lt;/p>
&lt;h2 id="prolog---przeddzień-walk">PROLOG - przeddzień walk
&lt;/h2>&lt;p>Założenie na ten hackathon mieliśmy proste: wiemy już więcej o AI i jeśli przyjdzie nam zmierzyć się z pisaniem sieci neuronowej, to jesteśmy na pewno lepiej przygotowani niż poprzednim razem.&lt;br>
Wspólnie z &lt;strong>Jakubem Binkowskim&lt;/strong> mieliśmy również okazję przejść przedmiot &lt;strong>Sieci neuronowe&lt;/strong>, co dało nam znacznie szerszy pogląd na przetwarzanie obrazów, techniki regularyzacji i sposoby zapobiegania przeuczenia modeli.&lt;br>
W piątek postanowiliśmy też zapoznać się z materiałami przesłanymi przez organizatorów. Mimo że nie był to dla nas łatwy materiał, udało nam się przebrnąć przez kilka z nich i wyciągnąć coś wartościowego. Jak okazało się później, mogliśmy się po prostu porządnie zrelaksować&amp;hellip;&lt;/p>
&lt;h2 id="początek---intuicja-ponad-wszystko">Początek - intuicja ponad wszystko
&lt;/h2>&lt;p>A więc lądujemy w sali na wystąpieniach otwierających i dostajemy kilka kluczowych informacji.&lt;/p>
&lt;p>Po pierwsze, dzięki współpracy organizatorów z &lt;strong>Cyfronetem&lt;/strong>, każdy zespół miał do dyspozycji naprawdę potężne maszyny – i tutaj poczułem, że to solidnie przyspieszy naukę naszych modeli. Liczby i moc obliczeniowa zrobiły ogromne wrażenie, więc kolejny raz mogę zbić piątkę z organizatorami za świetny pomysł.&lt;br>
Następnie dowiedzieliśmy się, jakie będą zadania, i tutaj spotkało nas lekkie zaskoczenie. Okazało się, że każdy zespół musi wybrać jedną z dwóch ścieżek:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Pierwsza&lt;/strong> – składała się z czterech podzadań dotyczących &lt;strong>uczenia adwersarzowego, kradzieży modeli&lt;/strong> i kilku innych tematów związanych z szeroko pojętym uczeniem maszynowym.&lt;/li>
&lt;li>&lt;strong>Druga&lt;/strong> – zadanie polegało na nauce bota do gry stworzonej przez organizatorów. Boty miały grać między sobą, a zasady rankingu były proste:
&lt;ul>
&lt;li>za remis drużyna dostaje &lt;strong>0.5 pkt&lt;/strong>,&lt;/li>
&lt;li>za wygraną &lt;strong>1 pkt&lt;/strong>,&lt;/li>
&lt;li>za przegraną – wiadomo&amp;hellip; &lt;strong>smutne i okrągłe 0 pkt&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>Wow, nie wiedzieliśmy, że tak szybko dopadnie nas widmo decyzji, ale na szczęście mieliśmy na nią ponad &lt;strong>8 godzin&lt;/strong>, więc był czas na testy i ocenę, w którym zadaniu będziemy czuć się najlepiej.
Po wykładach chwilę się rozluźniliśmy, podeszliśmy do kilku stanowisk – między innymi do &lt;strong>JetBrainsów&lt;/strong>. Razem z Szymonem jesteśmy fanami ich IDE, więc była to naprawdę fajna gratka. Także od dzisiaj oficjalnie staję się ich chodzącą reklamą, ale co tam – naprawdę doceniam jakość ich rozwiązań. 😎&lt;/p>
&lt;p>&lt;img src="https://blog.huszcza.dev/p/jetbrains_badges.jpg"
width="300"
height="400"
srcset="https://blog.huszcza.dev/p/jetbrains_badges_hu536186f9f2e0e720ed47eed2cd530a33_51008_480x0_resize_q75_box.jpg 480w, https://blog.huszcza.dev/p/jetbrains_badges_hu536186f9f2e0e720ed47eed2cd530a33_51008_1024x0_resize_q75_box.jpg 1024w"
loading="lazy"
alt="Od dzisiaj jestem chodzącą reklamą"
class="gallery-image"
data-flex-grow="75"
data-flex-basis="180px"
>&lt;/p>
&lt;h2 id="3-2-1-start---wyścig-rozpoczęty">3, 2, 1, start! - wyścig rozpoczęty!
&lt;/h2>&lt;p>Na początku, przez lekkie niezrozumienie zasad, postanowiliśmy jak najszybciej wypuścić &lt;strong>pierwszą wersję bota&lt;/strong> – byliśmy przekonani, że &lt;strong>rating&lt;/strong> będzie naliczany co godzinę, a finalny ranking będzie sumą poszczególnych pojedynków z trawania całego hackathonu.&lt;br>
Wypuściliśmy więc coś prostego, ale obrazowo nazwanego – &lt;strong>ICBM&lt;/strong>. Rakieta leciała &lt;strong>prosto z naszej bazy do bazy przeciwnika&lt;/strong>. Gdy tylko mieliśmy zasoby, odpalaliśmy kolejną rakietę.&lt;br>
I, ku naszemu zaskoczeniu, takie rozwiązanie dało &lt;strong>całkiem niezłe efekty&lt;/strong> na samym początku – &lt;strong>na tyle dobre&lt;/strong>, że poczuliśmy wiatr w żaglach i postanowiliśmy w pełni skupić się na tym zadaniu.&lt;/p>
&lt;h2 id="octospace--zasady-gry-w-pigułce-">&lt;strong>OctoSpace – zasady gry w pigułce&lt;/strong> 🚀
&lt;/h2>&lt;p>W grze celem jest całkowita dominacja. Można wygrać na dwa sposoby – eliminując przeciwnika poprzez przejęcie jego planety lub zdobywając więcej punktów po 1000 turach (w końcowym etapie organizatorzy zwiększyli tury do 2000, bo było za dużo remisów). Plansza o wymiarach 100x100 jest początkowo pokryta mgłą, a eksploracja statkami odkrywa jej kolejne obszary.&lt;br>
Statki pozwalają walczyć i zdobywać planety. Standardowa prędkość ruchu to 1 lub 2 pola na turę, jednak wchodząc w spowalniającą mgłę, statek porusza się trzykrotnie wolniej, a zderzając się z asteroidą, otrzymuje obrażenia. Statki mogą atakować na dystans do 8 pól, ale po każdym strzale z założenia miało następować 10-tur cooldownu, jednak odkryliśmy, że finalnie to nie było żadnego cooldown-u :D. Leczenie jednostek jest możliwe tylko na własnych planetach, gdzie odzyskują 1 HP na turę.&lt;br>
Aby powiększać flotę, potrzebujemy surowców, które zdobywamy kontrolując planety. Każda planeta składa się z 16 pól zasobów, a ilość pozyskanych surowców zależy od ich rodzaju i liczby kontrolowanych pól. Początkowa planeta ma wszystkie zasoby w równych proporcjach, ale inne planety mogą mieć ich nierównomierny podział.&lt;br>
Zdobywanie planet odbywa się poprzez wpadnięcie statku na planetę. Jeśli planeta jest nieprzejęta, przejmujemy ją natychmiast. W przypadku zajętej planety rozpoczyna się proces przejęcia, który trwa kilka tur. Jeśli planeta była w trakcie przejmowania przez przeciwnika, można zneutralizować jego postępy i odzyskać kontrolę.&lt;/p>
&lt;p>&lt;img src="https://blog.huszcza.dev/p/map_with_labels.png"
width="1662"
height="1188"
srcset="https://blog.huszcza.dev/p/map_with_labels_hu314875a1bbde97d68449a876eda79a2f_1709055_480x0_resize_box_3.png 480w, https://blog.huszcza.dev/p/map_with_labels_hu314875a1bbde97d68449a876eda79a2f_1709055_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="Mapa z oznaczeniami głównych obiektów"
class="gallery-image"
data-flex-grow="139"
data-flex-basis="335px"
>&lt;/p>
&lt;h2 id="nasz-plan">Nasz plan
&lt;/h2>&lt;p>Nie mieliśmy złudzeń – żaden z nas &lt;strong>nigdy&lt;/strong> wcześniej nie tworzył modelu opartego na Reinforcement Learningu. Jedyne, co mieliśmy na ten temat, to zajęcia sprzed tygodnia, na których razem z &lt;strong>Jakubem&lt;/strong> poznaliśmy podstawowe problemy i założenia RL. &lt;br>
Nie porzuciliśmy od razu wizji stworzenia czegoś więcej niż heurystyk, ale od nich chcieliśmy zacząć. Wiedzieliśmy, że i tak będą nam potrzebne – choćby po to, żeby w razie czego móc trenować model przeciwko różnym strategiom.&lt;br>
Jednakże&amp;hellip; &lt;strong>spoiler alert&lt;/strong> – dowiedzieliśmy się, że na maszynie testowej nie można korzystać z bardziej &lt;strong>wysokopoziomowych narzędzi do RL&lt;/strong>. Możemy używać &lt;strong>tylko czystego PyTorcha&lt;/strong> (only sad reactions).&lt;br>
I tak oto przybiliśmy gwóźdź do trumny i zamiast walczyć z ograniczeniami, postanowiliśmy przerzucić wszystkie siły na stworzenie najmocniejszej heurystyki, na jaką nas stać.&lt;/p>
&lt;h2 id="od-rakiety-do-floty---nasze-pomysły">Od rakiety do floty - nasze pomysły
&lt;/h2>&lt;p>Na starcie nasza &lt;strong>heurystyka&lt;/strong> zawierała tylko jeden typ statku – &lt;strong>ICBM&lt;/strong>. Jego zadaniem było czyste bombardowanie bazy przeciwnika. Proste, ale skuteczne – nawet bardziej niż skuteczne, bo przez pierwsze &lt;strong>12&lt;/strong> godzin hackathonu zajmowaliśmy &lt;strong>pierwsze miejsce w tabeli&lt;/strong>XD. To było dla nas spore zaskoczenie.&lt;/p>
&lt;h3 id="icbmv2---pierwsze-ulepszenie">ICBMv2 - pierwsze ulepszenie
&lt;/h3>&lt;p>Kolejnym krokiem była wersja &lt;strong>ICBMv2&lt;/strong>, która miała zaimplementowany &lt;strong>pathfinding&lt;/strong>, czyli lokalne znajdowanie najlepszej ścieżki, omijającej asteroidy i mgły spowalniające. W strategii bombardowania bazy przeciwnika było to kluczowe, bo każde spowolnienie naszej rakiety działało na naszą niekorzyść.&lt;/p>
&lt;h3 id="defender---pierwsza-linia-obrony">Defender - pierwsza linia obrony
&lt;/h3>&lt;p>&lt;strong>Defender&lt;/strong> to nasza ostoja i pierwsza pomoc w systemie bezpieczeństwa. Jego zadanie było następujące:&lt;/p>
&lt;p>Ustawić się pod odpowiednim kątem i razem z drugim defenderem tworzyć ogień krzyżowy, pokrywający większość ataków na naszą bazę.&lt;br>
W razie kryzysu pełnił funkcję &lt;strong>pierwszej pomocy&lt;/strong> – jeśli baza była atakowana, a nie mieliśmy wystarczających zasobów na nowy statek (stworzenie nowego statku w trakcie przejmowania zatrzymywało przejmowanie), defender leciał na ratunek i odbijał bazę.&lt;/p>
&lt;h3 id="explorer---zwiad-i-zbieranie-zasobów">Explorer - zwiad i zbieranie zasobów
&lt;/h3>&lt;p>Wiedzieliśmy, że zmasowany atak bez zasobów szybko się skończy, więc potrzebowaliśmy kogoś, kto nie tylko zdobywa surowce, ale i odkrywa mapę.&lt;/p>
&lt;p>&lt;strong>Explorer&lt;/strong> korzystał z pathfindingu, ale&amp;hellip; nie udało nam się stworzyć idealnego algorytmu szukania ścieżki, więc zdarzało się, że się blokował. W finalnej wersji, jeśli utknął, zmieniał się w &lt;strong>rakietę&lt;/strong>, dodatkowo zmieniając standardowy wektor ataku naszej strategii (standardowym wektorem była główna przekątna mapy).
Btw. Jak widzę nagłą przemianę explorera w rakietę to mam przed oczami ten obraz:&lt;/p>
&lt;p>&lt;img src="https://blog.huszcza.dev/p/anakin.gif"
width="640"
height="268"
srcset="https://blog.huszcza.dev/p/anakin_hu13edf962f071b6f2a8a33486463dbeb0_67332_480x0_resize_box_1.gif 480w, https://blog.huszcza.dev/p/anakin_hu13edf962f071b6f2a8a33486463dbeb0_67332_1024x0_resize_box_1.gif 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="238"
data-flex-basis="573px"
>&lt;/p>
&lt;h3 id="backdoor---cichy-zabójca">Backdoor - cichy zabójca
&lt;/h3>&lt;p>Analizując naszą taktykę, zauważyliśmy, że jest wrażliwa na ataki z granic mapy. Idąc tym tropem, doszliśmy do wniosku, że przeciwnicy też mogą nie zabezpieczać się wystarczająco.&lt;br>
Tak powstał &lt;strong>Backdoor&lt;/strong> – cichy zabójca, który po dotarciu za bazę przeciwnika i odczekaniu odpowiedniego czasu niespodziewanie ją atakował.&lt;br>
W finalnym rozrachunku nie okazał się wystarczająco efektywny, by wprowadzić go do naszej strategii, a czas nie pozwalał nam również dokładnie przetestować jego wpływu. &lt;br>
Jednakże jego sposób działania był na tyle komiczny, że muszę to pokazać XD.&lt;/p>
&lt;div class="video-wrapper">
&lt;video
controls
src="https://blog.huszcza.dev/p/backdoor_attack.mp4"
>
&lt;p>
Your browser doesn't support HTML5 video. Here is a
&lt;a href="https://blog.huszcza.dev/p/backdoor_attack.mp4">link to the video&lt;/a> instead.
&lt;/p>
&lt;/video>
&lt;/div>
&lt;p>Na nagraniu widać jak zielone backdoory gracza pierwszego skradają się na krańcu mapy, odczekują chwilę, a następnie razem atakują. Na przekątnej natomiast widać różowe statki gracza drugiego, czyli wersje ICBM naszych statków.&lt;/p>
&lt;h3 id="smażenie-wrogów---dodatkowy-atut-rakiet">Smażenie wrogów - dodatkowy atut rakiet
&lt;/h3>&lt;p>Do tej pory nasze boty nie wykorzystywały strzelania, ale na końcowym etapie hackathonu je dodaliśmy – i to działało naprawdę dobrze.&lt;br>
Każdy napotkany przeciwnik, póki był w naszym zasięgu, był kolokwialnie mówiąc &lt;strong>grillowany&lt;/strong> 🔥. Jednak w naszej głównej taktyce, gdzie statki nie były statkami, a latającymi rakietami planeta → planeta, ta funkcjonalność niestety spowalniała je, co wpływało negatywnie na ich efektywność.&lt;/p>
&lt;hr>
&lt;h2 id="pomysły-na-które-nie-starczyło-nam-czasu">Pomysły, na które nie starczyło nam czasu
&lt;/h2>&lt;h3 id="wariant-szymona---stackowanie-rakiet-i-zmasowany-atak">Wariant Szymona - stackowanie rakiet i zmasowany atak
&lt;/h3>&lt;p>Plan był prosty – gromadzimy rakiety, a potem wysyłamy je w jednym, &lt;strong>miażdżącym ataku&lt;/strong>.&lt;br>
Brzmi jak coś, co naprawdę mogłoby zadziałać, ale&amp;hellip; niestety nie starczyło nam czasu, żeby to przetestować :(&lt;/p>
&lt;p>&lt;img src="https://blog.huszcza.dev/p/fleet_icbm.jpg"
width="1920"
height="804"
srcset="https://blog.huszcza.dev/p/fleet_icbm_hu02aa61ae1d9de35cbe238d2676170cb9_304133_480x0_resize_q75_box.jpg 480w, https://blog.huszcza.dev/p/fleet_icbm_hu02aa61ae1d9de35cbe238d2676170cb9_304133_1024x0_resize_q75_box.jpg 1024w"
loading="lazy"
alt="Widok z perspektywy bazy przeciwnika gdybyśmy wcielili plan w życie"
class="gallery-image"
data-flex-grow="238"
data-flex-basis="573px"
>&lt;/p>
&lt;h2 id="kilka-usprawnień-w-procesie-tworzenia-bota">Kilka usprawnień w procesie tworzenia Bota
&lt;/h2>&lt;p>Warto zaznaczyć, że &lt;strong>nie samym kodem nasze rozwiązanie żyło&lt;/strong>.&lt;br>
Ponieważ przesyłany bot musiał zmieścić się w jednym pliku, a nasza struktura zawierała ich wiele, w tym wspólne funkcje dla różnych modułów, stworzyliśmy skrypt, który łączył plik &lt;code>utils.py&lt;/code> z naszą wersją agenta (bota).&lt;br>
Każdy agent miał swój własny folder i moduł. Proste, ale jakże skuteczne. &lt;br>Żeby porównać dwa rozwiązania, wystarczyło w skrypcie podać nazwy folderów, w których znajdowali się nasi agenci i&amp;hellip; &lt;strong>cyk!&lt;/strong>. Dwa boty rozpoczynały batalię między sobą – za jednym kliknięciem Entera. Brzmi to bardzo prosto, ale uwierzcie mi, że sam pewnie nabiłem ponad sto odpaleń tego skryptu, a przy takiej liczbie każde dodatkowe kliknięcie ma znaczenie.&lt;/p>
&lt;h3 id="cicd---automatyzacja-wykrywająca-błędy">CI/CD - automatyzacja wykrywająca błędy
&lt;/h3>&lt;p>W trakcie hackathonu pojawiał się nie jeden błąd w grze (kodzie źródłowym), a organizatorzy naprawiali je na bieżąco. Wpływało to na kompatybilność naszych botów, więc dodanie automatyzacji pozwoliło nam sprawdzać, czy nasze konfiguracje nadal działają zgodnie z nową wersją gry.
Dodatkowo mieliśmy w planach równoległe i automatyczne testowanie nowych botów, ale&amp;hellip; po raz kolejny nie starczyło nam na to czasu.&lt;/p>
&lt;h2 id="finał---triumf-prostoty">Finał - triumf prostoty
&lt;/h2>&lt;p>Nasza &lt;strong>finalna heurystyka&lt;/strong> prezentowała się następująco:&lt;/p>
&lt;h3 id="-rdzeń-rakiety-icbm">🔥 Rdzeń: rakiety ICBM
&lt;/h3>&lt;p>Jeśli defenderzy są na miejscu i nie wypada tura na tworzenie Explorera, to &lt;strong>bombardujemy przeciwnika ICBMv2&lt;/strong>. Dodatkowo na samym początku gry wypuszczamy dwie wersje rakiety v1 oraz v2.&lt;br>&lt;/p>
&lt;h3 id="-wsparcie-explorer">🚀 Wsparcie: Explorer
&lt;/h3>&lt;p>Co jakiś czas do gry wchodził Explorer – jego głównym zadaniem było szukanie planet z zasobami.&lt;br>
Jeśli uległ zakleszczeniu, zmieniał się w rakietę ICBMv2, randomizował wektor ataku.&lt;/p>
&lt;h3 id="-bezpieczny-mur-dwójka-defenderów">🛡️ Bezpieczny mur: Dwójka Defenderów
&lt;/h3>&lt;p>Bez większych zmian – jeśli baza jest atakowana i nie możemy jej obronić nowym statkiem, to &lt;strong>Defender zmieniał się w medyka&lt;/strong>. &lt;br>
W innym przypadku prowadził ciągły ogień krzyżowy, smażąc wszystko, co popadnie.&lt;/p>
&lt;hr>
&lt;p>I tak! &lt;strong>Taka heurystyka dała nam 3. miejsce!&lt;/strong> 🏆&lt;/p>
&lt;p>Może wydawać się trywialna, ale naprawdę przyniosła efekty. Jak widać, nie rzuciliśmy się na falę szczęścia, tylko w testach i ewaluacjach to podejście okazało się najefektywniejsze.&lt;br>
A jeśli &lt;strong>działa, to znaczy, że jest co najmniej dobre&lt;/strong>.&lt;/p>
&lt;h3 id="gamechanger---wiedza-prosto-z-kodu-źródłowego">Gamechanger - wiedza prosto z kodu źródłowego
&lt;/h3>&lt;p>Warto też zaznaczyć, że przez cały czas trwania hackathonu analizowaliśmy kod źródłowy gry. Dzięki temu poznaliśmy jej działanie od samych podstaw, dowiedzieliśmy się, że &lt;strong>czasami zamiast strzelać, lepiej uciekać&lt;/strong>, a także odkryliśmy wiele innych sprytnych taktyk, które wykorzystaliśmy w naszym finalnym rozwiązaniu.&lt;/p>
&lt;h2 id="epilog">Epilog
&lt;/h2>&lt;p>Pisząc ten post, nadal czuję naprawdę &lt;strong>dużą satysfakcję&lt;/strong>, ale przede wszystkim cieszę się z czasu spędzonego z drużyną. &lt;br>
Naprawdę to &lt;strong>świetne uczucie&lt;/strong> – walczyć ramię w ramię z kolejnymi przeciwnościami, mając u boku taką ekipę jak nasza. Co więcej, sam event, mimo drobnych potknięć, był &lt;strong>nie tylko ambitny, ale też świetnie przemyślany&lt;/strong>.&lt;/p>
&lt;p>Na wielu hackathonach wybór zwycięzcy opiera się na subiektywnej opinii jury, a tutaj wygrywa matematyka – &lt;strong>kto wyżej w rankingu, ten lepszy&lt;/strong>. I to jest coś, co naprawdę doceniam.&lt;br>
Mam wielką nadzieję, że &lt;strong>za rok ponownie uda nam się wziąć udział&lt;/strong> w kolejnej edycji wydarzenia. Wiem, że następnym razem będziemy jeszcze mocniejsi i wierzę, że znów staniemy w szranki – zarówno ze swoimi słabościami, jak i z wieloma naprawdę utalentowanymi i ambitnymi deweloperami.&lt;/p>
&lt;hr>
&lt;h3 id="podziękowania">Podziękowania
&lt;/h3>&lt;p>&lt;strong>Dzięki ekipo!&lt;/strong>&lt;br>
&lt;strong>&lt;a class="link" href="https://www.linkedin.com/in/maciej-kaszkowiak/" target="_blank" rel="noopener"
>Maciej Kaszkowiak&lt;/a>, &lt;a class="link" href="https://www.linkedin.com/in/jakub-binkowski-80136825b/" target="_blank" rel="noopener"
>Jakub Binkowski&lt;/a>, &lt;a class="link" href="https://www.linkedin.com/in/maciej-mazur-90064b2b4/" target="_blank" rel="noopener"
>Maciej Mazur&lt;/a> i &lt;a class="link" href="https://www.linkedin.com/in/szymon-pasieczny-4a664b215/" target="_blank" rel="noopener"
>Szymon Pasieczny&lt;/a>&lt;/strong> – jak już mówiłem, dzięki wam hackathon to nie tylko kodzenie, ale też świetnie spędzony czas z dużą dozą śmiechu, żartów i tryhardu. Czyli mieszanka w idealnych proporcjach.&lt;/p>
&lt;p>&lt;strong>Dzięki Adamowi Mazurowi&lt;/strong> – przewodniczącemu koła &lt;strong>&amp;ldquo;Ghost&amp;rdquo;&lt;/strong> na Politechnice Poznańskiej. Dzięki jego zaangażowaniu najprawdopodobniej otrzymamy finansowanie od uczelni, a to naprawdę dobre uczucie – mieć świadomość, że nasza uczelnia wspiera nas w tym, co robimy.&lt;/p>
&lt;p>&lt;strong>Dzięki organizatorom!&lt;/strong> – bez was nie byłoby tego eventu. Czuć, że wykonaliście kawał dobrej roboty – dużo rzeczy zostało poprawionych względem poprzedniej edycji i wiem, że ta tendencja będzie utrzymana.&lt;/p>
&lt;p>Kto wie, może kiedyś hackathon odbędzie się na Politechnice Poznańskiej? 🤔&lt;/p>
&lt;hr>
&lt;p>Dzięki za poświęcony czas na przeczytanie tego wpisu! Na dole wrzucam kilka fotek z wydarzenia, a jak dojdą jakieś nowe, to postaram się je uzupełnić!&lt;/p>
&lt;p>&lt;img src="https://blog.huszcza.dev/p/pizza.jpg"
width="2048"
height="2731"
srcset="https://blog.huszcza.dev/p/pizza_hu8802891fcec66ba25cedd0c7885592e4_530245_480x0_resize_q75_box.jpg 480w, https://blog.huszcza.dev/p/pizza_hu8802891fcec66ba25cedd0c7885592e4_530245_1024x0_resize_q75_box.jpg 1024w"
loading="lazy"
alt="Nie mogło zabraknąć pizzy"
class="gallery-image"
data-flex-grow="74"
data-flex-basis="179px"
> &lt;img src="https://blog.huszcza.dev/p/snow.jpg"
width="2048"
height="2731"
srcset="https://blog.huszcza.dev/p/snow_hua6efa9f400c357b7b771fded616df924_472425_480x0_resize_q75_box.jpg 480w, https://blog.huszcza.dev/p/snow_hua6efa9f400c357b7b771fded616df924_472425_1024x0_resize_q75_box.jpg 1024w"
loading="lazy"
alt="W Krakowie zaskoczył nas śnieg!"
class="gallery-image"
data-flex-grow="74"
data-flex-basis="179px"
>&lt;img src="https://blog.huszcza.dev/p/winners.jpg"
width="2016"
height="1512"
srcset="https://blog.huszcza.dev/p/winners_hu791980cec79be0ba1377b9dfad43049c_255764_480x0_resize_q75_box.jpg 480w, https://blog.huszcza.dev/p/winners_hu791980cec79be0ba1377b9dfad43049c_255764_1024x0_resize_q75_box.jpg 1024w"
loading="lazy"
alt="Nasza ekipa"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
>&lt;/p></description></item></channel></rss>