Zápisky ze SymfonyWorld Online 2020: JavaScript v Symfony 5.2, Composer 2, PHP 8

Proběhlá konference SymfonyWorld Online 2020 mi byla alespoň malou náplastí skutečnosti, že v tomto podivném roce jsem se nemohl žádných setkání s kolegy vývojáři zúčastnit osobně. Ale byť na dálku, dělal jsem si již tradičně poznámky, abych celou akci mohl shrnout do článku pro ty, kdo neměli čas si tentokrát pustit video.

SymfonyWorld Online 2020 byla rozdělená do tří přednáškových pásem. Technicky to bylo zvládnuté celkem s přehledem. Registrace jednoduchá v porovnání s otřesných registračním formulářem na podobnou drupalovskou akci příští týden. Prostory pro virtuální konferenci zajistil Hopin, ve kterém byly streamovány YouTbe videa.

Videa byla kvůli eliminaci případných problémů předtočená. A také opatřená titulky. Všechny přednášky byly anglicky. Moderátoři samozřejmě byli připojeni naživo a taktéž jednotliví spíkři. Po skončení záznamu se vždy připojili a byl prostor na dotazy. Mnozí z nich byli online i v průběhu svého povídání a reagovali na chatu.

Znělky předělů a úvodníků mi dávaly pocit, že opravdu sedím v sále a vnímám tu konferenční atmosféru. Byť v reálu jsem měl na uších sluchátka a seděl vyvrácený v křesle v obýváku před monitorem. Online akce má výhodu v tom, že si mohu spustit zpětně přednášky, které jsem kvůli překryvu s dalšími nestihl.

SymfonyWorld Online 2020

Celkově technicky, organizačně i obsahově velice povedený počin. Díky všem organizátorům a přednášejícím. A teď k jednotlivým informacím, které mi přišly hodné poznámek:

Nicolas Grekas – pre keynote o přispívání do Symfony

Jeden z hlavních přispěvatelů do jádra Symfony na začátek povídal o stavu komunity, co se týče vývoje frameworku. V roce 2019 bylo Symfony frameworkem s nejvíce přispěvateli. Každých šest měsíců vychází minor verze, každý měsíc bugfixy.

Se začátkem konference byla rovněž uvolněna Symfony 5.2, kterou doporučuje pro nové projekty. Ostatně, novinky k tomu úplně svádí, viz dále. Symfony 6 přijde v listopadu 2021. Zajímavé je, že vydávání nových verzí se striktně drží kalendáře, nikoli funkcí, které by vývojáři do nové verze naplánovali. Prostě, co je v tu dobu již hotovo, to se tam objeví. Nejsem si jist, jestli je to nejlepší přístup.

Nicolas dále mluvil a mergování mezi jednotlivých vývojovými větvemi, zpětné kompatibilitě v rámci major verze. Z hlediska udržitelnosti projektu je dobré vědět, že zastaralé věci nejsou odebírány hned, ale nejprve jsou drženy jako deprecated. Git Symfony má 70 větví, jako jsou console, finder, debug, translation, http-foundation.

Z čeho si vzít ponaučení i pro své projekty? Dávejte smysluplné informace do poznámek k jednotlivým commitům.

Fabien Potencier – spojujeme komunity pomocí Symfony UX

Hlavní keynote otce Symfony. Framework slaví 15 let, má silnou komunitu, 17 vývojářů jádra, spoustu lidí v podpoře, sedm dokumentátorů, nespočet vývojářů. Následně Fabien mluvil trochu o historii a důležitých součástech Symfony:

  • HttpKernelInterface se nezměnilo od doby Symfony 2. Jednoduché rozhraní je zároveň výkonné, standardy jsou výkonné a mocné. Stejně tak zpětná kompatibilita je důležitá.
  • Když přišel Flex, umožnil sadě komponent chovat se jako framework. Jednoduše rozběhnete projekt díky Symfony CLI, Composeru, Flexi a Dockeru.
  • Velmi silnou součástí je Maker Bundle. Uživatelé? Stačí symfony console make:user. Přihlašování zajistí symfony console make:auth. Registrační formulář symfony console make:registration-form. A nemusíte sáhnout do kódu. Jen otevřete stránky /login či /logout. Pak zadáte symfony open:local:webmail a prohlédnete si MailCatcher pro odchytávání mailů z aplikace.
  • Máme přihlašování bez hesla, 2FA/MFA.

