środa, 20 maja 2009

Instalacja APEX-a i upgrade do najnowszej wersji w Oracle XE.

UWAGA !!!
Odświeżona wersja artykułu znajduje się TUTAJ.

Dziś opiszę sposób instalacji APEX-a oraz podniesienia jego wersji do najnowszej jaka obecnie istnieje. Najnowszą wersję należy szukać tutaj (instalka zajmuje około 100MB). Podczas pisania tego wpisu najnowszą wersją jest APEX 3.2 Zawarte przykłady opierają się na instalacji w środowisku Windows, jeżeli znajdą się punkty w których daną czynność należy wykonać w sposób inny na np linuxie to też to zaznaczę.

Sama instalacja Oracle Application Express jest tożsama z instalacją bazy Oracle 10g XE, czyli jeżeli instalujesz Oracle 10g XE to też APEX-a. Te dwa elementy są nierozłączne. Nie będę więc opisywał krok po kroku jak instaluje się Oracle XE ponieważ jest to na tyle banalne, że każdy średnio rozgarnięty użytkownik komputera będzie potrafił to sam wykonać. Mając na uwadze to co napisałem powyżej, łatwo dojść do wniosku, iż pierwotna wersja APEX-a 2.1, która jest dostarczana wraz z silnikiem Oracle XE jest bardzo przestarzała. Do tej pory Oracle wypuścił około pięć nowszych wersji. Czyli można powiedzieć że przepaść między wersją wbudowaną w XE a bieżącą jest ogromna.

Po pobraniu instalki rozpakowuję ja do C:\apex_3.2\apex. Sama instalka to głównie zbiór skryptów SQL oraz plików graficznych i odpowiadających za tematy graficzne.

Wchodzimy w linie poleceń windows i zamieniamy katalog roboczy na C:\apex_3.2\apex\owa, czyli:

C:\>cd apex_3.2\apex\owa
Podłączamy sie teraz do bazy Oracle-a jako użytkownik sys as sysdba
C:\apex_3.2\apex\owa>sqlplus sys/hasło@xe as sysdba


Jeżeli wszystko zostało prawidłowo podane powinniśmy zobaczyć komunikat podobny jak niżej.

SQL*Plus: Release 10.2.0.1.0 - Production on îr Maj 20 15:17:59 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production


SQL>


Teraz możemy zacząć uruchamiać skrypty. Pierwszym niezbędnym skryptem jest owainst.sql skrypt ten odpowiada za instalację najnowszej wersji PL/SQL Web Toolkit. Wersja wymagalna dla APEX 3.2 to 10.1.2.0.6. Jeżeli do tej pory nie instalowałeś innej wersji APEX-a niż wersja zawarta w Oracle XE to możesz być pewny że masz starszą wersję PL/SQL Web Toolkit i uruchomienie tego skryptu jest obligatoryjne. Raz zdarzyło mi się zapomnieć podnieść wersję PL/SQL Web Toolkit, problem jaki powstał to brak możliwości wykorzystywania cachowania elementów aplikacji (mimo iż włączałem cache-owanie to i tak nie działało - nie dostawałem żadnego błędu). Dla wnikliwych proponuję w pierwszej kolejności uruchomić następującą komendę w SQLPlusie:

SQL>select owa_util.get_version from dual;


Wynikiem zapytania będzie wersja PL/SQL Web Toolkit.
Jeżeli faktycznie wersja nie jest odpowiednia to uruchamiamy skrypt następująca komendą:

SQL>@owainst.sql


W okienku konsoli powinno przewinąć się kilka ekranów kodu i skrypt po około 1 min. powinien się zakończyć. Oczywiście teraz możemy ponownie sprawdzić wersję PL/SQL Web Toolkit zapytaniem które wcześniej przytoczyłem.

Następnym krokiem jest uruchomienie właściwej instalacji upgrade-u. W tym celu musimy ponownie zmienić katalog roboczy w systemie operacyjnym. Czyli wychodzimy z SQL/Plusa komendą exit i zmieniamy katalog na C:\apex_3.2\apex czyli z lini poleceń wychodzimy piętro wyżej:

C:\apex_3.2\apex\owa> cd ..


