Na začátku roku 2012 jsem skončil s programováním. V té době jsem dělal v Javě. Od té doby jsem na programování ani nesáhl a všechny mé webové projekty jsem stavěl na nějakých redakčních systémech (WordPress, Drupal, Prestashop). Jenže ohýbat redakční systém k nějakým specifičtějším účelům je celkem nešikovné a výsledek nebyl nikdy úplně podle mých představ. Díky Covidu jsem se koncem minulého roku konečně rozhodl znovu vrátit k programování, protože jako portrétní fotograf bych brzo v období pandemie zkrachoval.
K Javě se mi moc vracet nechtělo, na menší projekty mi přijde těžkopádná. Koukal jsem na možné alternativy a do oka mi padl Python. Líbí se mi množství dostupných knihoven a nástrojů, včetně množství možností v oblasti machine learningu. K vývoji webu mi přišel nejlepší framework Django. A tak jsem se koncem listopadu 2020 pustil do vytvoření prvního webu, abych se na něm naučil základy.
Photo News Feed
Vymyslel jsem si jednoduchý web Photo News Feed, kde budu vkládat odkazy na články a videa, které se týkají foťáků a objektivů. Někdy před 5 lety jsem podobný web udělal ve WordPressu. Ale pro vložení nového odkazu jsem musel ručně vytvořit nový příspěvek, zkopírovat odkaz, nadpis, nahrát ilustrační fotku, přiřadit příspěvku klíčové slova podle toho čeho se to týkalo a taky tu ilustrační fotku…a vložení takového příspěvku zabralo dost času. Nicméně web i s minimem práce vydělal v té době z reklam více, než mé hlavní Fototipy.
Cílem nového webu v Pythonu bylo co nejvíce věcí automatizovat, aby bylo vkládání odkazů na nové články a videa co nejjednodušší a nejrychlejší. Web jako takový je strašně jednoduchý – zobrazuje katalog fototechniky a k nim odkazy na články k nim. Vyhrál jsem si ale s tou částí vkládání nových odkazů.
Takhle vypadá formulář pro vkládání nových odkazů. Jediný vstup z mé strany je jen url. Pomocí BeautifulSoup4 stáhnu stránku ze zadané url a předvyplním nadpis, typ odkazu, foťáky/objektivy o kterých článek je a taky ilustrační obrázek. U velké části odkazů (hlavně z Youtube) nemusím už nic dalšího řešit, zkontroluju jestli je vše správně a potvrdím to. Je to záležitost tak na 5 sekund.
U odkazů na některé weby pořád trochu zlobí vyplňování údajů. Nadpis si zjišťuju pomocí og:description meta tagu. Pokud ho web nemá vyplněný, hledám první h2 nadpis a pokud ani ten není, hledám h1 nadpis. Bohužel některé weby s recenzema nemají strukturu webu správně nastavenou a u těch mi pak automatické načítání nefunguje a musím vše vyplnit ručně.
Taky ještě řeším rozpoznávání foťáků a objektivů. Vycházím z textu v nadpise, protože ten považuju jako hlavní ukazatel toho o čem článek/video je. Jenže foťáky a objektivy lidi nazývají různě (např stejný foťák je označován jako 5D mark IV, 5D mark 4, 5D mkIV, 5Dmk4…). U objektivů je to ještě horší.
Co se týká fotky, web nabídne jako první fotku uvedenou v og:image. Pokud není uvedeno, nabídne prvních několik obrázků vyskytující se na dané url. Někde to funguje dobře, na několika webech jsou ale na prních místech jen obrázky netýkající se článku. Pro tyto případy mám ve formuláři i pole pro url náhledového obrázku.
Trochu mě potrápilo množství objektivů v katalogu. Když jsem web vytvářel, měl jsem na testovacím prostředí v katalogu pár položek a formulář byl přehledný. Jenže po vložení asi 400 foťáků a objektivů začal být formulář nepoužitelný. Roztřídil jsem tedy jednotlivé checkboxy do záložek a oddělil jsem objektivy ve dvou skupinách (DSLR a mirrorless).
Takhle to vypadá po rozkliknutí objektivů pro bezzrcadlovky. Není to ideální, ale dá se v tom rychle hledat a zatrhnout potřebné pole. Do budoucna bych to chtěl ještě předělat tak, aby tam bylo vyhledávací pole do kterého budu zadávat řetězec a podle toho se mi budou dynamicky filtrovat položky obsahující daný řetězec.
Po uložení odkazu se automaticky stáhne zvolený obrázek, vygenerují se náhledy. Pomocí Facebook Graph API si k danému odkazu zjistím “engadgement” (počet lajků, sdílení a komentářů) a uložím si číslo k určení popularity daného článku/videa. Pokud odkaz ukládá admin, rovnou se publikuje.
Odkazy zatím může přidávat jen admin. Pro nepřihlášené uživatele je dole v patičce webu formulář, kde může uživatel poslat url na zajímavý článek/video. Mě se to pak v administraci webu zobrazí jako “suggested link” kde vidím url a vedle něj odkaz na formulář pro vložení tohoto navrženého odkazu na web. Po kliknutí mě to přesměruje na výše uvedený formulář kde je v ideálním případě vše předvyplněné a já to potvrdím. Tím se odkaz uloží na web a “suggested link” zaslaný anonymním návštěvníkem se označí jako schválený.
Co jsem zatím vůbec neřešil jsou data publikace článku/videa. Aktuálně na webu řadím příspěvky podle data vložení odkazu. Protože kdybych ručně měl u každé položky vyplňovat datum, bylo by to na dlouho. Ale pokud se projekt rozjede a bude vydělávat, tak chci přidat automatizované zjišťování data příspěvků i pro odkazy zaslané dříve. Aby se mi na webu řadily dle data publikace a ne data vložení odkazu.
Dojmy z Pythonu a Djanga
Byl jsem mimo obor hodně dlouho a trochu se to projevilo na schopnosti se po takové pauze znovu učit. Python je sám o sobě hezký a celkem jednoduchý jazyk, jen pořád ještě trochu zápasím s dynamickým typováním. U jazyků se statickým typováním vím co v dané části kodu čekat a jak s tím pracovat. U Pythonu bývám ještě pořád občas zmatený. A taky mi v začátku trochu zamotalo hlavu, že všechno v Pythonu je objekt. Ale jinak se mi v Pythonu pracuje příjemně.
Hodně mile mě překvapil Django framework. Chvíli mi trvalo než jsem pochopil základy. Ale pokud už člověk ví co a jak, tak se v něm dá velmi snadno a rychle vyvíjet hotové weby. Hlavně to objektově relační mapování je perfektní (alespoň u tak jednoduchého projektu). V podstatě jsem na SQL nesáhl, pracuju s daty aplikace už pomocí objektů v rámci Pythonu. A to jsem v průběhu vývoje změnil databázi z SQLite na PostgreSQL, aniž bych musel měnit kód aplikace.
Zatím při vývoji musím hodně často googlit, ale překvapuje mě, že spousta problémů se v Djangu dá vyřešit mnohem jednodušeji, než jsem původně myslel.
Jako nevýhodu ale vidím možnosti nasazení takového projektu na produkční prostředí. Třeba při vývoji webů v PHP je to jednoduché, stačí si objednat hosting za pár korun, nahrát soubory na ftp a je hotovo. U Pythonu je to mnohem složitější. Třeba co se týká přímo hostingu Python aplikací, v česku jsem našel tuším jen Roští.cz. Nabídka je i celosvětově mnohem menší a člověk k nasazení musí znát více, než jen připojení k ftp a konfiguraci .htaccess souboru.
Nakonec jsem se rozhodl, že si objednám virtuální server a zprovozním si web tam. Díky tomu si pak nebudu muset při spouštění dalšího webu objednávat další hosting a budu mít možnost kde provozovat i malé/experimentální projekty. Zvolil jsem virtuální server od WEDOSU. Můžu si tam dynamicky konfigurovat parametry serveru, zatím jsem zvolil prakticky tu nejméně výkonnou variantu. I tak mě ale překvapilo, jak rychle tam web běží. Jasně, není to nic složitého, ale i tak je to násobně rychlejší, než weby co jsem doteď provozoval na WordPressu. Dokonce to bylo tak rychlé, že po zprovoznění webu v produkčním prostředí jsem musel kontrolovat, jestli omylem neprohlížím web na localhostu 🙂
První zkušenost s Dockerem
Pro nasazení aplikace na server jsem se rozhodl využít Dockeru, abych mohl jednoduše v případě potřeby aplikaci přenést na jiný server. Musím přiznat, že konfigurace serveru, Dockeru a zprovoznění reverzní proxy mi dalo zabrat více, než vývoj samotného webu.
Nakonec se mi to podařilo nastavit podle představ – web a databáze běží v samostatných docker kontejnerech. V dalším kontejneru běží nginx jako reverzní proxy a v dalším kontejneru pak aplikace která se stará o stahování certifikátů z Let’s Encrypt.
Zprovoznění tohoto řešení dalo sice dost práce, ale když teď budu chtít na tom serveru rozjet další projekt, bude to už jednoduché. A třeba ten první web jsem si nastavil tak, že jeho aktualizace je stejná jako jsem zvyklý u klasických php webů. Stačí nahrát zdrojáky pomocí ftp a je to. Pro takový malý projekt je to ideální a rychlé řešení.
Co dál?
Photo News Feed byl jednoduchý projekt. Uvidím jestli tam začnou chodit lidi a bude mi to vydělávat z reklam. Pokud jo, budu se mu dále věnovat a rozvíjet ho. Nicméně pro mé další projekty které mám v plánu se toho budu muset ještě hodně naučit. Konkrétně mám v plánu:
- Django REST framework, Vue.js a Javascript – abych měl aplikace více dynamické a uživatelsky přívětivější.
- Práce s mapama, geolokací
- Machine learning – lepší práce s obsahem, automatizace
- Automatické testy a robustnější deployment proces
Nakonec jsem tedy zjistil že s programováním je to jako s jízdou na kole, nezapomíná se to. Teď jen najít zaměstnání, kde bych mohl makat na zajímavých projektech a ještě rychleji posunout dál na pokročilejší úroveň.
10 Comments
Davide, tvé fotky mám rád, co se týká programování, nechci ti brát iluze, ale trošku si zamrzl. Django je mrtvé, dneska se jede Javascript, Python si rozchodíš za pár korun jako Lambda funkci v AWS, a zrovna na tvoje použití jsou relační databáze blbost a víc smyslu by dávalo třeba DynamoDB.
Věř mi, že cesta z toho “něco nějak v Pythonu sesmolím” na úroveň “vím co fakt dělám” je dlouhá. Rozhodně tě nechci odrazovat, jen spíše chci říci, že to musíš dělat několik let a věnovat se tomu.
Jinak myslím, co se týká objektů, tak zejména Ruby je plně objektové, je možné třeba 5.times {} stejně tak v JS je možné array.forEach(x => console.log(x)), tohle třeba Python neumí.
Jinak osobně si nemyslím, že Covid je důvod proč bys nemohl dělat portréty. Lidi sedí na Tinderu a úspěch na Tinderu závisí značně na fotkách, a není nic snadnějšího než vydělávat na bandě nadržených týpků.
Díky za komentář Martine. K těm tvým poznámkám (čísluju pro lepší přehlednost):
1) podle čeho soudíš že je Django mrtvé? Komunita kolem něj mi přijde aktivní, chystá se nová verze a přijde mi že je dost rozšířené. Narážím na něj právě často při hledání práce. Javascript se chci taky naučit, ale na backend mi přijde Python a Django vhodnější.
2) “jen spíše chci říci, že to musíš dělat několik let a věnovat se tomu.” – to ale platí u všeho, ne? Rozhodně nečekám že po pár týdnech se ze mě stane expert. Na druhou stranu už mám vyzkoušeno, jak rychle se dokážu učit nové věci.
3) “Jinak osobně si nemyslím, že Covid je důvod proč bys nemohl dělat portréty.” – no ono se celkem blbě vydělává, když ti stát zakáže fotit a ani ti nedá žádné kompenzace. Prakticky teď legálně můžu fotit jen firemní klienty. Ale většina firem jede teď v remote režimu a co jsem zjišťoval u těch firem, kde fotím pravidelně, tak mají teď aktivity jako třeba focení zakázané. Takže se tím fakt živit nedá, přišel jsem o 90% zakázek.
1) Ohledně Djanga, věřím že komunita je velmi aktivní, sám jsem odešel z práce linuxového admina, právě proto, že to dělá každý. Nejvíc pracovních nabídek je asi na securiťáka, nebo prodavačku, přesto si nemyslím, že to jsou slibné profese.
Obecně, po letech zkušenosti v IT ti můžu říci, že pokud si chceš sáhnout na dobré pracovní podmínky, dělej vzrůstající obor, kde nabídka pozic vzrůstá, ale nestačí k tomu nabídka kandidátů, a to jsou zpravidla novější technologie. Tím nemyslím jako rok nové, tím myslím, že ta technologie je stará 5-10 let a ne 20 nebo 30 let.
U libovolné zanikající technologie (a dnes už nebude moc lidí co začíná nové projekty v Django) je většinou velká nabídka lidí co to umí, ale klesá po nich poptávka, takže se možnosti toho co si můžeš u zaměstnavatele nadiktovat snižují.
A jak říkám, to je moje osobní zkušenost s Linuxem. Ne, že by Linux byl zanikající technologie, ale dnes ho umí kde kdo, proto dělám AWS, kde ta konkurence je značně nižší.
2) hele jasně, když vydržíš podle mě šanci máš. Navíc obecně podmínky v IT se dost zlepšili, kort pro vývojáře, dneska všichni nabízejí 3 dni home office, ne-li full remote. Takže pokud ti IT vadilo před lety sedět v open space, tak dnes je to víc na pohodu.
3) promiň, vůbec nesleduji zprávy, netušil jsem, že i focení je zakázáno, začínám se v těch nařízeních a povinnostech ztrácet…
přeju ti hodně zdaru!
Dobrá práce! Nenech se odradit, na technologiích zas tak moc nezáleží, pokud je dobře využiješ. Trošku by to chtělo vylepšit design a přidat faviconu.
Kdybys chtěl, můžu poradit ohledně JS/Vue.js, stačí napsat 🙂
Ahoj Ondro, jasně, ten design je takový hodně základní. Každopádně se mi konečně podařilo najít práci jako Django vývojář, takže teď se budu učit s Djangem na nějakém větším projektu 🙂 A díky za nabídku 😉
Davide, byl jsi dobrý portrétní fotograf. Je podle mě škoda to úplně pověsit na hřebík. Na tvém místě bych kromě programování se věnoval focení aspoň okrajově, ideálně o víkendech, aby jsi s focením měl stále kontakt a mohl se k tomu v budoucnu vrátit. Co třeba svatby, ty se fotí jen o sobotách a pěkně se s nimi dá vydělat?
Díky Petře, ale focení jsem na hřebík nepověsil. Sice teď můj hlavní příjem přichází z programování, do toho ale pár zakázek za měsíc stíhám 🙂 A svatby bych nefotil za nic 😀
Kde jsou ty časy, kdy zde byl co týden, to článek….
Jo no, ale pořád lepší psát málo, než pokračovat v psaní často za každou cenu i přesto, že by se tam nic nového neobjevilo. Můj život je teď o poznání méně zajímavý, než v době kdy jsem čerstvě vlítl po hlavě do práce na volné noze 😀
Je to škoda. Bylo zajímavé a inspirativní to číst. 🙁