Je tedy spousta nástrojů, které se v Symfony postupně objevily. Ale co dál po Symfony CLI, Flexu, maker bundle či Webpack Encore? JavaScript!

Symfony 1 v sobě měla Prototype. Symfony 2 se JavaScriptu zbavila. Ono vlastně dodnes není moc jasné, který je ten nej. Každý má jiného favorita a JS scéna je dost roztříštěná. Angular, React nebo Vue?

Fabien proto nechtěl framework svázat s jednou konkrétní velkou knihovnou. JS ekosystém je nicméně o dost vyspělejší než před deseti lety. Navíc máme v Symfony první vlaštovku v podobě Webpack Encore. Což je ovšem udělátko pro nástroje (tooling) k vývoji, nikoli přímo prvek výsledné aplikace. Hledáme tedy něco jednoduchého, co poběží s HTML a Twigem, dovede růst se single page aplikacemi.

Zrodilo se Symfony UX. Navázané je na projekt Stimulus, což je pěkná a jednoduchá javascriptová záležitost. Napojí se pár atributy k HTML značkám a funguje.

Fabien dále v ukázce předvedl využití Dropzone pro snadné nahrávání souborů. JavaScript a CSS této knihovny napojíte tak snadno, jak snadná je definice speciální DropzoneType::class v definici formuláře. Nic víc neřešíte.

Symfony ux-swup zase výrazně zrychluje načítání stránek, kdy mění jen obsahovou část, zároveň se stará o změnu v adresním řádku prohlížeče. Opět napojíte velice snadno. Další ukázka proběhla s blurhash pro rychlejší načítání obrázků.

Tohle mě hodně zaujalo a už se těším, jak Symfony UX v některém svém projektu implementuju. Nic samozřejmě nebrání aplikace dále rozšířit o React nebo můj oblíbený Vue.

Titouan Galopin – praktické ukázky JavaScriptu v Symfony

Následující přednáška po Fabienovi předvedla nové propojení s JavaScriptem v dalších praktických ukázkách. Symfony je počínaje dvojkovou řadou JavaScript agnostic. Nenutí nám konkrétní JS framework, každému je dopřáno napojit svoje dle libosti. Od vanilla JavaScriptu, k Reactu, Vue, Angularu atd.

Co bylo cílem Symfony UX iniciativy?

  • Organizace JavaScriptu uvnitř našeho projektu
  • Vyhnout se komplexitě, co nejvíce to půjde. Co nejméně kódu.
  • Spolehnout se na kód vyvinutý ostatními
  • Implementovat skvělé user experience
  • Nebýt vázán na jeden konkrétní JS framework
  • Spoléhat na standardy
  • Umožnit automatické testování

Výsledkem je kombinace knihoven a nástrojů Stimulus, Flex, Webpack Encore, Swup/Turbolinks.

Stimulus má kořeny u Ruby on Rails. S HTML pracuje jinak než třeba Vue a React. Je to něco jako router pro DOM uzly. Propojuje je s různými reakcemi v JavaScriptu. Stačí k prvkům v HTML přidat atributy data-controller a data-target. Šablony, soubory, endpointy, to za nás nakonfiguruje Flex.

Swup je něco jako Pjax na GitHubu. Při načtení stránky nemění celý web. Rovněž se stará o přechodovou animaci při přepínání stránek. Implementace je velice jednoduchá. Zavoláte composer req symfony/ux-swup a přidáte data-controller do HTML značky <body>.

Kévin Dunglas – novinky v API Platform

Znáte API Platform? Tento projekt umožňuje velice rychle vytvořit základ pro aplikace řízené přes API. Používá Mercure, Vulcain či GraphQL, Hydra, OpenAPI, JSON. Součástí je vygenerované administrační rozhraní podobné EasyAdminu nebo Sonatě, ale je plně dynamické a napsané v Reactu a jiných řešeních.

Nadesignujete v něm veřejný datový model, popíšete data transfer objekty, přidáte datové typy, embedujete popisky. Díky integraci s maker bundle rovnou vytvoříte entity mapované do Platform API.