Następnie ponownie podłączamy się do SQL/Plusa na użytkownika SYS as sysdba. Po podłączeniu się do Oracle-a uruchamiamy główny skrypt apexins.sql z tym że musimy tym razem podać kilka dodatkowych parametrów. Pierwszy parametr to przestrzeń tabel w jakiej powinny być składowane obiekty bazodanowe (tablespace_apex) , drugi parametr to przestrzeń tabel w której maja byc składane pliki (tablespace_files), trzeci parametr to przestrzeń tymczasowa która ma być wykorzystywana przez APEX (tablespace_temp), przestrzeń ta musi być typem przetrzeni tabel tymczasowych. Ostatnim elementem jest tzw. katalog wirtualny (images), w którym znajdować się będą pliki graficzne i odpowiadające za wygląd templatów. W oficjalna dokumentacji możemy znaleść następujący wzór:

SQL>@apexins tablespace_apex tablespace_files tablespace_temp images


A jako wartości podstawione są następujące elementy:

SQL>@apexins SYSAUX SYSAUX TEMP /i/


Podany przykład jest złym przykładem a dlaczego już mówię. Chodzi o to, iż wykorzystując ORACLE XE mamy pewne ograniczenia m. in maksymalna suma wielkości plików danych to 4GB. Wkładając wszystkie obiekty do przestrzeni SYSAUX narażamy się na problemy które mogą przyjść z czasem a konkretnie z nowymi wersjami APEX-a. Chodzi o to, iż każda następna wersja APEX-a tworzy nowy schemat użytkownika, który zajmuje około 300 MB. Zatem w pewnym momencie możemy natknąć się na taki problem, ze przestrzeń SYSAUX urośnie nam do sporych rozmiarów. Rozwiązanie wydaje się proste: usunąć nieużywany stary schemat/schematy i po sprawie. No właśnie że nie, usunięcie schematu nie redukuje wielkości przestrzeni tabel (plików należących do tej przestrzeni). Żeby zredukować wielkość plików danych należących do danej przestrzeni należy użyć komendy alter database datafile ....... resize..., chmmm i teraz większość Oracle-owców krzyknie - "Ograniczenia związane z pozycją wolnego miejsca w zmniejszanym pliku !!!" (zmniejszanie jest tylko możliwe jeżeli wolne miejsce znajduje się na końcu pliku w przeciwnym razie nie jest to możliwe). Sytuacja gdzie duży fragment pliku jest wolną przestrzenią i to znajdującą się na końcu to zapewniam rzadkość. Więc zaraz nasuwa się inny sposób usuńmy całkowicie tę przestrzeń i załóżmy ją na nowo z mniejszą wielkością. Niestety SYSAUX to przestrzeń systemowa, nie można ją usunąć :( . Czyli pat - zapchał nam się Oracle ze względu na ograniczenia 4 GB. Zostaje tylko w tedy przeinstalowanie całego XE.

Dużo na ten temat się rozpisałem a to dlatego, że przeżyłem to na własnej skórze : ). Wracając do naszego przykładu proponuję więc użyć własnej przestrzeni tabel lub użyć jakąś domyślnie instalowaną np. USERS. Czyli poprawiając wcześniej cytowany skrypt należało by posłużyć się raczej następującymi argumentami:

SQL>@apexins USERS USERS TEMP /i/


Uwaga !!!
Jeżeli upgrade robiony jest na XE postawionym na Windowsie musisz poprawić oryginalny skrypt coreins.sql. Chodzi o to, iż użyta zmienna @^PREFIX.core/ ma pałkę końcowa obróconą zgodnie z systemem linux. Więc żeby skrypt prawidłowo mógł znaleźć poszczególne podskrypty należy w całym pliku zamienić ją na @^PREFIX.core\.

Teraz z całą odpowiedzialnością możemy uruchomić skrypt naciskając Enter. Na konsoli zaczną szybko przewijać się komunikaty pozytywne : )... można iść na małą kawę (około 15 min).

Jeżeli otrzymamy podobny ekran:



