Maciej Aniserowicz's Blog, page 29

November 23, 2018

November 20, 2018

November 19, 2018

Morskie opowieści, czyli GET.NET Gdańsk 2018

„Kto chce, ten niechaj słucha. Kto nie chce, niech nie słucha. Jak balsam są dla ucha morskie opowieści”. Hej! Po tym wesołym wstępie mam nadzieję, że domyślacie się, gdzie mnie poniosło w pogoni za kolejną konferencją, którą mogłabym później z przyjemnością Wam opisać.


Jeżeli nie, to zdradzę, że tym razem opuściłam granice mojego pięknego Podlasia i wyruszyłam na podbój niezbadanego przeze mnie Trójmiasta, a dokładnie Gdańska, bo to właśnie tam 27 października miałam przyjemność spędzić swój czas na wyjątkowym wydarzeniu, jakim była V edycja Get.Net organizowana przez firmę SII. Ahhh, co to były za emocje!!!


Rozkład jazdy na wydarzeniu był nasycony dużą liczbą prelegentów, których było aż 11 – zarówno z Polski, jak i z zagramanicy – dzielących się swoją wiedzą z ogromną rzeszą uczestników równolegle na dwóch ścieżkach. Cały event odbywał się w centrum wystawienniczo-kongresowym Amber Expo. Powiem Wam, że widok na stadion Energa Gdańsk z tego budynku robi wrażenie.



Po standardowej rejestracji i odebraniu swojej przepustki miałam jeszcze chwilę przed oficjalnym rozpoczęciem konferencji, aby podpatrzeć, jakież to atrakcje przygotowali dla nas organizatorzy. Gdy moim oczom ukazały się flipery, już wiedziałam, że ten dzień przejdzie do historii jako dzień, w którym Nela po raz pierwszy spróbowała swoich sił na tej maszynie. Nie byłam jedyną chętną – ten pomysł to był strzał w dziesiątkę, choć dla użytkowników dostępnych było więcej atrakcji. Do wyboru mieliśmy piłkarzyki oraz stare, dobre PlayStation. Brawa dla organizatorów. Bo przecież nie samymi prelekcjami programista żyje, a takie gry sprzyjają poznawaniu nowych znajomych.


No, ale dość już zabawy. Nadszedł czas na oficjalne rozpoczęcie konferencji. Udałam się więc do wyznaczonej auli, gdzie na scenie pojawiła się już przedstawicielka firmy SII, by powitać przybyłych, przedstawić sponsorów, a następnie zaprosić na scenę pierwszą tego dnia prelegentkę. To był znak, że zaczynamy podróż w nieznane.


Accessible Design and programming in action

Panie i Panowie, mam zaszczyt przedstawić Wam jedyną i niepowtarzalną Rachel Appel, która przyjechała do nas aż z USA. Na co dzień pracuje ona na stanowisku Developer Advocacy w firmie JetBrains, ale jej doświadczenie jest tak bogate, że można byłoby napisać o niej cały oddzielny artykuł. Jednak dzisiaj skupię się tylko na jej prezentacji.


Rachel w genialny sposób zwróciła uwagę na temat – można by powiedzieć – przez wielu developerów zaniedbywany, jakim jest dostępność stron internetowych dla osób niepełnosprawnych. Niby oczywista sprawa, a tak naprawdę ilu z nas w natłoku deadline’ów i asapów zapomniało albo zwyczajnie odpuściło dostosowanie widoku strony czy uproszczenie procesu rejestracji po to, aby wydać produkt w terminie? Niech pierwszy rzuci kamieniem ten, kto nigdy nie zrobił czegoś w projekcie na odwal. Rachel pokazała nam, na co powinniśmy zwrócić uwagę podczas projektowania stron, np. nie używać wyrazistych kolorów, ponieważ są one drażniące, albo dodawać napisy na naszych przyciskach, aby osoby, które mają problem z odróżnieniem barw, mogły bez problemu poruszać się po naszej witrynie.


Najciekawszym spośród wszystkich przykładów była symulacja korzystania ze stron internetowych przez osoby niedowidzące. Byłam w szoku na wieść, że korzystają one z nakładek na przeglądarki, które poruszają się od prawej do lewej i na głos czytają każdy tekst znajdujący się na stronie. Wielkie brawa dla pomysłodawców.


Rachel tak wciągnęła mnie do swojego świata, że ani się obejrzałam, a już minęła godzina i trzeba było uciekać na kolejną prezentację. Mimo wszystko udało mi się zamienić z nią kilka słów i oczywiście zrobić pamiątkowe zdjęcie.


Po krótkiej rozmowie nadszedł czas na odwiedziny starego przyjaciela i wysłuchanie nowej prezentacji.


To log everything

Pamiętacie może moją relację z 85. spotkania Białostockiej Grupy .NET, podczas której odwiedził nas Szymon Kulec? Jeśli nie, to odsyłam Was do tamtej relacji, a jeżeli wiecie, co to za jegomość, to przechodzimy do tematu.


Jeśli w jakiejkolwiek agendzie zobaczycie nazwisko Szymona, możecie iść w ciemno na tę konferencję. Ten człowiek ma taki dar mówienia, że gdyby przyszło mu sprzedawać garnki w telezakupach Mango, długo bym się nie zastanawiała. Ostatnio opowiadał nam o swoich przygodach z pulami pamięci w .Net Core, a tym razem chciał nam pokazać, jak robić dobrze logi.


Momencik, co? Ale że logi? A na co to komu? A po co to? Czy ten temat może być tak ciekawy, aby robić o nim całą, godzinną prezentację? Przecież logi są tylko po to, żeby klient wiedział, że coś tam jest monitorowane, że JSONY latają wte i wewte i wszystko jest cacy. Otóż nic bardziej mylnego!


Szymon jak zawsze trafił w punkt, jakim jest optymalne podejście do tworzenia i wysyłania logów, aby odbywało się to jak najszybciej, jak najtaniej oraz bez ogromnego nakładu pracy. Jego pomysł na prezentację wziął się z chęci zwrócenia uwagi na to, jak dużo płacimy za usługi logowania, wykonując tysiące niepotrzebnych zapisów do bazy. Stworzył on prototyp usługi, która mogłaby, z grubsza ujmując, zrewolucjonizować ten element, dzięki czemu za tę samą liczbę logów płacilibyśmy grosze.


Moje januszowe geny od razu się aktywowały, więc mam nadzieję, że Szymonowi uda się dokończyć projekt w obiecane pięć lat.



