Instalacja ROOT

ROOT jest biblioteką do analizy danych, statystyk, wizualizacji danych. Używany jest najczęściej w jednostkach naukowych (CERN, uczelnie itd.). Świetny opis instalacji tego frameworka znalazłam tu:
https://yannisflou.wordpress.com/2012/06/05/root-data-analysis-framework-on-ubuntu-12-04/.

Poniżej przedstawiam opis instalacji pod systemem Ubuntu 12.04, w języku polskim – dla absolutnych początkujących, nie znających systemu Linux.

  1. Download
    Ściągnęłam wersję ROOT 5.34/36 wybierając typ: „Source” na podstronie wersji: https://root.cern.ch/content/release-53436. (Po instalacji przedstawia się jako:
    v5-34-36@v5-34-36, Apr 05 2016, 10:25:45 on linuxx8664gcc)
  2. Rozpakowanie
    d9k@Nihilia:~$ cd rootSOURCE
    d9k@Nihilia:~/rootSOURCE$ gunzip root_v5.34.36.source.tar.gz
    d9k@Nihilia:~/rootSOURCE$ tar xvf root_v5.34.36.source.tar
    
  3. Miejsce docelowe instalacji
    ROOT-a installować będziemy w folderze /opt/ROOT/. Folder „opt” był używany niegdyś do instalowania oprogramowania niezwiązanego z systemem (coś jak windowsowe „Program files”). Obecnie zaleca się używać ścieżki /usr/local, w mojej instrukcji użyję jednak „starodawnych” rozwiązań :)Stworzenie folderu:

    d9k@Nihilia:~/rootSOURCE$ sudo mkdir /opt/ROOT/
    

    Stworzenie tymczasowej zmiennej globalnej (w następnych krokach „utrwalimy” ją, aby była dostępna także po zamknięciu tej sesji terminala):

    d9k@Nihilia:~/rootSOURCE$ export ROOTSYS=/opt/ROOT
    

    Możemy sprawdzić, czy się utworzyła:

    d9k@Nihilia:~/rootSOURCE$ echo $ROOTSYS
    /opt/ROOT
    

    Ok.

  4. Configure
    Configure to pierwszy krok instalacji. W skrócie Configure jest to skrypt, który na bazie podanych mu opcji (i zmiennych, uwarunkowań i zależności istniejących w systemie) tworzy plik Makefile, który z kolei zostanie użyty w kolejnych krokach.Można wyświetlić sobie helpa polecenia Configure – najlepiej zrzucając go do pliku, bo opcji konfiguracji ROOT-a jest ogólnie bardzo dużo. Instalować będziemy w opcjach domyślnych, wskazując jedynie miejsce instalacji.

    d9k@Nihilia:~/rootSOURCE$ cd root
    d9k@Nihilia:~/rootSOURCE/root$ ./configure --help > ../configure_help.txt
    

    I wywołanie samego polecenia – ze wskazaniem mu ścieżki, gdzie ROOT ma zostać zainstalowany:

    d9k@Nihilia:~/rootSOURCE/root$ ./configure --prefix=/opt/ROOT
    
  5. Make
    Wykonanie tego kroku trwało dość długo. Podczas tego etapu źródła są budowane za pomocą pliku Makefile, zawierającego instrukcje budowania.

    d9k@Nihilia:~/rootSOURCE/root$ make
    
  6. Make install
    Wreszcie ostatni krok. Na tym etapie skompilowany program jest kopiowany do miejsca docelowego (podanego w parametrze „prefix” na etapie konfiguracji).

    d9k@Nihilia:~/rootSOURCE/root$ sudo make install
    [sudo] password for d9k:
    ============================================================
    === ROOT BUILD SUCCESSFUL. ===
    === Run 'make install' now. ===
    ============================================================
    Installing binaries in /opt/ROOT/bin
    Installing libraries in /opt/ROOT/lib/root
    Installing headers in /opt/ROOT/include/root
    Installing /home/d9k/rootSOURCE/root/main/src/rmain.cxx in /opt/ROOT/include/root
    Installing cint/cint/include cint/cint/lib and cint/cint/stl in /opt/ROOT/lib/root/cint
    Installing icons in /opt/ROOT/share/root/icons
    Installing fonts in /opt/ROOT/share/root/fonts
    Installing misc docs in /opt/ROOT/share/doc/root
    Installing tutorials in /opt/ROOT/share/doc/root/tutorials
    Installing tests in /opt/ROOT/share/doc/root/test
    Installing macros in /opt/ROOT/share/root/macros
    Installing man(1) pages in /opt/ROOT/share/man/man1
    Installing config files in /etc/root
    Installing Autoconf macro in /opt/ROOT/share/aclocal
    Installing Emacs Lisp library in /opt/ROOT/share/emacs/site-lisp
    Installing GDML conversion scripts in /opt/ROOT/lib/root
    d9k@Nihilia:~/rootSOURCE/root$
    

    Udało się.

  7. Source
    Krok wymagany przez program ROOT – uruchomienie skryptu „thisroot.sh„, ustawiającego ścieżki używane przez program ROOT, takie jak $ROOTSYS, $LD_LIBRARY_PATH, $DYLD_LIBRARY_PATH, $PATH, $LIBPATH i wiele innych. Jego treść można oczywiście podejrzeć dowolnym edytorem:

    d9k@Nihilia:~$ cat /opt/ROOT/bin/thisroot.sh
    

    Ok, czas na wykonanie tego skryptu:

    d9k@Nihilia:~$ source /opt/ROOT/bin/thisroot.sh
    
  8. Uruchomienie
    Nareszcie możemy uruchomić program ROOT:

    d9k@Nihilia:~$ root
    *******************************************
    * *
    * W E L C O M E to R O O T *
    * *
    * Version 5.34/36 5 April 2016 *
    * *
    * You are welcome to visit our Web site *
    * http://root.cern.ch *
    * *
    *******************************************ROOT 5.34/36 (v5-34-36@v5-34-36, Apr 05 2016, 10:25:45 on linuxx8664gcc)CINT/ROOT C/C++ Interpreter version 5.18.00, July 2, 2010
    Type ? for help. Commands must be C++ statements.
    Enclose multiple statements between { }.
    root [0]
    
  9. Utrwalenie zmiennych
    Po wyłączeniu terminala, ustawiona w poprzednich punktach zmienna ROOTSYS zniknie. Można ją utrwalić.Jak czytamy w helpie Ubuntu:
    „A suitable file for environment variable settings that affect the system is /etc/environment.
    An alternative is to create a file for the purpose in the /etc/profile.d directory.”Modyfikujemy zatem plik:

     d9k@Nihilia:~$ sudo gedit /etc/environment
    

    Dodając na koniec:

    ROOTSYS="/opt/ROOT"
    

    Aby nie trzeba było za każdym włączeniem terminala uruchamiać na nowo skryptu thisroot, można ustawić, aby skrypt był uruchamiany przy starcie systemu:

    d9k@Nihilia:~$ sudo gedit .bashrc
    

    Na końcu dodając linijkę:

    source /opt/ROOT/bin/thisroot.sh
    
  10. Gotowe 🙂