Nová verze 2.6 alpha přináší zajímavé novinky:

  • Použití atributů z PHP 8
  • Globální defaulty, konfiguraci aplikovanou na všechny zdroje
  • Řízení přístupu k vlastnostem, třeba přístup k políčku jen pro admina
  • GraphQL subskripce díky Mercure
  • Podporu dalších anotací
  • Nový OpenAPI Docs builder
  • Lepší podporu Vulcain
  • API Platform Client Generator
  • Parsování API docs
  • Ke generátorům pro TypeScript, React + Redux, Vue, React Native, Vuetify a Quasar přidává TypeScriptový generátor pro Next.js a server side rendering. Resp. nahrazuje s ním podporu React + Redux. Rovněž je nový generátor pro Nuxt.js.
  • Nová komponenta ActivityPub

API Platform UX podporuje Caddy webserver s jeho vychytávkami, jako vestavěnou podporou Let’s Encryptu i na lokále, HTTP/3 a PHP-FPM. Alternativou je Symfony Docker se Symfony Docker Configuration.

Celkem má API Platform 590 přispěvatelů. Trojka bude podporovat pouze PHP 8, předělá subresources a UX.

Christopher Hertel o Console Apps a Alexander M. Turek odkrývající závoj Dependency Injection

I na virtuální konferenci se projevila moje poobědová slabost a upadající pozornost, navzdory veškeré snaze. Přednáška o konzolových aplikacích se mi zdála nudná, byť podle anoncovaného popisku mě zajímala. Takže jsem „přepnul“ na Alexandera, kde to bylo o poznání zajímavější. Ale slabost si vzala daň v podobě nechuti dělat si poznámky. Jen jsem to sledoval a chvílemi klimbal. Ještě, že máme ty záznamy.

Stefan Koopmanschap – od Symfony 0.6 k Symfony 5

Tohle byla spíše odpočinková přednáška, žádné zásadní technologické tipy zde nezazněly. Přesto mě příběh nizozemského vývojáře a jeho cesty od prvního kontaktu se Symfony zaujal. Měl hezky zpracovanou grafiku ve formě lodě proplouvající a objevující novou zemi.

Začal se symfony, kdy se ještě psalo s malým s na začátku a mělo jiné logo. Na šablonování se používal Propel, byl tu sfContext pro řízení aplikace. V té době Stefan stavěl projekty na Mambo CMS (i Maxiorel na tomto předchůdci Joomla v začátku běžel). Frameworky teprve nabíraly vedle CMS na popularitě. Když si chtěl vybrat, uvažoval mezi Zend a symfony.

Zend se zdál serióznější, symfony je zaujalo konceptem. V práci si tedy sedli a věnovali čas tomu, aby na symfony vyvinuli kus projektu. Doporučuje to i dnes, abyste zjistili, jak vám daný nástroj či framework sedne.

Když přišlo Symfony 1, už bylo vyladěnější. Nové projekty kopíroval z předchozích. Časem zjistil, že vlastně má několik variant aplikace, které pořád kopíruje a udržuje. Bylo třeba to nějak strukturovat, aby údržba byla snazší. A tou cestou šlo i Symfony.

Stefan a jeho zaměstnavatel tedy uspořádali vůbec první SymfonyCamp. V pěkném lesním prostředí, ve vile s bazénem. Mimochodem, tu jsou fotky, včetně mladého Fabiena. Spoustu věcí se člověk naučí při kontaktu s dalšími lidmi. Je důležité potkávat další vývojáře.

Symfony 2 přineslo komponenty, pěkně izolované kousky kódu. Upgrade projektů zabral hodně času. Přechod na trojku byl výrazně jednodušší. Čistější verzování, menší změny, bugfixy, starý kód je před odstraněním nějakou dobu deprecated.

Ještě mnohem zdravější prostředí nabídlo Symfony 4, přidalo environment variables, adresářovou strukturu podobnou Linuxu. Symfony 5 zase přidalo pevně dané termíny nových verzí, což je fajn pro plánování projektů s jejich zadavateli.

Celkově Stefan na Symfony oceňuje především sílu komunity. A také podporu Composeru.

Ryan Weaver – Symfony Security Component

Této šílenec mi utkvěl v paměti od doby, kdy jsem si předplatil tehdy ještě KnpUniversity, dnes SymfonyCasts a jeho videokurzy o Symfony. Má nezaměnitelný nadšenecký projev a rád jeho školení poslouchám.