I myk! Znowu godzina minęła, więc nadszedł czas na krótką wymianę zdań, pamiątkowe selfie i – wreszcie – długo wyczekiwaną przerwę obiadową.


New decalogue of the best practices in the life of software development teams

Nowy dekalog? Czy coś mnie właśnie ominęło? Czy tam na górze coś się zmieniło? A nieeee… To tylko Grzegorz Rycaj pojawił się z kolejnymi TOP 10 najlepszymi praktykami dla zespołów software’owych. Rok temu na tej samej konferencji pojawiła się pierwsza dziesiątka zaproponowana przez naszego prelegenta, który zebrał swoje doświadczenie i opakował w zgrabny zbiór zasad. Już wtedy zestawienie zrobiło ogromne wrażenie na uczestnikach. W tym roku jego autor przyjechał ponownie, aby zaprezentować następną część, bo – jak sam mówi – to nie jest poprawka. Ta kontynuacja to tak naprawdę kolejna porcja doświadczenia wzbogacona o feedback, który napływał do niego na przestrzeni poprzedniego roku.


Głównym zamierzeniem Grzegorza było pokazanie, czego powinniśmy unikać i co powinniśmy robić, aby nasz zespół developerski działał jak idealnie naoliwiona maszyna. Zwrócił on uwagę na to, że nawet jako superprogramiści, którzy korzystają z najnowszych technologii, nie umiemy używać jednego z podstawowych narzędzi komunikacji – mowy. Sami na pewno wiecie i nieraz byliście świadkami sytuacji, w której trzeba było wytłumaczyć komuś nieporuszającemu się biegle w świecie IT, czym jest chmura albo o co chodzi z tymi stringami. No czasami to nie wychodzi pomimo wszelkich starań.


Tak samo jeżeli chodzi o feedback. Fajnie jest, jeżeli dostaniemy pochwałę – nawet w postaci miłego „dobra robota” – za zadanie, na które mogliśmy poświęcić godzinę, a spędziliśmy nad nim cały dzień, zamiast nagany za to, że tak wolno idzie nam praca.


Grzegorz w bardzo ciekawy, czasami wręcz karykaturalny sposób przedstawił świat IT, który dla wielu z nas nadal pozostaje czarną magią. Ciekawe, czy za rok będziemy mogli zobaczyć się z nim na GET.NET z kolejną dyszką porad, jak polepszyć naszą pracę w zespole, aby nawzajem się nie krzywdzić i wytwarzać jeszcze lepsze oprogramowanie. Zostawcie swoje propozycje w komentarzach pod postem, a kto wie – może na kolejnej edycji zobaczycie je na slajdach Grzegorza…?



No i znowu czas przeleciał mi przez palce. Ale zawsze uda się znaleźć chwilę na pamiątkę z miłego spotkania.


K8S and dotNET – how to (not) make your life easier

A co to za ananas? Piotr Stapp – to taki nowy skrót od człowieka-maszyny, który żadnej pracy się nie boi. Nasz gość jest wyznawcą DevOps oraz słynie z zamiłowania do automatyzacji. No bo w sumie dobry programista to leniwy programista, gdyż zawsze znajdzie sposób, jak coś zrobić, żeby się nie narobić. Piotr chciał nam opowiedzieć o trudnym związku pomiędzy Kubernetesem i .NET-em. Jego prezentacja miała na celu pokazanie nam, że nie taki straszny ten wilk, jak go malują.


Piotr zaprezentował nam pełen tutorial, jak skonfigurować środowisko, aby wszystko pięknie razem działało. Patrząc na magię na rzutniku, mogłam śmiało powiedzieć, że mój poziom wtajemniczenia wymaga jeszcze szkolenia. Gdyby nie nasz prelegent, pewnie wyszłabym z tego wykładu z miną mówiącą tylko jedno: „mózg rozwalony”.


Na koniec prezentacji Piotr zaprosił wszystkich chętnych na swoje kilkudniowe szkolenie właśnie z Kubernetesa. Z naszej późniejszej rozmowy dowiedziałam się, że każdy, kto ma chęć od zera dowiedzieć się, jak dobrze zarządzać kontenerami oraz skalować je tak, aby nie narobić bałaganu, powinien zainteresować się tym tematem. Na dodatek jestem przekonana, że nasz prelegent wyjaśni to bardzo dobrze.


I tak oto dotarliśmy do końca mojej przygody na V edycji GET.NET, ale, ale…


„I am the passenger…”

Jejciu! Cóż to była za przygoda! Nawet po takim czasie na samą myśl o konferencji oraz poznanych na niej osobach mam ogromny uśmiech na twarzy. Cieszę się, że mogłam spotkać wielu czytelników tego bloga, którzy bardzo ciepło mnie przywitali. Mam nadzieję, że niedługo będziemy mieli okazję spotkać się znowu.


Jeżeli byliście na konferencji, to pewnie zauważyliście, że moja relacja opisuje tylko wybrane prezentacje. Wynika to z faktu, iż nie byłabym w stanie być na dwóch wystąpieniach jednocześnie, ale również z tego, że wybrałam te, które moim zdaniem mogły być najciekawsze, i to właśnie je pokrótce chciałam Wam przedstawić.


Zachęcam Was również, drodzy czytelnicy, do zostawiania w komentarzu Waszej TOP 3 prezentacji z konferencji. Jestem ciekawa Waszych opinii na temat wydarzenia.


Powoli ruszam w świat – jeżeli znacie jakieś ciekawe konferencje, na których moglibyśmy się spotkać, to miejsce pod artykułem jest dla Was. Możecie zostawić namiary, a kto wie, może się tam pojawię.


Podsumowując: GET.NET to świetna okazja na poznanie wielu zajawkowiczów .NET, ale nie tylko. Jeżeli szukacie niesztampowego podejścia do tematu oraz świetnej zabawy wśród pasjonatów, to ta konferencja jest dla Was.


P.S. Za świetne zdjęcia ślę podziękowania z dalekiego Podlasia dla Pawła Łusiaka. :) Na fanpage’u wydarzenia możecie znaleźć ich więcej.


The post Morskie opowieści, czyli GET.NET Gdańsk 2018 appeared first on devstyle.pl.

 •  0 comments  •  flag
Share on Twitter
Published on November 19, 2018 03:22

Morskie opowieści, czyli GET.NET Gdańsk