Jeśli chcesz natomiast przeczytać, jak zainstalować moduł LHAPDF, pisałam o tym tutaj.

Tydzień 2 – pierwsze commity

Drugi tydzień już się kończy, czas zatem na raport.

Niestety na projekt przeznaczyłam dużo mniej czasu, niż planowałam (sumarycznie może jakieś… 2 godziny). Wszystko dlatego, że „po godzinach” wciągnęła mnie… magisterka 😉

Zrealizowane:

  • Must: Prosta stronka WWW – nie zdefiniowałam sobie, co rozumieć przez prostą stronkę 😉 Mam w głowie zamysł, jak chciałabym, aby wyglądał UI. Myślałam o zastosowaniu Material Design, bo w zamierzchłych czasach, gdy zajmowałam się ciut webdeveloperką CSSy robiło się ręcznie, ciekawa jestem zatem jak to jest: użyć czegoś gotowego 🙂 Nawet naszkicowałam sobie przecudnej urody mockup na papierze:

  • Must: Skrypt JS pobierający aktualną datę i godzinę – tak.
  • Should: Jeżeli data zawiera się w przedziale: 15.04 – 15.09 oraz w godzinach 10:00 – 15:00, określenie, że witamina D jest syntetyzowana – tak.

Google się obraziło

Google Analytics powiedziało mi, że już mnie nie lubicie. A przynajmniej mojego blogaska.