To znaczy, że główny element upgradu został wykonany prawidłowo. Teraz pozostało nam wykonanie podmiany plików graficznych, css i javascript. Jeżeli używałeś wcześniejszej wersji APEX-a i dodawałeś jakieś własne pliki do katalogu wirtualnego /i to najlepiej jak wykonasz kopie zapasową dodawanych plików, w przeciwnym razie możesz je bezpowrotnie stracić. Podmiana plików i templatów jest bezwzględnie wymagana można ją wykonać na wiele sposobów np poprzez podłączenie się do wirtualnego katalogu poprzez WebDav, lub poprzez FTP lub poprzez uruchomienie skryptu. Ten ostatni sposób jest najlepszy (najszybszy i niezawodny).
Nie polecam podmiany przez WebDav trwa to okropnie długo i lubią występować problemy.

Zatem aby podmienić pliki należy ponownie podłączyć się do Oracle-a poprzez SQL/Plus używając użytkownika sys as sysdba, a następnie uruchomic skrypt apxldimg.sql.

@apxldimg.sql C:\apex_3.2


Skrypt wykonuje się około 2 minut. Ostatni krok to ustawienie hasła dla Administratora workspace-ów, w tym celu uruchamiamy ostatni skrypt. Jako że poprzedni skrypt nie zamknął sesji SQL/Plus to możemy śmiało pościć poniższą komendę.

@apxxepwd.sql hasło


gdzie "hasło" jest hasłem dla użytkownika ADMIN.

Sprawdzamy naszą operacje upgrade-u poprzez wejscie do APEX-a w tym celu uruchamiamy przeglądarkę WWW i wpisujemy adres: http://localhost:8080/apex Wprowadzamy nazwę workspace-u, użytkownika i hasło. Jeżeli do tej pory nie miałeś żadnego workspace-a to postępuj następująco.
Wejdź na stronę http://localhost:8080/apex/f?p=4550:10 zaloguj się jako użytkownik ADMIN z hasłem jakie podałeś przy ostatnim skrypcie. W menu Manage Workspaces załóż nowy workspace (nie będą tutaj szczegółowo opisywał kroków wszystko jest w oficjalnej dokumentacji lub można zrobić to na czuja). Po wykonaniu wszystkich kroków ponownie wróć na stronę http://localhost:8080/apex i wprowadź wszystkie informacje które użyłeś przy zakładaniu workspace-a. Po zalogowaniu powinieneś zobaczyć w prawym dolnym rogu przeglądarki następujący numer wersji:



Mając najnowszą wersję Oracle Application Express możesz teraz zacząć zagłębiać się w tajniki budowania aplikacji webowych.