„Kto chce, ten niechaj słucha. Kto nie chce, niech nie słucha. Jak balsam są dla ucha morskie opowieści”. Hej! Po tym wesołym wstępie mam nadzieję, że domyślacie się, gdzie mnie poniosło w pogoni za kolejną konferencją, którą mogłabym później z przyjemnością Wam opisać.


Jeżeli nie, to zdradzę, że tym razem opuściłam granice mojego pięknego Podlasia i wyruszyłam na podbój niezbadanego przeze mnie Trójmiasta, a dokładnie Gdańska, bo to właśnie tam 27 października miałam przyjemność spędzić swój czas na wyjątkowym wydarzeniu, jakim była V edycja Get.Net organizowana przez firmę SII. Ahhh, co to były za emocje!!!


Rozkład jazdy na wydarzeniu był nasycony dużą liczbą prelegentów, których było aż 11 – zarówno z Polski, jak i z zagramanicy – dzielących się swoją wiedzą z ogromną rzeszą uczestników równolegle na dwóch ścieżkach. Cały event odbywał się w centrum wystawienniczo-kongresowym Amber Expo. Powiem Wam, że widok na stadion Energa Gdańsk z tego budynku robi wrażenie.



Po standardowej rejestracji i odebraniu swojej przepustki miałam jeszcze chwilę przed oficjalnym rozpoczęciem konferencji, aby podpatrzeć, jakież to atrakcje przygotowali dla nas organizatorzy. Gdy moim oczom ukazały się flipery, już wiedziałam, że ten dzień przejdzie do historii jako dzień, w którym Nela po raz pierwszy spróbowała swoich sił na tej maszynie. Nie byłam jedyną chętną – ten pomysł to był strzał w dziesiątkę, choć dla użytkowników dostępnych było więcej atrakcji. Do wyboru mieliśmy piłkarzyki oraz stare, dobre PlayStation. Brawa dla organizatorów. Bo przecież nie samymi prelekcjami programista żyje, a takie gry sprzyjają poznawaniu nowych znajomych.


No, ale dość już zabawy. Nadszedł czas na oficjalne rozpoczęcie konferencji. Udałam się więc do wyznaczonej auli, gdzie na scenie pojawiła się już przedstawicielka firmy SII, by powitać przybyłych, przedstawić sponsorów, a następnie zaprosić na scenę pierwszą tego dnia prelegentkę. To był znak, że zaczynamy podróż w nieznane.


Accessible Design and programming in action

Panie i Panowie, mam zaszczyt przedstawić Wam jedyną i niepowtarzalną Rachel Appel, która przyjechała do nas aż z USA. Na co dzień pracuje ona na stanowisku Developer Advocacy w firmie JetBrains, ale jej doświadczenie jest tak bogate, że można byłoby napisać o niej cały oddzielny artykuł. Jednak dzisiaj skupię się tylko na jej prezentacji.


Rachel w genialny sposób zwróciła uwagę na temat – można by powiedzieć – przez wielu developerów zaniedbywany, jakim jest dostępność stron internetowych dla osób niepełnosprawnych. Niby oczywista sprawa, a tak naprawdę ilu z nas w natłoku deadline’ów i asapów zapomniało albo zwyczajnie odpuściło dostosowanie widoku strony czy uproszczenie procesu rejestracji po to, aby wydać produkt w terminie? Niech pierwszy rzuci kamieniem ten, kto nigdy nie zrobił czegoś w projekcie na odwal. Rachel pokazała nam, na co powinniśmy zwrócić uwagę podczas projektowania stron, np. nie używać wyrazistych kolorów, ponieważ są one drażniące, albo dodawać napisy na naszych przyciskach, aby osoby, które mają problem z odróżnieniem barw, mogły bez problemu poruszać się po naszej witrynie.


Najciekawszym spośród wszystkich przykładów była symulacja korzystania ze stron internetowych przez osoby niedowidzące. Byłam w szoku na wieść, że korzystają one z nakładek na przeglądarki, które poruszają się od prawej do lewej i na głos czytają każdy tekst znajdujący się na stronie. Wielkie brawa dla pomysłodawców.


Rachel tak wciągnęła mnie do swojego świata, że ani się obejrzałam, a już minęła godzina i trzeba było uciekać na kolejną prezentację. Mimo wszystko udało mi się zamienić z nią kilka słów i oczywiście zrobić pamiątkowe zdjęcie.


Po krótkiej rozmowie nadszedł czas na odwiedziny starego przyjaciela i wysłuchanie nowej prezentacji.


To log everything

Pamiętacie może moją relację z 85. spotkania Białostockiej Grupy .NET, podczas której odwiedził nas Szymon Kulec? Jeśli nie, to odsyłam Was do tamtej relacji, a jeżeli wiecie, co to za jegomość, to przechodzimy do tematu.


Jeśli w jakiejkolwiek agendzie zobaczycie nazwisko Szymona, możecie iść w ciemno na tę konferencję. Ten człowiek ma taki dar mówienia, że gdyby przyszło mu sprzedawać garnki w telezakupach Mango, długo bym się nie zastanawiała. Ostatnio opowiadał nam o swoich przygodach z pulami pamięci w .Net Core, a tym razem chciał nam pokazać, jak robić dobrze logi.


Momencik, co? Ale że logi? A na co to komu? A po co to? Czy ten temat może być tak ciekawy, aby robić o nim całą, godzinną prezentację? Przecież logi są tylko po to, żeby klient wiedział, że coś tam jest monitorowane, że JSONY latają wte i wewte i wszystko jest cacy. Otóż nic bardziej mylnego!


Szymon jak zawsze trafił w punkt, jakim jest optymalne podejście do tworzenia i wysyłania logów, aby odbywało się to jak najszybciej, jak najtaniej oraz bez ogromnego nakładu pracy. Jego pomysł na prezentację wziął się z chęci zwrócenia uwagi na to, jak dużo płacimy za usługi logowania, wykonując tysiące niepotrzebnych zapisów do bazy. Stworzył on prototyp usługi, która mogłaby, z grubsza ujmując, zrewolucjonizować ten element, dzięki czemu za tę samą liczbę logów płacilibyśmy grosze.


Moje januszowe geny od razu się aktywowały, więc mam nadzieję, że Szymonowi uda się dokończyć projekt w obiecane pięć lat.



I myk! Znowu godzina minęła, więc nadszedł czas na krótką wymianę zdań, pamiątkowe selfie i – wreszcie – długo wyczekiwaną przerwę obiadową.