Statystyki bloga od lata 2016 do stycznia 2017. Żólte: wejścia z wyszukiwarki. Niebieskie: wszystkie wejścia.

W zasadzie to kompletnie nie ma się czym chwalić. Ale bardziej niż przyczyna, zainteresował mnie sam fakt. Powodów upatruję w zmianie algorytmów Google. Jak donoszą niektóre źródła nt. SEO, 14/15 grudnia 2016 miało miejsce uaktualnienie algorytmu. Jak widać na wykresie w Algroo (strona śledząca różne słowa kluczowe i zmiany pozycji stron w wynikach wyszukiwarki) istotnie „coś” się wtedy wydarzyło:

Wykres „stabilności” wyników w Google w Algroo. Czerwony pik: zawirowania 15/16 grudnia 2017

Na szczęście w tym miesiącu ponownie odbijamy się od dna;) Mam nadzieję, że moje przeboje z WordPressem nie wpłyną negatywnie na wyniki, a zmiana hostingu będzie tylko na plus.

Aktualne statystyki. Żółte: wejścia z wyszukiwarki, niebieskie: wszystkie wejścia.

Suma summarum bardzo cieszę się, że w swojej zawodowej pracy zboczyłam ze ścieżki „SEO” i udałam się w stronę, gdzie wyniki w większej mierze zależą od zaangażowania i włożonego wysiłku 😉

Ciekawe konferencje – wiosna 2017

Pracując w branży informatycznej warto być na bieżąco. Trendy zmieniają się jak w kalejdoskopie, co rusz na rynek wchodzą nowe frameworki i narzędzia. Całkiem niezłym sposobem na trzymanie ręki na pulsie jest uczestnictwo w konferencjach i wykładach. Wiele z nich jest darmowych!

Gdzie zatem warto zawitać wiosną 2017?

Marzec:

  • 16 – 18 marca (czwartek – sobota) – Studencki Festiwal Informatyczny, Kraków. Wstęp: free. Trzy dni najróżniejszych wykładów i warsztatów.
  • 17 marca (piątek)IT Academic Day 2017, Bielsko-Biała. Wstęp: free.
  • 20 marca (poniedziałek)SkładQA, Kraków. Wstęp: free. Niezależna konferencja testerska organizowana przez KraQA. Wielokrotnie bywałam na prelekcjach w ramach KraQA, toteż myślę, że z czystym sumieniem mogę polecić. Nie tylko testerom 🙂

Kwiecień:

  • 3 kwietnia (poniedziałek) – 4Developers 2017, Warszawa. Wstęp: 75zł (studenci) / 400zł / 450zł. Mnóstwo ścieżek tematycznych, od architektury aplikacji po gamedev i front-end.
  • 22 kwietnia (sobota)Lubelskie Dni Informatyki, Lublin. Wstęp: free.
  • 22 kwietnia (sobota)DEVCROWD, Szczecin. Wstęp: free. Dla entuzjastów Javy. Szczegółowego programu jeszcze brak.

Maj:

  • 17-19 maj (środa – piątek)InfoShare, Gdańsk. Wstęp: free. Kilka ścieżek tematycznych, nie tylko technicznych, ale także odnośnie tworzenia własnej firmy.

Czerwiec:

  • 23-24 czerwca (piątek – sobota) – Quality Excites 2017, Gliwice. Wstęp: free. Agendy jeszcze brak, niemniej konferencję bardzo polecam, nie tylko testerom!

Skąd natomiast czerpać informacje o wydarzeniach? Niezłym źródłem jest Facebook, blogi, LinkedIn. Jest również kilka aplikacji dedykowanych: Meetup, który uczy się polecać wydarzenia na podstawie historii użytkownika, Evenea umożliwiająca także zapisy albo kalendarz Crossweb.

Tydzień 1 – czyli jak (nie) przenosić bloga WordPress na inny serwer + plan na projekt

Wraz z początkiem marca postanowiłam ruszyć do przodu z projektem (zatem za pierwszy tydzień realnych zmagań konkursowych uznaję tydzień 10: 6-12 marca).

Blog