Tentokrát Ryan mluvil o bezpečnostní komponentě v Symfony. V roce 2010 přišla s prvním commitem od Fabiena. V lednu 2011 doznala nějakých vylepšení a od té doby… Nic. Je strašlivě komplexní, málokdo ví, jak vlastně na pozadí funguje. Vývojáři rádi nechávají bezpečnostní věci na frameworku, ať to nějak zařídí. Musím říci, že do této škatulky taky zapadám.

Ve stručnosti: get – firewall – auth listenery – unauth token – auth manager – auth provideři – auth token. Logika je rozdělena do čtyřech míst, bez centralizace, každý auth listener a auth provider dělá řadu různých věcí.

Symfony 5.2 přináší novou Security Component, která tyto věci centralizuje. Implementace pro toho, kdo nejde příliš do detailu bude podobná. User class vypadá stále stejně, zamítání přístupu v controlleru je stejné, definice v security.yaml bude mít jen pár změn.

Mizí anonymní uživatel! Požadavky prostě jdou do firewallu anonymně. Authentikátory nyní vrací Passport a badges (user badge, password credentials, csrf badge). Je tu nové AuthenticatorInterface.

Nicolas Grekas – co je nového v Symfony v roce 2020

Druhý den začaly přednášky povídáním o novinkách ve světě Symfony v letošním roce. Vyšlo Symfony 5.1, současně s konferencí přišlo Symfony 5.2. Letos ukončily svůj život také řady 4.3, 5.0 a 3.4 LTS.

Čítač stahování ukazuje 6 bilionů (nejsem si jist, zda myslel – francouzsky – kontinentální miliardu nebo opravdu bilion), neboli 100 downloadů každou sekundu. Kdo to zkusí vynásobit? Loni to bylo kolem 40 downloadů každou sekundu.

Symfony má 5 členů core týmu, podpora PHP 8 jde podle plánu. Pro starší PHP je k dispozici symfony/polyfill-php8. Flex byl upraven pro podporu Composeru 2. Vyšel EasyAdmin 3 (trochu se bojím o jednoduchost přechodu, když jsem viděl konfiguraci). Je nový Twig 1.44 / 2.14 a 3.1. Webpack Encore podporuje Symfony UX. Je tu Panther (testovací a scrapovací knihovna) a Mercure (protokol pro push data updaty).