New decalogue of the best practices in the life of software development teams

Nowy dekalog? Czy coś mnie właśnie ominęło? Czy tam na górze coś się zmieniło? A nieeee… To tylko Grzegorz Rycaj pojawił się z kolejnymi TOP 10 najlepszymi praktykami dla zespołów software’owych. Rok temu na tej samej konferencji pojawiła się pierwsza dziesiątka zaproponowana przez naszego prelegenta, który zebrał swoje doświadczenie i opakował w zgrabny zbiór zasad. Już wtedy zestawienie zrobiło ogromne wrażenie na uczestnikach. W tym roku jego autor przyjechał ponownie, aby zaprezentować następną część, bo – jak sam mówi – to nie jest poprawka. Ta kontynuacja to tak naprawdę kolejna porcja doświadczenia wzbogacona o feedback, który napływał do niego na przestrzeni poprzedniego roku.


Głównym zamierzeniem Grzegorza było pokazanie, czego powinniśmy unikać i co powinniśmy robić, aby nasz zespół developerski działał jak idealnie naoliwiona maszyna. Zwrócił on uwagę na to, że nawet jako superprogramiści, którzy korzystają z najnowszych technologii, nie umiemy używać jednego z podstawowych narzędzi komunikacji – mowy. Sami na pewno wiecie i nieraz byliście świadkami sytuacji, w której trzeba było wytłumaczyć komuś nieporuszającemu się biegle w świecie IT, czym jest chmura albo o co chodzi z tymi stringami. No czasami to nie wychodzi pomimo wszelkich starań.


Tak samo jeżeli chodzi o feedback. Fajnie jest, jeżeli dostaniemy pochwałę – nawet w postaci miłego „dobra robota” – za zadanie, na które mogliśmy poświęcić godzinę, a spędziliśmy nad nim cały dzień, zamiast nagany za to, że tak wolno idzie nam praca.


Grzegorz w bardzo ciekawy, czasami wręcz karykaturalny sposób przedstawił świat IT, który dla wielu z nas nadal pozostaje czarną magią. Ciekawe, czy za rok będziemy mogli zobaczyć się z nim na GET.NET z kolejną dyszką porad, jak polepszyć naszą pracę w zespole, aby nawzajem się nie krzywdzić i wytwarzać jeszcze lepsze oprogramowanie. Zostawcie swoje propozycje w komentarzach pod postem, a kto wie – może na kolejnej edycji zobaczycie je na slajdach Grzegorza…?



No i znowu czas przeleciał mi przez palce. Ale zawsze uda się znaleźć chwilę na pamiątkę z miłego spotkania.


K8S and dotNET – how to (not) make your life easier

A co to za ananas? Piotr Stapp – to taki nowy skrót od człowieka-maszyny, który żadnej pracy się nie boi. Nasz gość jest wyznawcą DevOps oraz słynie z zamiłowania do automatyzacji. No bo w sumie dobry programista to leniwy programista, gdyż zawsze znajdzie sposób, jak coś zrobić, żeby się nie narobić. Piotr chciał nam opowiedzieć o trudnym związku pomiędzy Kubernetesem i .NET-em. Jego prezentacja miała na celu pokazanie nam, że nie taki straszny ten wilk, jak go malują.


Piotr zaprezentował nam pełen tutorial, jak skonfigurować środowisko, aby wszystko pięknie razem działało. Patrząc na magię na rzutniku, mogłam śmiało powiedzieć, że mój poziom wtajemniczenia wymaga jeszcze szkolenia. Gdyby nie nasz prelegent, pewnie wyszłabym z tego wykładu z miną mówiącą tylko jedno: „mózg rozwalony”.


Na koniec prezentacji Piotr zaprosił wszystkich chętnych na swoje kilkudniowe szkolenie właśnie z Kubernetesa. Z naszej późniejszej rozmowy dowiedziałam się, że każdy, kto ma chęć od zera dowiedzieć się, jak dobrze zarządzać kontenerami oraz skalować je tak, aby nie narobić bałaganu, powinien zainteresować się tym tematem. Na dodatek jestem przekonana, że nasz prelegent wyjaśni to bardzo dobrze.


I tak oto dotarliśmy do końca mojej przygody na V edycji GET.NET, ale, ale…


„I am the passenger…”

Jejciu! Cóż to była za przygoda! Nawet po takim czasie na samą myśl o konferencji oraz poznanych na niej osobach mam ogromny uśmiech na twarzy. Cieszę się, że mogłam spotkać wielu czytelników tego bloga, którzy bardzo ciepło mnie przywitali. Mam nadzieję, że niedługo będziemy mieli okazję spotkać się znowu.


Jeżeli byliście na konferencji, to pewnie zauważyliście, że moja relacja opisuje tylko wybrane prezentacje. Wynika to z faktu, iż nie byłabym w stanie być na dwóch wystąpieniach jednocześnie, ale również z tego, że wybrałam te, które moim zdaniem mogły być najciekawsze, i to właśnie je pokrótce chciałam Wam przedstawić.


Zachęcam Was również, drodzy czytelnicy, do zostawiania w komentarzu Waszej TOP 3 prezentacji z konferencji. Jestem ciekawa Waszych opinii na temat wydarzenia.


Powoli ruszam w świat – jeżeli znacie jakieś ciekawe konferencje, na których moglibyśmy się spotkać, to miejsce pod artykułem jest dla Was. Możecie zostawić namiary, a kto wie, może się tam pojawię.


Podsumowując: GET.NET to świetna okazja na poznanie wielu zajawkowiczów .NET, ale nie tylko. Jeżeli szukacie niesztampowego podejścia do tematu oraz świetnej zabawy wśród pasjonatów, to ta konferencja jest dla Was.


P.S. Za świetne zdjęcia ślę podziękowania z dalekiego Podlasia dla Pawła Łusiaka. :) Na fanpage’u wydarzenia możecie znaleźć ich więcej.


The post Morskie opowieści, czyli GET.NET Gdańsk appeared first on devstyle.pl.

 •  0 comments  •  flag
Share on Twitter
Published on November 19, 2018 03:22

November 17, 2018

November 15, 2018

November 14, 2018

Abstrakcja między bazą danych a aplikacją

Ostatnio napisałem kilka słów o swoim podejściu do różnego rodzaju ORM-ów. Jeśli więc w Twojej głowie pojawiła się myśl, że być może warto zainteresować się tymi nudnymi SQL-ami, to dziś opowiem Ci nieco więcej o warstwie, którą możesz zbudować między swoją aplikacją a tabelami w bazce.