Na pierwszy ogień poszedł blogasek. Przeniosłam się na inny hosting. Migracji dokonałam w sposób – jak to się niegdyś mówiło – lamerski, a wszystko to z racji braku dostępu do swojego komputera. Dla chcącego nic trudnego. Cały proces udał się, chociaż wszystko musiałam wyklikać w panelu WordPressa, a parę rzeczy nastręczyło mi problemów…:

  1. Przepięcie domeny – u rejestratora wpisanie adresów DNS nowego hostingu, w hostingu dodanie nowej domeny.
  2. Eksport treści ze starego bloga, za pomocą domyślnego narzędzia wbudowanego w platformę:
    Narzędzia –> Eksport.

    Jako wynik otrzymujemy plik XML ze wszystkimi wpisami i komentarzami.
  3. Instalacja WordPressa za pomocą pakietu Installatron – parę kliknięć i gotowe.
  4. Import – w ten sam sposób, co eksport:
    Narzędzia –> Import.
  5. Konfiguracja WordPressa – z poziomu panelu administracyjnego. Moje niezbędne minimum:
    • Dodanie tej samej templatki, co na starym blogu (Sparkling). Może nie jest szałowa i nowoczesna, ale w miarę mi wystarcza. W oko wpadła mi jeszcze Moesia, chociaż jest zbyt… designerska, Simple Live, które z kolei jest ciut staroświeckie i Twenty Twelve, które byłoby idealne, gdyby poszczególne wpisy były od siebie lepiej oddzielone. Kwestia zabawy CSS-em – do przemyślenia.
    • Instalacja wtyczek – Akismet (antyspam), Who Stole the Text Justify Button (guziczek justowania treści wpisu;)), SyntaxHighlighter (obsługa kodów źródłowych – oficjalnie nie jest wspierany w wersji  4.7.2 WordPressa, jednak z tego co widzę zadziałał – cóż, mam nadzieję, że nic się nie posypie).
    • Dodanie kodu Google Analytics.
    • Parę zmian konfiguracyjnych.
  6. Problemy – czyli co zostało mi do zrobienia (o ile znajdę czas):
    • Brak obrazków we wpisach.
    • Brak wpisów z lutego. Hihihi…
    • Brak formatowania wpisów 🙁
    • Brak wypisów (excerpt). Wszystkie wpisy są wyświetlane w całej swej długości.
    • Brak obrazków Gravatar komentatorów.
    • Wszystkie wpisy wylądowały w kategorii Uncategorized.

Czeka mnie zatem jeszcze trochę pracy. Jak to się mówi – „mądry Polak po szkodzie„. Można było nie śpieszyć się tak z przenosinami i po prostu przerzucić dane przez FTP, po czym dokonać aktualizacji całego WordPressa. Albo zainstalować którąś ze wtyczek wspomagających import/eksport. Cenne doświadczenie 🙂

Projekt

Zabrałam się za planowanie projektu. Na razie na papierze. Będzie to prosta aplikacja do zapisywania ilości zażytej witaminy D. Oczywiście mam na myśli witaminę D syntezowaną w skórze 😉 Całość planuję robić w modelu iteracyjnym, zgodnie z założeniami Scruma, tj. planowanie przebiegu (dziś), kodzenie, demo (notka w przyszłym tygodniu – trochę na przekór Scrumowi, bo łączona z kolejnym planowaniem, ale nie chcę za wiele spamu tworzyć, tylko skupić się na konkretach). Chciałabym trzymać się założenia, że każda iteracja dostarcza pełen produkt, a na planowaniu zadania są upraszczane, a nie dzielone.