Nesmírně „důležitá“ věc: všech 170+ stromů symfony/* už nemá větev master…

Vyšla kniha Symfony 5 The Fast Track. Jak Fabien před rokem slíbil, je od srpna zdarma v online verzi. Přeložena je do mnoha jazyků, ve slajdu jsem viděl i částečný překlad do češtiny, ale na webu jej nevidím.

Služba SymfonyInsights podporuje Composer 2, MS Teams, PHP config, tiskové reporty, umí 32 nových kontrol a reporty k deprecation částem kódu.

Symfony Cloud přidal sedmidenní trialku, lepší podporu pro staré aplikace bez Flexu, Composer 8 a PHP 8, XS velikost containeru pro opravdu malé projekty. Zatímco pro Drupal stačil výkon v S a L kontejnerech, pro Magento bylo potřeba XL. Naopak S byl pro řadu věcí na Symfony zbytečně velký.

Certifikace pro Symfony 5. Po změně z USA providera na evropského je nyní možná certifikace odkudkoli na světe. Američani měli řadu zákazů pro některé země. Na zkoušku můžete už 30 minut po nákupu, lze neomezeně přeplánovat, výsledky se dozvíte hned po zkoušce. Funguje na Windows, Linuxu i macOS, kde to, myslím, dříve nešlo. Během konference nabízeli slevu na certifikaci 30 % s možností vykonat zkoušku během následujícího roku.

Symfony 5.1 umí Safe HTTP Preference, RFC 8674. Například pro požadavek na server, aby vrátil obsah bezpečný pro děti. Napadá mě, jestli to někdo už použil třeba u nás praxi.

Mark Nottingham – etika a technika

Z duše nesnáším současné trendy, kdy na technologické konference pronikají spíkři s nutností podělit o svůj světonázor, jak na sebe musíme být hodní. Symfony toto samozřejmě neminulo, viz třeba výše zmínka o odebrání master větví z Gitu. Ale pořád je to slabé kafe proti tomu, co se děje třeba na DrupalConech.

Nicméně zpět k Markovi. Já nemohu říci, že bych s řadou jeho názorů nesouhlasil. S něčím ano, s něčím ne. Ale fakt nechci na konferenci o programování poslouchat rozjímání nad současným stavem společnosti.

Povídal o zodpovědnosti inženýrů vůči společnosti v době před internetem. Lidé tvrdí, že technologie nejsou politika. Že rozvoj techniky vyřeší problémy. Technologie podle Marka sice politická není, avšak vytváření technologií politika je. Dopad technologií na společnost je politika.

Regulace jsou potřeba. V diskuzi jsem si všiml poznámky, že regulace od devadesátých let objevuje stále více a více. Dále padla zmínka o (asi taky Markově) RFC8890 – Internet pro koncové uživatele.

V diskuzi jsem také viděl povídání o tom, jestli někdo kvůli etice odešel ze zaměstnání. Ozvalo se plno rozjitřených lidí s historkami, jak odešli ze zaměstnání, protože jejich boss chtěl jenom vydělávat peníze a nedbal na všeobecné blaho nebo na bezpečnost dat uživatelů. No, vítejte v realitě.

Škoda, že tato přednáška nebyla po obědě. Tam by pasovala jako prdel na hrnec.

Jordi Boggiano, Nils Adermann – Composer 2

Moc zajímavé povídání o nástroji, který neslouží jenom Symfonistům. Dvojka byla uvolněna 24. září 2020. Vývoj začal v létě 2018. 28 přispěvatelů. Vývoj byl umožněn díky Private Packagist. Úkoly pro Composer 2:

  • Lepší výkon
  • Lepší reprodukovatelnost při odhalování bugů
  • Lepší hlášení chyb
  • Jednodušší přidávání novinek do Composeru
  • Maximálně bezbolestné upgradování

Podstatnou část přednášky zabralo povídání, proč vlastně byla jedničková řada Composeru tak pomalá a paměťově nenajezená. JSON pro každý z balíčků, spousta závislostí a konfliktů. Čím více balíčků, tím exponenciálně více to rostlo.

Dvojka stahuje metadata rekurzivně jen pro ty verze, které opravdu mohou být instalovány. Redukuje počet balíčků v paměti. Generuje řešení závislostí v paměti. Metadata se stahují paralelně  s curl multi a http/2.

Změn se dočkal také protokol pro komunikaci se serverem Packagist. Snížil se datový objem, vylepšilo se cacheování. Composer 2 rozbaluje všechny balíčky paralelně. Potřebuje Linux, macOS nebo Windows Subsystem for Linux a v $path musí být cesta k unzipu. Dříve se to řešilo ZipArchive v PHP, které je ale pomalejší.

Je oddělený update a install. Nové přepínače --ignore-platform-reqs pro potlačení všech závislostí platformy, nebo --ignore-platform-req=php pouze pro potlačení kontroly verze PHP. Částečné updaty na konkrétní verzi: composer update symfony/http-foundation:5.0.*.

Repozitáře jsou nyní ve výchozím stavu kanonické. Composeru 2 není třeba se bát. Aktualizujte composer self-update --2. Pokud to nebude fungovat, není to problém. Lock file přeci máte v commitu, že ano? Stačí vrátit na předchozí verzi přes composer self-update --1.

Balíček symfony/flex je kompatibilní s Composerem 2 od verze 1.9.8.

Aktuální rozšíření Composeru 2: 35 % instalací v listopadu bylo s jeho pomocí. Podobně 20 % aktualizací. Počítáno z požadavků oproti packagist.org.

Plány: minimální PHP 7.1 v Composeru a zahození podpory PHP 5. Vypnout podporu Composeru 1 na Packagistu. Kdy se tak stane, záleží na jeho používání. Tvůrcům by pomohlo, když se tak stane co nejdříve. I zmíněný částečný přechod už uspořil desítky terabajtů na datových přenosech.

Stefan Richter - přihlašování bez hesla s WebAuthn

Na počátku bylo heslo a to je příčina 80 % bezpečnostních problémů. Tak by se dal shrnout úvod této přednášky. Hesla jsou málo silná, lidi je používají opakovaně, při nabourání jednoho webu se jim ukradne identita na dalších webovkách.

WebAuthn umožňuje registraci a přihlašování do webů bez hesla s využitím asymetrických klíčů jako u SSH nebo PGP. Je to W3C standard s FIDO aliancí. Od května 2019. Podporován je ve většině prohlížečů s výjimkou IE. Auth tokeny jsou dobře dostupné, podporovány jsou nejrůznější platformy. Znamenají také konec ukládání nekryptovaných hesel v databázi.

Je to javascriptové API. Stefan dále ukázal praktické použití s navigator.credentials.create() / .get() a balíčkem madwizard/webauthn-bundle. Více viz webauthn.guide.

Bruno Henrique De Souza – moderní a rychlý http klient

Bruno povídal o symfony/http-client a všech možných vychytávkách při jeho používání. Zmínil několik novinek v Symfony 5.2. Jako praktickou ukázku použil tahání dat o počasí.

Po pravdě, tak mě to vtáhlo, že jsem si zapomněl dělat poznámky.

Grégoire Hébert - šifrování v Symfony 4.4

Pod názvem přednášky se ukrývalo téma pokrývající vše okolo knihovny libsodium. Šifrování, hashování, krypto, x25519. Měl jsem toho plnou hlavu. Přednáška nebyla špatná, ale měl jsem toho už plné brýle. Úplně přesně ale mohu zopakovat, že SHA1 už není bezpečné. Dávno ne.

Nikita Popov - novinky v PHP 8

Vyvrcholením dvoudenní online konference bylo povídání vývojáře PHP 8 a PhpStormu o novinkách v PHP 8. Nový JIT compiler do x86 machine code. Stačí zapnout opcache a nastavit opcache.jit_buffer_sizephp.ini.

Nikita ukazoval graf, o kolik zrychlí PHP různé projekty a jak si vede v benchmarcích. Pak přišla jedna omluva – Symfony Demo doznalo s PHP 8 zrychlení o pouhé procento. Jak Nikita říká, ono strašně záleží na tom, co váš konkrétní projekt vlastně provádí.

Následující povídání bylo o jednotlivých novinkách: atributy, constructor promotion, jmenné argumenty, union typy, mixed typy, static return types, match expression, nullsafe operátory (bezva), catch bez proměnné, porovnávání čísle s řetězci (bezva), resource to object migrace a jiné.

U nás to pěkně shrnuje David Grudl ve svém povídání o novinkách v PHP 8. Hodí se odkaz, když je David autorem konkurenčního PHP frameworku? Inu, proč ne.

A to je všechno. Účastníci SymfonyWorld Online 2020 mají možnost si přednášky pustit ze záznamu, což určitě využiju. Vzhledem ke třem pásmům jsem nemohl zvládnout vše, co mě zajímalo. Těším se třeba na povídání Ramony Schwering o testování s nástrojem Cypress.

Na závěr se jen chci omluvit čtenářům za mix češtiny a angličtiny. Nemám to moc rád, ale u řady vývojářských termínů mě prostě nenapadají správné české překlady. A takto tomu budete i lépe rozumět.

Buďme ve spojení, přihlaste se k newsletteru

Odesláním formuláře souhlasíte s podmínkami zpracováním osobních údajů. 
Více informací v Ochrana osobních údajů.

Autor článku: Jan Polzer

Tvůrce webů z Brna se specializací na Drupal, WordPress a Symfony. Acquia Certified Developer & Site Builder. Autor několika knih o Drupalu.
Marketing Director v Lesensky.cz. Ve volných chvílích podnikám výlety na souši i po vodě. Více se dozvíte na polzer.cz a mém LinkedIn profilu.

Komentáře k článku

Přidat komentář

Odesláním komentáře souhlasíte s podmínkami Ochrany osobních údajů

reklama
Moje kniha o CMS Drupal

 

Kniha 333 tipů a triků pro Drupal 9


Více na KnihyPolzer.cz

Sledujte Maxiorla na Facebooku

Maxiorel na Facebooku

Poslední komentáře
Nové diskuze
Hosting pro Drupal a WordPress

Hledáte český webhosting vhodný nejenom pro redakční systém Drupal? Tak vyzkoušejte Webhosting C4 za 1200 Kč na rok s doménou v ceně, 20 GB prostoru a automatické navyšováním o 2 GB každý rok. Podrobnosti zde.

@maxiorel na Twitteru

Maxiorel na Twitteru