W telegraficznym skrócie mogę Ci powiedzieć, że będzie o widokach, funkcjach i procedurach, a jeżeli używasz ORM-a, to także o korzyściach, jakie daje mapowanie ich na model obiektowy zamiast operowania bezpośrednio na tabelach. Wszystko dotyczy SQL Servera i Entity Frameworka, bo z nimi mam do czynienia najczęściej, ale całość wygląda bardzo podobnie w większości systemów baz relacyjnych i ORM-ów, jakie widziałem.


Widoki

Zacznijmy od początku, czyli od opisania wspomnianych konstrukcji. Na pierwszy ogień weźmy widoki. Definicja podana w dokumentacji jest bardzo prosta.


A view is a virtual table whose contents are defined by a query. Like a table, a view consists of a set of named columns and rows of data.


Możemy więc napisać mniej lub bardziej skomplikowane zapytanie i zapakować je w widok, by nie klepać kilku(nastu/dziesięciu/set) linii SQL-a za każdym razem, gdy będziemy się odwoływać do jakiegoś zbioru ładnie uporządkowanych danych. Widoki oczywiście możemy nazywać, daje nam to więc dosyć ciekawe możliwości porządkowania danych bez ich denormalizacji, bo zupełnie inaczej będziemy rozumieć klienta sklepu w kontekście rozliczeń, wysyłki produktu czy zebrania statystyk na potrzeby marketingowe.


Stwórz więc jakąkolwiek bazę i dodaj do niej kilka tabel. Pozwoliłem sobie uprościć ten model na potrzeby przykładu.



CREATE TABLE [dbo].[Customer]
(
[Id] int NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED,
[FirstName] nvarchar(100) NOT NULL,
[LastName] nvarchar(400) NOT NULL,
[Email] nvarchar(254) NOT NULL,
[Gender] tinyint NOT NULL,
[ShippingAddress] nvarchar(max) NULL,
[Phone] varchar(20) NULL
)

INSERT INTO [dbo].[Customer]
([FirstName], [LastName], [Email], [Gender], [ShippingAddress], [Phone])
VALUES
('Test',
'Testowy',
'Test@test.com',
1,
N'Testowa ulica w testowym mieście', '0048555555555'),
(N'Przykład',
N'Przykładowy',
'przyklad@przyklad.com',
1,
N'Przykładowa ulica w przykładowym mieście',
'0048666666666')

CREATE TABLE [dbo].[CreditCard]
(
[Id] int NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED,
[Number] varchar(19) NOT NULL,
[ValidityDate] date NOT NULL,
[OwnerId] int NOT NULL
CONSTRAINT [Fk_CreditCard_Owner]
FOREIGN KEY REFERENCES [dbo].[Customer] ([Id])
)

INSERT INTO [dbo].[CreditCard] ([Number], [ValidityDate], [OwnerId])
SELECT '1234-5678-9012-1234',
'2018-01-31',
[Id]
FROM [dbo].[Customer]

Mamy więc nieco informacji o kliencie i jego kartach płatniczych. Gdybyśmy przesyłali dane do wysyłki paczki, potrzebowalibyśmy imienia, nazwiska, telefonu, e-maila i adresu. Można powiedzieć, że jest to praktycznie cała tabela, więc walimy SELECT * lub odpowiednik w ORM-ie (czyli podejście zwane czasem fachowo „encja na twarz i pchasz” polegające na całkowitym ignorowaniu metody Select) i lecimy.


Należy jednak pamiętać, że z biegiem czasu nasza tabela może spuchnąć i ulec fundamentalnym zmianom (które pokażę Ci za chwilę), w związku z tym będziemy wyciągać coraz więcej i więcej kolumn, a nasze potrzeby dotyczące przekazania danych do wysyłki nie ulegną zmianie. Sugeruję zatem napisać kawałek Selecta (czy to SQL-owego, czy czegoś, co Twój ORM przetłumaczy na projekcję).



SELECT
[FirstName] + ' ' + [LastName] AS [FullName],
[Phone],
[ShippingAddress],
[Email]
FROM [dbo].[Customer]
WHERE [Id] = 1

Aby to uprościć, uporządkować i nazwać, by ktokolwiek wiedział, co podmiot liryczny ma na myśli, możemy wszystko zapakować w ładny i zgrabny widok, który z góry określa, że mamy do czynienia z danymi do wysyłki. Przy okazji nasz widok umieśćmy w nowo utworzonej schemie shipping – to dosyć duży skrót myślowy, ale o schemie można myśleć jak o namespace’ie.



CREATE SCHEMA [shipping]GO

CREATE VIEW [shipping].[CustomerShippingData]
AS
SELECT
[Id] AS [CustomerId],
[FirstName] + ' ' + [LastName] AS [FullName],
[Phone],
[ShippingAddress],
[Email]
FROM [dbo].[Customer]

A wywołanie go później to już poezja.



SELECT * FROM [shipping].[CustomerShippingData]
WHERE [CustomerId] = 1

Większość ORM-ów pozwala na mapowanie widoków i oprócz samej czytelności oraz niezmienności daje nam to jeszcze jedną korzyść – bardzo dużą kontrolę nad zapytaniem, które faktycznie jest wysyłane do bazy. W przypadku bardziej skomplikowanych przypadków może to mieć bardzo duże znaczenie dla wydajności, a w takiej chmurze – bezpośrednio na ilość zasobów, jakich potrzebujemy i za jakie zapłacimy.


Funkcje i procedury

Odrobinę innym przypadkiem są funkcje i procedury. Choć widoki służą na ogół jako stosunkowo proste „nakładki” na tabele, to w nich możemy zawrzeć już całkiem sporo logiki i całkiem dużą część pracy zrzucić na silnik bazodanowy, co pozwala nam na pisanie chociażby rekurencyjnego gromadzenia danych, pracę z tymczasowymi tabelami czy zmiennymi tabelarycznymi.


O tym wszystkim w szczegółach pewnie napiszę w przyszłości, bo zarówno same funkcje, jak i procedury składowane to tematy na oddzielne posty. W tej chwili musisz wiedzieć, że tutaj zaczyna się prawdziwe programowanie w SQL-u i można tu zawrzeć naprawdę bardzo rozbudowane rzeczy, a w odróżnieniu od widoków możemy tu przekazać własne parametry.