Garść wiedzy na najbliższy sprint
(za: http://www.sloncewpigulce.pl/zrodla/slonce-najwazniejsze-zrodlo-witaminy-d):

„Efektywna synteza skórna witaminy D zachodzi właściwie wyłącznie od końca kwietnia do początku września, w słoneczne dni, pomiędzy godziną 10.00 a 15.00. Należy wtedy przebywać na słońcu przez minimum 15 minut dziennie i mieć odsłonięte przynajmniej 18 procent powierzchni ciała (twarz, przedramiona i częściowo nogi) oraz nie należy stosować filtrów przeciwsłonecznych”.

Najprostszy model tej aplikacji na ten sprint (rozpiska wg metody MoSCoW – OK, średnio scrumowa, ale całkiem fajna na pierwszy rzut, zwłaszcza, że nie mam jeszcze backlogu! Dynamiczny ten mój Agile, oj dynamiczny):

Must:

  • Prosta stronka WWW.
  • Skrypt JS pobierający aktualną datę i godzinę.

Should:

  • Jeżeli data zawiera się w przedziale: 15.04 – 15.09 oraz w godzinach 10:00 – 15:00, określenie, że witamina D jest syntetyzowana.

Could:

  • Możliwość dodania wpisu z czasem spędzonym na słońcu – na razie bez zapisu na serwer. W najprostszej postaci – może cookie, może eksport do pliku, który następnie będzie importowany(?). Jak widać wymaganie nie jest dobrze zgroomowane.

Won’t:

  • Prawidłowe liczenie pozycji słońca na podstawie współrzędnych geograficznych użytkownika.
  • Użycie GPS do pobrania współrzędnych użytkownika.
  • Przeliczanie czy kąt padania światła jest wystarczający do syntezy witaminy D.
  • Obsługa użytkownika – konto, logowanie, zapisywanie czasu spędzonego na słońcu.
  • Statystyki czasu spędzonego na słońcu.
  • Pobieranie indeksu UV z zewnętrznego źródła danych.
  • Sugerowanie użytkownikowi, ile czasu powinien spędzić na zewnątrz lub jaką dawkę witaminy D zaaplikować w postaci suplementów diety.
  • Artykuły na temat źródeł witaminy D i jej wpływu na zdrowie i funkcjonowanie organizmu.

Daj Się Poznać 2017

Konkurs Daj Się Poznać organizowany jest juz od kilku lat. Przez pewien czas przyczajalam sie do wziecia udzialu. I oto nadszedl ten moment, postanowilam sprobowac. Bo czemu nie. Co prawda mam na glowie pare solidnych cegiel (obowiazkow znaczy sie), ale – zobaczymy jak bedzie.

W glowie mialam pomysly na dwa projekty. Poczatkowo w ramach konkursu planowalam pokazac projekt w Qt, ktory jest projektem na zlecenie, a wykonywanym pro publico bono. Poniewaz jednak takie projekty rzadza sie swoimi prawami i sa w duzej mierze zalezne od kogos innego, postanowilam postawic na inna karte – projekt wlasny. Z zalozenia jest on naprawde miniaturowy, ale jesli starczy mi czasu, rozbuduje go o dodatkowe funkcjonalnosci. A moze przebuduje calkowicie i zrobie z tego rakiete kosmiczna! Slowem – Agile. Bede sie adaptowac do rzeczywistosci 😉

Co można zobaczyć w Warszawie – technika

Okres zimowy sprzyja snuciu marzeń o wyjazdach i… wspomninania wycieczek już minionych. Na oderwanie od klawiatury zapraszam do… Warszawy. Oczywiście głównie tych wszystkich, którzy stałymi bywalcami stolicy nie są 🙂

Przewodników po stolicy naszego kraju jest w sieci multum. A co, jeśli nie interesują nas typowe zabytki lub zwiedzanie Łazienek czy Zamku Królewskiego mamy już za sobą? Nic straconego, Warszawa obfituje w atrakcje. Przygotowując się do wycieczki, przygotowałam sobie listę ciekawostek „technicznych”. Co więc warto zobaczyć?

wawa Czytaj dalej

Examples of QString::number

Some examples of a very useful Qt function: QString::number. This function is helpful in converting double/float to string. QString, to be more precise 😉

QString::number has got 3 parameters:

  • double n – number, which will be converted
  • char format = ‚g – format: available formats are f, e, E, g, G. Default is ‚g’:
  • int precision = 6 – precision.

Let me show some examples. On the end of each line is a output from console:


//f - float
QString::number(3.14159265359, 'f', 0); //3
QString::number(3.14159265359, 'f', 1); //3.1
QString::number(3.14159265359, 'f', 2); //3.14
QString::number(3.14159265359, 'f', 15);//3.141592653590000

//e - exponential notation
QString::number(3.14159265359, 'e', 15); //3.141592653590000e+00
QString::number(3.14159265359, 'E', 15); //3.141592653590000E+00

//g/G - "general" - in this case: "f"
QString::number(3.14159265359, 'g', 0); //3
QString::number(3.14159265359, 'g', 1); //3
QString::number(3.14159265359, 'g', 2); //3.1
QString::number(3.14159265359, 'g', 15); //3.14159265359

QString::number(3.14159265359, 'G', 2); //3.1
QString::number(3.14159265359, 'G', 15); //3.14159265359

//g/G - "general" - in this case: "e/E"
QString::number(2.5e+5, 'g', 0); //2e+05
QString::number(2.5e+5, 'g', 1); //2e+05
QString::number(2.5e+5, 'g', 2); //2.5e+05
QString::number(2.5e+5, 'g', 15); //250000

QString::number(2.5e+5, 'G', 2); //2.5E+05
QString::number(2.5e+5, 'G', 15); //250000

//comparision with f and e/E:
QString::number(2.5e+5, 'f', 2); //250000.00

QString::number(2.5e+5, 'e', 15); //2.500000000000000e+05
QString::number(2.5e+5, 'E', 2); //2.50E+05

C# – walidacja maila

Żeby sprawdzić poprawność adresu email, wcale nie trzeba męczyć się ze skomplikowanymi wyrażeniami regularnymi. W C# z pomocą przychodzi klasa MailAddress. Oczywiście jest to rozwiązanie wysokopoziomowe i wolne (rzuca wyjątki). Zapewnia jednak czytelność kodu.

Przykład (zaczerpnięty ze StackOverflow):

bool IsValid(string emailaddress)
{
  try
  {
    MailAddress m = new MailAddress(emailaddress);
    Console.WriteLine("TRUE" + "\t" + emailaddress);
    return true;
  }
  catch
  {
    Console.WriteLine("FALSE" + "\t" + emailaddress);
    return false;
  }
}

I testy:
IsValid("ok@ok.pl");
IsValid("dolores.ryba@poczta-n.pl");
IsValid("dolores.ryba@poczta.odlotowa.pl");
IsValid("dolores.ryba@a.b.c.d.pl");
IsValid("psikus@dot.dot.dot..pl");
IsValid("@");
IsValid("");
IsValid(null);
IsValid("bad@");
IsValid("@wolf");
IsValid("@poczta.pl");
IsValid("cokolwiek");

Czytaj dalej

Podsumowanie roku 2016 – blog

Kolejny rok za nami. 2016 szczęśliwie przeszedł już do historii.

Praca

Zawodowo był to dla mnie trudny rok. Zapowiadało się bardzo spokojnie i stabilnie, tymczasem pojawiło się trochę nieplanowanych, nowych „wyzwań”.

Blog

Na blogu planowałam dodawać 5 notek miesięcznie. Szczęśliwie udało mi się to, skutkiem czego w 2016 pojawiło się 60 nowych wpisów.

Pięć najpopularniejszych wpisów powstałych w 2016 to:

  1. Narzędzia do automatyzacji aplikacji desktopowych (7.10.2016)
  2. Dobre praktyki w testach Selenium (5.06.2016)
  3. Fale radiowe na mapie (10.01.2016)
  4. BDD, TDD i inne (15.05.2016)
  5. Jogger (10.04.2016)

Natomiast pięć najczęściej czytanych notek w tym roku to:

  1. Pytania na rozmowie kwalifikacyjnej dla testera (8.02.2015)
  2. Jak wyświetlić listę wszystkich tabel w PostgreSQL (3.01.2012)
  3. Twarda spacja w PowerPoint (3.03.2013)
  4. Różnica dat w Excelu (21.02.2011)
  5. ISTQB – parę słów o egzaminie (2.03.2013)

Plany na dalszy rozwój bloga? No cóż, przyznaję, że nie zamierzam przewrócić swojego życia do góry nogami, rzucić pracy i innych spraw i zajmować się tylko rozwojem bloga, aaa!!!1!!11 😉 Plany zatem są raczej skromne:

  • ! Przeprowadzka na nowy serwer. Koniecznie.
  • ! Zachowanie obecnego planu publikacji 5 wpisów miesięcznie. Jest to dobra motywacja do pisania 🙂
  • ? Doinstalowanie wtyczki Disqus – wciąż się nad tym zastanawiam. Z jednej strony fajne narzędzie, które umożliwia łatwe śledzenie dyskusji, odpowiedzi na swoje komentarze itd. Z drugiej jednak strony blokowane jest np. przez Ghostery, skutkiem czego nie wszyscy mogą zobaczyć komentarze pod wpisami (chyba że odblokują sobie Disqusa).

 

Szczęśliwego 2017, drodzy czytelnicy!