43 komentarze:

  1. No nie wiem. na etapie zamiany katalogu roboczego mam zonk'a że string not found. :-(

    OdpowiedzUsuń
  2. Andrzej Nowakowski18 czerwca 2009 14:13

    Witam

    Jeżeli mówisz o tej komendzie:
    cd ........
    to oznacza tyle że odwołujesz się do lokalizacji/katalogów które nie istnieją. Więc jeżeli po cd masz jakąś ścieżkę np c:\apex_3.2\apex\owa to te wszystkie katalogi muszą istnieć. Ewentualnie przy wprowadzaniu ścieżki robisz jakąś literówkę.

    OdpowiedzUsuń
  3. witam,
    po wykonaniu upgrade (czyli wszystkich czynnosci tu opisanych)nie wyswiatla mi sie strona http://localhost:8080/apex/f?p=4550:10

    OdpowiedzUsuń
  4. już jest ok ;-)
    Tak nawiasem pisząc dobrze że taka strona istnieje ;-)
    Dopiero zaczynam swoją przygodę z apex-em i milo korzystać z doświadczenia innych ;-)
    Pozdrawiam

    OdpowiedzUsuń
  5. Fajnie że się udało. Co do strony ..../f?p=4550:10 to można też wejść poprzez standardowy adres czyli http://localhost:8080/apex/ i wpisać w workspace->INTERNAL, użytkownik->ADMIN no i hasło takie jak w skrypcie do ustawiania hasła.

    OdpowiedzUsuń
  6. Witam,
    mam tekie pytanko ...
    jak podłączyć się przez apex-a do już istniejących tabel w bazie. Jedyno co moge to do tabel DEMO. przez zmiane tablespace ? Będe wdzięczny za pomoc

    OdpowiedzUsuń
  7. Wystarczy wejść do cześci administracyjnej (mój wcześniejszy wpis w komentarzach) a następnie stworzyć nowy workspace z opcją o ile się nie mylę w drugim kroku Reuse existing schema -> YES. Następnie wpisać lub wybrać z listy pop-up schemat z interesującymi Ciebie tabelami. Jak juz to zrobisz to logujesz sie do APEX-a wpisując nowy workspace i dane do logowania a następnie wchodzisz do application builder i działasz na własnych tabelach : )

    OdpowiedzUsuń
  8. dziękuje za pomoc - wszystko działa ;)

    OdpowiedzUsuń
  9. Witam,
    Jak już tak wypytuje, to pozwolę sobie na jeszcze jedno pytanko ;-)
    Chodzi o user-ów w apex-sie. Aby modyfikować tabele istniejącego już schematu powinni istnieć w bazie użytkownicy o odpowiednich uprawnieniach. Jak jest w przypadku utworzenia użytkownika w apex-sie (bez autoryzacji poprzez bazę)?. Po ich utworzeniu nie widać ich w tabelach systemowych Oracle (chyba że coś nie tak zrobiłem ). Na jakiej zasadzie może taki user modyfikować tabele w schemacie. W opisach jakie czytałem mowa była tylko o uprawnieniach do samej aplikacji.

    OdpowiedzUsuń
  10. Co do użytkowników to masz do wyboru kilka możliwości. Mogą to być użytkownicy w bazie i widoczni w słownikach oracle. Raczej nie polecam takiego rozwiązania (problemy będą w momencie jak będziesz chciał takimi uzytkownikami zarządzać z pozycji APEX-a i swojej aplikacji) lub logika twojej aplikacji bedzie polegała, że użytkownik sam może sobie założyć konto.
    Dlatego lepiej stworzyć własny schemat autentyfikacji Shared Components>Authentication Schemes a następnie do tego schematu zbudować swoje schematy autoryzacji Shared Components>Authorization Schemes. Takie schematy możesz podłączać pod każdy items w aplikacji.

    OdpowiedzUsuń
  11. dzięki za szybką odpowiedź. ;-)
    nie wiem czy dobrze rozumiem …
    Mam sobie schemat bazy X (tabele, widoki itp.) W apex-sie tworze nowa aplikacje i podpinam schemat X jako „już istniejący” Utworzeni użytkownicy (w apex) maja tylko prawo do oglądania zawartości tabel schematu X – nie mogę robić insertu ani modyfikować. Czy tak utworzony schemat autoryzacji pozwoli mi na modyfikacje tabel schematu X? Wszystko jest ok. kiedy tworze dopiero tabele poprzez apex wcześniej utworzonymi userami w tej aplikacji.

    OdpowiedzUsuń
  12. Piszesz "Utworzeni użytkownicy (w apex) ..." - co masz na myśli, chodzi o to czy tych użytkowników tworzysz w systemie zarządzania apexem (http://host:port/apex) czy tworzysz ich we własnych tabelach (twoja aplikacja posiada tabelę np USERS) ??

    OdpowiedzUsuń
  13. chodzi mi o użytkowników utworzonych w systemie zarządzania apex. np użytkownik końcowy czy devoloper.

    OdpowiedzUsuń
  14. Temat trochę zboczył z torów : ) Więc postanowiliśmy że skrobniemy szybki wpis do Bloga... (Piotrek już cos pisze) za parę chwil pewnie coś się pokaże.

    OdpowiedzUsuń
  15. podczas wykonania @apexins.
    bledy:

    *
    ERROR at line 1:
    ORA-04063: package body “APEX_030200.WWV_FLOW_API” has errors
    ORA-06508: PL/SQL: could not find program unit being called:
    “APEX_030200.WWV_FLOW_API”
    ORA-06512: at line 5

    OdpowiedzUsuń
  16. Czy to jest pierwsza próba instalacji czy jakaś kolejna ?? I generalnie więcej informacji potrzebujemy żeby coś pomóc.

    OdpowiedzUsuń
  17. Oracle 11g z APEXem , potem proba aktualizacji do 3.2 nieudana, usuanalem dotychczasowego APEXA zgodnie z dokumentacja....potem proba instalacji 3.2 i ten blad...
    potem
    SQL > @?/rdbms/admin/catalog.sql
    SQL > @?/rdbms/admin/catproc.sql
    SQL > @?/rdbms/admin/utlrp.sql
    oraz
    http://www.dba-oracle.com/t_compile_pl_sql_procedures.htm
    niestety nic nie pomoglo

    OdpowiedzUsuń
  18. Podeślij proszę log z instalacji (tworzy się automatycznie) na maila: biuro /*to_usuń*/ @dbe.pl. Po za tym na jakim systemie to instalujesz, czy APEX_030200.WWV_FLOW_API w ogóle się tworzy, jeżeli tak to czy jest do niego synonim publiczny, jeżeli jest rozkompilowany to co zwraca podczas próby kompilacji.

    OdpowiedzUsuń
  19. Witam,
    zainstalowalem wszystko zgodnie z opisem i teraz nie moge sie zalogowac, tak jakby w ogole przycisk login nie dzialal. Pierwszy raz w ogole wszystko instalowalem. Najpierw zainstalowalem Oracle 10g XE i sie zalogowalem i wszystko bylo ok, a pozniej zrobilem wszystko dokladnie tak jak w opisie i sie nie moge zalogowac. Pomoze ktos?

    OdpowiedzUsuń
  20. Witam

    Może problem jest w tym, że nie masz stworzonego workspace ??

    Podaj adres z jakiego korzystasz podczas logowania się.

    Pozdrawiam
    Piotr

    OdpowiedzUsuń
  21. http://localhost:8080/apex/f?p=4550:10
    nie mam stworzonego workspace'a, wlasnie chce sie zalogowac jako admin, zeby to stworzyc... nie wiem w czym moze byc problem, bo wszystko szlo bez bledow. jakies pomysly?

    OdpowiedzUsuń
  22. Spróbuj przy pomocy:
    http://localhost:8080/apex/
    jako workspace podaj 'internal'

    Jak to nie zadziała to jest jeszcze możliwość zmiany hasła admina, zaraz znajdę tekst na ten temat :)

    Pozdrawiam
    Piotr

    OdpowiedzUsuń
  23. Znalazłem zrzut ekranu :
    http://www.techxplore.net/blog/wp-content/uploads/2007/12/apxxepwd.png

    W zasadzie chodzi o to aby odpalić plik PL/SQL apxxepwd w atrybucie podając nowe hasło.

    Pozdrawiam
    Piotr

    OdpowiedzUsuń
  24. problem jest zupelnie inny, okazuje sie ze na tym komputerze jest jakas stara baza zainstalowana do wewnetrznego systemu firmy i jak zainstalowalem teraz apexa to cos sie pod nadpisywalo, bo ani jedno ani drugie nie dziala. musze znalezc inne rozwiazanie. dzieki za pomoc, pozdrawiam

    OdpowiedzUsuń
  25. co do problemu przedstawionego przez quack87:

    --------------------------
    ERROR at line 1:
    ORA-04063: package body “APEX_030200.WWV_FLOW_API” has errors
    ORA-06508: PL/SQL: could not find program unit being called:
    “APEX_030200.WWV_FLOW_API”
    ORA-06512: at line 5,
    --------------------------

    mialem podobny problem ,w tutorialu jest napisane aby zmienic @^PREFIX.core/ na @^PREFIX.core\ ( jesli instalowales oracla na windzie.)
    Moze na Oracle 10 XE to dzialalo ,niewiem bo nie instalowalem ale jesli chodzi o 11g to nic nie ruszaj w scripcie apexins.sql ani orainst.sql , zostaw je w spokoju :), po powtornym sciagnieciu apex 3.2 bez modyfikacji po prostu zastosowalem sie do polecenia ktore podal Andrzej czyli SQL>@apexins USERS USERS TEMP /i/

    pozdrawiam
    swierzak ;)

    OdpowiedzUsuń
  26. Właśnie zrobiłem nowy wpis na temat tego błędu tak więc proszę sprawdzić czy czasem o to nie chodzi http://apex.dbe.pl/2009/08/apex030200wwvflowapi-has-errors.html

    OdpowiedzUsuń
  27. Witam;
    Mam podobny problem jak jeden z wyzej juz opisanych, a mianowicie nie moge stworzyc workspace ani tez zalogowac sie przy wpisaniu "internal" poniewaz przycisk login nie dziala, podobnie po wcisnieciu Enter nic sie nie dzieje. Caly proces instalacji oraz upgradu przeprowadzilem wg opisu z tej strony, na swiezej wirtualnej maszynie windows xp.
    Prosze o jakies wskazowki

    OdpowiedzUsuń
  28. Czy przeglądarka czasem nie blokuje cookie ??

    OdpowiedzUsuń
  29. Uzywam Firefoxa 3.0.11, ustawienia cookie standardowe: Akceptuj ciasteczka az wygasna

    OdpowiedzUsuń
  30. Juz sobie poradzilem, zle wpisywalem parametr dla skryptu @apxldimg.sql . Dzieki za zainteresowanie

    OdpowiedzUsuń
  31. Świetnie że sie udało.

    Pozdrawiam i zapraszam do cyklicznego odwiedzania naszego Bloga : )

    OdpowiedzUsuń
  32. Witam!
    Zrobilem wszystko co bylo w blogu bez bledów i jak wpisuje adres
    http://localhost:8080/apex/f?p=4550:10
    to pokazuje ze nie ma takiej strony... :(
    Co moze byc powodem tego bledu?
    Pozdrawiam

    P.S.
    Bardzo fajny opis instalacji!

    OdpowiedzUsuń
  33. Cięzko powiedzieć co może być przyczyną. Pierwsze co to proszę spróbować normalnie się zalogować poprzez adres http://localhost:8080/apex i podać w Workspace: INTERNAL Użytkownik: ADMIN i hasło zgodnie z ustawionym w skrypcie apxxepwd.sql

    OdpowiedzUsuń
  34. Prosze podac nazwe uzytkownika: sys as sysdba
    Prosze podac haslo:
    ERROR:
    ORA-12560: TNS:blad adaptera protokolu

    Dlaczego nie moge sie polaczyc?

    OdpowiedzUsuń
  35. Problem ten oznacza że jest problem z połączeniem do bazy. Powodów może być mnóstwo. Pierwsze co proponowałbym sprawdzić czy działają wszystkie niezbędne serwisy: OracleServiceXE oraz OracleXETNSListener. Jeżeli działają to należało by puścić kontrolny "oracle-owy" ping, wpisując z lini komend \>tnsping XE , jeżeli jest komunikat na końcu OK, to próbować otworzyć wszelkie firewale. Póki co myślę starczy jak to nie pomoże to proszę dalej pisać. A cha najważniejsze to proszę napisać jaką konkretnie Pan/Pani puszcza komendę (chodzi mi o pełną komendę)

    OdpowiedzUsuń
  36. Cześć,
    instalację przeprowadziłem zgodnie z opisem, brak błędów podczas instalacji. Przy próbie zalogowania z ostatniej części opisu wyskakuje błąd:
    ERR-1777: Page 60 provided no page to branch to. Please report this error to your application administrator.

    i niżej jest link Restart Application

    Nie miałem żadnego workspace'a, i to samo przy próbie logowania na INTERNAL

    OdpowiedzUsuń
  37. Nie wpisałem kompletnego przebiegu wydarzeń, po zalogowaniu się na INTERNAL, ADMIN i haslo pokazuje się plansza z komunikatem:
    The password for this account must be changed.
    są pola do wpisania aktualnego i nowego hasla i dopiero po wpisaniu i wciśnięciu:) enter pokazuje się ERR-1777

    OdpowiedzUsuń
  38. A co się dzieje przy próbie logowania tutaj: http://localhost:8080/apex/apex_admin na użytkownika ADMIN ?

    OdpowiedzUsuń
  39. to samo:
    The password for this account must be changed.

    OdpowiedzUsuń
  40. Tak więc podłączyć się SQL/Plusem na sys as sysdba a następnie ponownie uruchomić skrypt:

    @apxxepwd.sql hasło

    OdpowiedzUsuń
  41. skrypt uruchomiłem, wyskoczyło potwierdzenie zmiany hasła, zalogowałem się na http://localhost:8080/apex/apex_admin i znowu komunikat, że hasło trzeba zmienić, a po zmianie ERR-1777. Wszystko instalowałem na systemie Win7 x64. Pierwszy raz mam do czynienia z Oracle i Apex więc może jakieś typowe błędy nowicjusza wchodzą w grę?

    OdpowiedzUsuń
  42. Proponowałbym w takim razie zrobić instalację na nowo. Czyli odinstalować Oracle XE i stawiać wszystko od początku.

    OdpowiedzUsuń