Podstawowa różnica między obydwoma jest taka, że funkcje służą do przetworzenia jakichś danych i zwrócenia wyniku – funkcja nie może mieć żadnych skutków ubocznych dla stanu bazy. Procedury mają z kolei wykonać jakieś operacje, często związane właśnie ze zmianą stanu, po czym zwrócić kod oznaczający status (int). Przyjęło się, że „0” oznacza poprawne wykonanie procedury. Możliwe jest zwrócenie wielu innych informacji, ale o tym innym razem.


Przejdźmy zatem do tego, co to oznacza dla Ciebie. Zanim dotrzemy do sedna przyczyny, dla której warto umieszczać takie informacje po stronie bazy danych, napiszmy prostą procedurę dodającą klienta do naszej bazy.



CREATE SCHEMA [customers]GO

CREATE PROCEDURE [customers].[AddCustomer] @firstName nvarchar(100),
@lastName nvarchar(400),
@email nvarchar(254),
@gender tinyint,
@shippingAddress nvarchar(max),
@phone varchar(20)
AS
BEGIN
INSERT INTO [dbo].[Customer] ([FirstName], [LastName], [Email], [Gender], [ShippingAddress], [Phone])
VALUES (@firstName, @lastName, @email, @gender, @shippingAddress, @phone)
END

I po raz kolejny – wywołanie takiej procedury wygląda o wiele czytelniej niż zwykły insert.



EXEC [customers].[AddCustomer] @firstName = N'Rafał',
@lastName = 'Hryniewski',
@email = 'rafal@hryniewski.net',
@gender = 1,
@shippingAddress = 'Adres',
@phone = '0048111111111'

Te przykłady są banalne, ale musisz pamiętać, że spora część operacji nie jest taka prosta i raczej nie składa się z jednego etapu. Nawet samo dodanie klienta może wymagać nieco więcej operacji niż zwykły insert. W funkcjach i procedurach możemy zrobić naprawdę sporo – ważne jest to, że pracuje wtedy baza danych, nie nasza aplikacja. A jakie z tego korzyści? Czytaj dalej.


Co z logiką biznesową?

Jeśli zdarzyło Ci się kiedyś nad tym zastanawiać, to w międzyczasie mógł Cię ogarnąć niepokój – przecież jesteśmy o krok od wrzucenia logiki biznesowej do bazy. Toć to herezja!


I tutaj się z Tobą całkowicie zgodzę. Wrzucenie zbyt wiele logiki do bazy będzie bardzo trudne w utrzymaniu. SQL-a można debugować, można go też testować, ale raczej nie powinniśmy tam wrzucać wszystkich reguł walidacji czy zmieniać stanu połowy aplikacji, bo wrzuciliśmy platynowego klienta albo inne dziwne mechanizmy.


Moim zdaniem na bazę można zrzucić całkiem sporo, ale jednak lepiej, żeby dotyczyło to pobierania danych niż ich zapisywania – zarządzanie stanem aplikacji mimo wszystko pozostawmy poza bazą. Proste operacje w stylu dodania klienta są jak najbardziej w porządku, ale jeśli wiążą się z tym operacje np. dodania punktów pracownikowi, który wspomnianego klienta pozyskał, to powinny one zostać obsłużone już w samej aplikacji.


Korzyści

Wróćmy jednak do naszej abstrakcji. Co nam daje załadowanie prostych operacji w funkcje i procedury, a wyników niektórych zapytań w widoki?


Jak już wspomniałem, często jest to kwestia kontroli nad tym, co się w bazie dzieje, co w wielu przypadkach może przyczynić się do znacznych wzrostów wydajności. Ale nie jest to jedyna zaleta takiego podejścia.


Produkty, nad którymi pracujemy, mogą być dosyć duże. Jeśli cały system korzysta z jednej bazy, to możemy dość szybko zorientować się, że np. z tabeli User korzysta w ten lub inny sposób pół aplikacji. Owszem, są architektury, które tego problemu nie mają. Owszem, doprowadzenie do tej sytuacji nie jest pożądane. Ale nie zawsze mamy do czynienia z greenfieldem i mnóstwem czasu na najlepsze praktyki.


Modyfikacje w locie

I tak docieramy do momentu, w którym ktoś informuje Cię, że klient prosi, byśmy zmienili kolejność wyświetlania imienia i nazwiska, gdy zwracamy dane do wysyłki.


Niby pierdoła, ale ktoś się zorientował, że w kraju naszego odbiorcy może to być uznawane za wielki nietakt. Potrzebne będzie wdrożenie. Oczywiście masz pecha i w Twoim projekcie CI/CD nie istnieje. Na dodatek w kraju klienta zbliżają się święta i trzeba to ogarnąć na wczoraj. Cóż, życie. To jak wyglądały Twoje plany na piątkowy wieczór?


Nic się nie martw. Przecież wszystko, co potrzebne do zmiany, masz zrobione po stronie bazy danych. Wystarczy, że zmodyfikujesz uprzednio utworzony widok.



ALTER VIEW [shipping].[CustomerShippingData]
AS
SELECT
[Id] AS [CustomerId],
[LastName] + ' ' + [FirstName] AS [FullName],
[Phone],
[ShippingAddress],
[Email]
FROM [dbo].[Customer]

Aplikacja nie przestanie działać nawet na chwilę, a cała operacja zajmie mniej niż sekundę. Problem rozwiązany, nie zmieniliśmy nic w kodzie samej aplikacji i ominął nas smutny deploy w piątkowy wieczór.


Schemabinding

Wszystko wygląda fajnie. Ale jak się w tym połapać i dopilnować, by aktualizować warstwy nad tabelami, gdy te ulegają zmianom?


Słowo klucz – schemabinding. Zmodyfikujmy nasz widok jeszcze raz, tym razem dodając opcję WITH SCHEMABINDING.



ALTER VIEW [shipping].[CustomerShippingData]
WITH SCHEMABINDING
AS
SELECT
[Id] AS [CustomerId],
[LastName] + ' ' + [FirstName] AS [FullName],
[Phone],
[ShippingAddress],
[Email]
FROM [dbo].[Customer]

Nasz widok jest teraz powiązany z tabelą, z której korzysta, i baza nie pozwoli nam na modyfikację obiektów, od których jesteśmy w jakiś sposób zależni.


I tak możemy dodać kolumnę, której nasz widok nie używa.



ALTER TABLE [dbo].[Customer]
ADD [Something] nvarchar(100)

Możemy też ją usunąć. Podobnie jak kolumnę Gender, z której nie korzystamy.



ALTER TABLE [dbo].[Customer]
DROP COLUMN [Something]

ALTER TABLE [dbo].[Customer]
DROP COLUMN [Gender]

Ale jeśli spróbujemy chociaż tknąć kolumnę zawierającą imię, zostaniemy potraktowani błędem. Spróbuj tylko zrobić coś takiego.



ALTER TABLE [dbo].[Customer]
ALTER COLUMN [FirstName] nvarchar(200)

 


A w odpowiedzi MS SQL zwróci Ci komunikat:


Msg 5074, Level 16, State 1, Line 1

The object ‘CustomerShippingData’ is dependent on column ‘FirstName’.

Msg 4922, Level 16, State 9, Line 1

ALTER TABLE ALTER COLUMN FirstName failed because one or more objects access this column.


Aby w jakikolwiek sposób zmodyfikować kolumnę, od której zależne są Twój widok i Twoja procedura, musisz je usunąć i po zamierzonych modyfikacjach utworzyć jeszcze raz, nawet jeśli ich kod nie zostanie zmodyfikowany.


Ciąg dalszy nastąpi?

I na tym dziś skończmy. Istnieje możliwość, że nigdy nie zajdzie konieczność, by w Twoim projekcie używać tego typu technik. Jednak jeśli pewnego dnia okaże się, że będzie Ci to potrzebne, to mam nadzieję, że będziesz o tych narzędziach pamiętać i pomyślisz o mnie ciepło.


A jeżeli takie modelowanie danych Ci się podoba i zastanawiasz się, jak wygląda pociągnięte naprawdę bardzo daleko, to rzuć okiem na pojęcie Anchor Modeling w Wikipedii. Już od jakiegoś czasu noszę się z zamiarem stworzenia na ten temat prezentacji i napisania kilku postów – wyraź zainteresowanie tym zagadnieniem w komentarzu, a może nieco się sprężę. ;)


Do przeczytania!


The post Abstrakcja między bazą danych a aplikacją appeared first on devstyle.pl.

 •  0 comments  •  flag
Share on Twitter
Published on November 14, 2018 21:55

November 13, 2018

November 12, 2018

Październik 2018: podsumowanie i raport finansowy.

Na swoim profilu na Patronite obiecałem publikować co miesiąc “raport finansowy”. Dodatkowo zamieszczam podsumowanie tego, co działo się w imperium devstyle w ostatnim miesiącu. Pokazuję… wszystko. Bez tajemnic. Enjoy!


Październik (listopad zresztą też) to był czas pracy. Mega pracy. Uber pracy. Takiej szalonej, bez wytchnienia. Ale szukałem i plusów :).



Takiej pracy, że podsumowanie października pojawia się dopiero w połowie listopada :).

I takiej, że pękłem jednego dnia:



Bo przez cały październik BARDZO kończyłem mój Kurs Gita.  Ale o nim w kolejnym raporcie, bo owoce tej pracy miały pojawić się dopiero w listopadzie (czyli kilka dni temu).


Ale po kolei! Kasa -> wnioski -> linki. Najpierw kasa.


Raport finansowy: przychody

Założenia:



pieniądze wpływające na konto w bieżącym miesiącu; usługa mogła być zrealizowana w innym terminie
kwoty to faktury netto (chyba, że zaznaczono inaczej)

Pozycje:



konsultacje: 3 200 zł
Patronite: 1000,57 zł
książka “Zawód: Programista”: 4 628,27 zł
Kurs Gita (spóźniona płatność):  76,23 zł
Działania marketingowe:  2 000,00 zł
Nadwyżka podatkowa:  24 692,00 zł

W sumie: 35 597,07 zł



Raport finansowy: wydatki

Założenia:



kwota brutto, znikająca z konta, bez uwzględnienia odliczeń od podatków

Pozycje (linki afiliacyjne):



ZUS: 1 228,70 zł
zespół

testowy montaż VLOGów (rekrutacja nowego montażysty): 210,00 zł
Księgowa: 270,60 zł
asystentka: 1 153,13 zł
montaż video: 240,00 zł +  360,00 zł
korekta tekstów na devstyle: 194,66 zł
PIT-4: 96,00 zł


narzędzia i usługi

WPIdea: 2 497,00 zł
kurs Fabryka Kursów: 747,75 zł
domeny zawodprogramista.pl i zawod-programista.pl: 172,20 zł
domena X: 41,19 zł
poczta (wysyłka zaślepek na kamerkę): 176,00 zł
ScreenFlow: 513,82 zł
reklama Facebook: 252,79 zł
LibSyn: 55,27 zł
Shoplo: 60,27 zł
obsługa płatności online: 95,89 zł
koszty mojego proflu Patronite: 155,44 zł
telefon Orange: 50,00 zł
Vimeo: 768,00 zł (opłacone do 10/2019)
ConvertKit: 0 zł (opłacone do 09/2019)
LeadPages: 0 zł (opłacone do 10/2019)
CoSchedule: 0 zł (opłacone do 09/2019)
Google Storage: 0 zł (opłacone do 11/2018)
DropBox: 0 zł (opłacone do 02/2019)
infakt: 0 zł (wykupione na rok)
wFirma: 0 zł (opłacone do 09/2019)
ToDoist: 0 zł (opłacone do 11/2018)
Headspace: 0 zł (opłacone do 08/2019)


sprzęt

MacBook Pro + słuchawki Sony: 405,13 zł (20 rat 0%)


książki

Nault Jean “Demon południa: Acedia”: 15,71 zł
Gavin Hesketh “W poszukiwaniu fundamentalnej natury rzeczywistości”: 25,49 zł
Steven Pressfield “War of Art”: 48,51 zł
David R. Hawkins “Technika uwalniania”: 67,00 zł
Ramit Sethi “I Will Teach You To Be Rich”: 57,77 zł
Russell Brunson “The Perfect Webinar”: 18,76 zł
Cixin Liu “Ciemny Las”:  24,90 zł


wsparcie 4 autorów na Patronite: 42,00 zł
książka “Zawód: Programista”

wysyłka: 1 279,20 zł
magazynowanie: 421,89 zł


biuro

czynsz 553,50 zł
plakaty: 63,42 zł


samochód:

leasing: 1 774,56 zł
benzyna: 599,90 zł
ubezpieczenie: 3 797,00 zł
parking SkyCash: 50,95 zł
myjnia: 40,00 zł
płyty chodnikowe (na zimę do bagażnika ;) ): 23,92 zł



W sumie: 18 648,32 zł


Raport finansowy: podsumowanie

Tak jak pisałem we wstępie: w październiku skupiałem się na ciężkiej PRACY, nie na zarabianiu. I miał być spory minus, bo wydatki związane z Kursem Gita trzeba było poczynić. Okazało się jednak – już po raz drugi w tym roku! – że po opłaceniu podatków zostało mi na firmowym koncie jeszcze dużo kasy. Więc… SIUP! I mamy plus, jak miło :). Choć tak na serio to >20tys to tak realnie zarobki z poprzednich miesięcy, tylko że ja BARDZO asekuracyjnie przelewam kasę z konta firmowego na prywatne.


Pod względem kasiory niewiele ciekawego się dzieje. Ot, trochę narzędzi, kursik, sporo książek, ubezpieczenie Tojotki (straszą w TV że jest tak drogo, a płacę prawie tysiąc mniej niż rok temu), płyty chodnikowe… Standard ;). No i prawie 20 koła się uzbierało.


Zarobków tez nie ma co analizować – takie “oszukane minimum” właściwie.


Bardziej interesująco będzie w listopadzie (co już pewnie część z Was wie). Spojler taki mały: dzisiaj (a piszę ten tekst 12 listopada) okazało się, że mam w tym roku przekroczone pół miliona złotych przychodów. Po raz pierwszy w życiu. A mówili że “z blogaska to nie wyżyjesz” :). 100 lat!


Szczególnej uwadze polecam Ci 3 odcinki VLOGa, w którym dość dokładnie zaprezentowałem moją współpracę z asystentką. Jak się znaleźliśmy, co mi to daje, jak zmieniła się moja praca, i…czy Tobie też się może przyda? Tu zacznij i poklikaj przez dwa kolejne:



A teraz:


Podsumowanie aktywności devstyle 10/2018

W październiku z wielkim smutkiem pożegnaliśmy się z Grzegorzem Kotfisem, który przez ostatnie 30 tygodni raczył nas cotygowniową porcją newsów w postaci WEDNEWSDAY. Grzegorz będzie realizował inne ciekawe – całkowicie autorskie – projekty. Dzięki Grzesiek i powodzenia!


Oprócz ostatnich porcji newsów mamy jednak kilka relacji oraz niezawodnego Piotra, dzielnie wprowadzającego nas w świat iOS. I moje objaśnienie inicjatywy “devstyle speakers“. Do tego trochę materiałów audio/video i masa VLOGów.


Zapraszamy!


Teksty



Wednewsday #26 – programistyczne nowinki (GRZEGORZ KOTFIS)


127tys więcej i 7kg mniej. Wrzesień 2018: podsumowanie i raport finansowy.


Wednewsday #27 – programistyczne nowinki (GRZEGORZ KOTFIS)


Rubiny, szyny, trailblazery, feniksy. Wrześniowe spotkanie BRUG. (NELA BRZOZOWSKA)


Wednewsday #28 – programistyczne nowinki (GRZEGORZ KOTFIS)


Uczenie maszynowe, iOS i Core ML (PIOTR TOBOLSKI)


PyStok #33, czyli dzikie wensze atakują! (NELA BRZOZOWSKA)


Co to jest devstyle speakers?


Wednewsday #30 – programistyczne nowinki (GRZEGORZ KOTFIS ) (ostatnie :( )

Podcasty (i inne audio)



Podcast Porozmawiajmy O IT #021: Jak żyć gdy programowanie się znudzi



VLOGi



NAJWIĘKSZE == NAJLEPSZE ??? [devstyle vlog #197]

Dlaczego jestem SŁABYM BIZNESMENEM (jeszcze?) [devstyle vlog #198]

Wigry. Październik 2018. [devstyle vlog #199]
127 tys w górę i 7kg w dół, czyli wrzesień 2018 [devstyle vlog #200]

Dlaczego NIE PRZYJMUJĘ pracy ZA DARMO? (choć to bardzo miłe, dziękuję!) [devstyle vlog #201]

Jestem jak PAWLAK. I do tego ZACHĘCAM (ZERO polityki!!!) [devstyle vlog #202]

Asystentka [devstyle vlog #203]
CECHY dobrej ASYSTENTKI [devstyle vlog #204]
ASYSTENTKA i DELEGACJA: Q&A [devstyle vlog #205]

Sytuacje [devstyle vlog #206]
Wystarczy [devstyle vlog #207]
Jak przyjąć feedback? [devstyle vlog #208]
ŻYCIE jest BEZ SENSU [devstyle vlog #209]
ALL IN!!! [devstyle vlog #210]
ZALETY PRZEPRACOWANIA [devstyle vlog #211]
Skąd WIEM CO ROBIĆ (żeby prawie wszystko się UDAWAŁO)? [devstyle vlog #212]

Nie jestem ROBOTEM [devstyle vlog #213]
AUTOPILOT [devstyle vlog #214]

Video



GIT: Tagi W Gicie: Operacje Zdalne. [ⓘ Kurs Gita, Moduł 05, Lekcja 07]


Wywiad u Vincenta z Droga Do: Przesłuchanie 2 – Maciej Aniserowicz – świat okiem programisty



Wyjazdy / konferencje



prowadzenie spotkania autorskiego z Michałem Szafrańskim (Białystok)


====


Jak co miesiąc mam nadzieję, że taki ekshibicjonizm przynosi Tobie nieco wartości i inspiracji

…albo chociaż zaciekawia :). Dostaję czasami pytania “po co to robisz?” I moja odpowiedź zawsze okazuje się wystarczająca. Ale to innym razem.


Do przeczytania wkrótce!


P.S. Jak zwykle, jeśli masz jakiekolwiek pytania: nie wahaj się, tylko je zadawaj! Naprawdę nie mam żadnych tajemnic i chętnie na wszystko odpowiem.


The post Październik 2018: podsumowanie i raport finansowy. appeared first on devstyle.pl.

 •  0 comments  •  flag
Share on Twitter
Published on November 12, 2018 10:55

Maciej Aniserowicz's Blog

Maciej Aniserowicz
Maciej Aniserowicz isn't a Goodreads Author (yet), but they do have a blog, so here are some recent posts imported from their feed.
Follow Maciej Aniserowicz's blog with rss.