Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

pl:plnxt:plnxt_wprowadzenie_explicite [2009/04/15 21:58]
kkluza poprawa linków do strony mindstorms
pl:plnxt:plnxt_wprowadzenie_explicite [2019/06/27 15:50]
Linia 1: Linia 1:
-~~SLIDESHOW~~ 
  
-====== Interfejs programistyczny PLNXT ====== 
-Piotr Hołownia <​holownia@agh.edu.pl>,​ Grzegorz J. Nalepa <​gjn@agh.edu.pl>​ 
- 
-===== Plan prezentacji ===== 
-  * Omówienie platformy LEGO Mindstorms NXT. 
-  * Przegląd istniejących rozwiązań programistycznych. 
-  * Przedstawienie PLNXT. 
-  * Porównanie ze środowiskiem LEGO (NXT-G). 
-  * Przedstawienie dalszych prac. 
-  * Krótki pokaz. 
-===== Cele prezentacji ===== 
-Przedstawienie Państwu PLNXT - zaawansowanego interfejsu programistycznego mojego autorstwa dla platformy LEGO Mindstorms: 
-  * uzupełnia istniejące rozwiązania programistyczne o programowanie deklaratywne,​ 
-  * daje możliwość rozszerzenia do wizualnego programowania regułowego. 
- 
-Omówienie pracy związanej z powstawaniem PLNXT i wykorzystywaniem LEGO Mindstorms w Laboratorium Informatyki Katedry Automatyki AGH. 
- 
-===== Platforma LEGO Mindstorms NXT ===== 
-LEGO Mindstorms to zestaw edukacyjny umożliwiający:​ 
-  * budowę robotów, 
-  * budowę układów automatyki, 
-  * komunikację z nimi przez Bluetooth i przez USB, 
-  * programowanie ich. 
- 
-===== Zestaw NXT ===== 
- 
-W skład zestawu wchodzą m.in.: 
-  * '​brick'​ - komputerowa jednostka centralna, 
-  * sensory (dotyk, dźwięk, światło, odległość),​ 
-  * serwomechanizmy,​ 
-  * klocki LEGO. 
-{{nxt_zestaw.jpg|}} 
- 
-===== Brick ===== 
-Jednostka centralna jest wyposażona w: 
-    * 32-bitowy mikrokontroler ARM7 - 256 KB FLASH, 64 KB RAM, 
-    * 8-bitowy mikrokontroler AVR - 4 Kbytes FLASH, 512 Byte RAM, 
-    * moduł komunikacji bezprzewodowej Bluetooth, 
-    * port USB (12 Mbit/s), 
-    * 4 porty wejściowe i 3 wyjściowe, 
-    * wyświetlacz LCD o rozdzielczości 100x64 pikseli, 
-    * głośnik o jakości dźwięku 8kHz. 
- 
- 
- 
-===== Rozbudowa zestawu ===== 
- 
-Zestaw Mindstorms NXT jest świetnie przygotowany do rozbudowy. Dodatkowe elementy sprzedaje zarówno LEGO jak i inne firmy. Oto niektóre, z nich: 
-  * kompas, 
-  * akcelerometr,​ 
-  * czujnik podczerwieni,​ 
-  * żyroskop, 
-  * kamera. 
- 
-++ Nic nie stoi na przeszkodzie,​ by konstruować własne komponenty. | Pozwalają na to dostępne [[http://​www.philohome.com/​pf/​LEGO_Power_Functions_RC.pdf|specyfikacje LEGO]]. Wiele ciekawych projektów można znaleźć na stronie http://​www.philohome.com/​. ++ 
- 
-===== Cechy i zastosowania Mindstorms NXT ===== 
- 
-Zestaw LEGO Mindstorms NXT jest kierowany do osób w wieku 10+. Wobec tego musi być prosty w obsłudze. Komponenty nie są precyzyjne.\\ 
-**NXT nie nadaje się do poważnych projektów automatyki i robotyki.** 
- 
-Ma to swoje zalety!\\ 
-//NXT// może być wykorzystywane do szybkiego prototypowania. Zestaw jest łatwo rekonfigurowalny. 
- 
-Przykład: [[http://​www.kia.prz-rzeszow.pl/​download/​TEMATY%20PRAC%20DYPLOMOWYCH%202008-2009.pdf|Propozycja pracy dyplomowej]] Katedry Informatyki i Automatyki Politechniki Rzeszowskiej ++ Sterowanie modelem linii technologicznej | Istnieje prototyp modelu linii technologicznej wykonany z Lego Mindstorms. Aktualnie sterowany jest przez inteligentne klocki Lego NXT. Należy udoskonalić linię, wykonać interfejs pozwalający na sterowanie ze sterowników PLC (np. Siemens, Fanuc), opracować nowe algorytmy sterowania (w języku drabinkowym lub innym), dokonać wizualizacji działania. ++ 
- 
-===== Przegląd rozwiązań programistycznych ===== 
- 
-Środowiska tekstowe, proceduralne:​ 
-  * [[http://​lejos.sourceforge.net|lejos/​iCommand]] - API w języku Java dla Mindstorms NXT, 
-  * [[http://​nxtpp.clustur.com/​index.php/​Main_Page|NXT++]] - interfejs w języku C + +, 
-  * [[http://​bricxcc.sourceforge.net/​nqc|NQC]] - Not Quite C, język o składni C dla platformy Mindstorms RCX, 
-  * [[http://​bricxcc.sourceforge.net/​nbc|NBC i NXC]] - NeXT Byte Codes, Not eXactly C 
- 
-Środowisko deklaratywne:​ 
-  * [[http://​www.cs.toronto.edu/​cogrobo/​Legolog|Legolog]] - opracowane dla platformy Mindstorms RCX oparte o Prolog. Oferuje jedynie API niskiego poziomu. 
- 
-===== Środowiska graficzne ===== 
-\\ 
-^ NXT-G ^ [[http://​msdn.microsoft.com/​en-us/​robotics/​default.aspx|Microsoft Robotics Studio]] ^ 
-| {{nxt-g.jpg|}} | {{robotics.jpg|}} | 
- 
-===== Motywacja do pracy ===== 
- 
-  * Potrzebujemy możliwości deklaratywnego programowania //NXT// (projekt //Legolog// przestał być rozwijany kilka lat temu). 
-  * Chcemy umożliwić regułowe projektowanie z wykorzystaniem wizualnych narzędzi XTT. 
- 
-===== Czym jest PLNXT? ===== 
-//PLNXT// to API w języku Prolog dla platformy Mindstorms NXT. 
- 
-Jest rozwijane w ramach projektu [[http://​hekate.ia.agh.edu.pl|HeKatE]]. 
- 
-Ma na celu zapewnienie regułowego rozwiązania programistycznego wysokiego poziomu. 
- 
-===== Wymagania wobec PLNXT ===== 
-  * Pokrycie wszystkich funkcji standardowych komponentów NXT. 
-  * Przenośność,​ rozwiązanie dla systemu Windows i GNU/Linux. 
-  * Ponowne wykorzystanie wybranych rozwiązań:​ 
-    * Legolog - wskazówki przy komunikacji szeregowej, 
-    * iCommand - jeden z modułów jest całkowicie na nim oparty. 
-  * Uruchamianie na komputerze PC i kontrola robota NXT przy użyciu Bluetooth/​USB. 
- 
-===== Architektura ===== 
- 
-{{architektura.jpg?​500x500|Architektura PLNXT}} 
- 
-===== Moduły komunikacyjne ===== 
-Istniejące moduły warstwy komunikacyjnej:​ 
-  * moduł komunikacji z bezpośrednim użyciem portu szeregowego i protokołu komunikacji LEGO, 
-  * rozwiązanie hybrydowe oparte na javowej bibliotece iCommand, 
-  * rozwiązanie hybrydowe oparte na socketach z wykorzystaniem biblioteki NXT++, która komunikuje się z robotem, 
-  * prosty graficzny symulator NXT, pozwalający w pewnym zakresie testować algorytmy bez użycia zestawu Mindstorms.\\ 
-W rzeczywistości wszystkie te rozwiązania (poza symulatorem) oparte są na protokole komunikacji LEGO. 
- 
-===== Cechy warstwy komunikacyjnej ===== 
-  * Nie powinna być bezpośrednio używana w projektach bazujących na PLNXT. 
-  * Jej dowolną inną implementację można stworzyć bazując na pliku wzorcowym. 
- 
-===== Predykaty warstwy komunikacyjnej ===== 
- 
-<code prolog> 
- 
-:- module(nxt_actions_dummy,​[ 
-  nxt_actions_connection_open/​0, ​    ​nxt_actions_connection_close/​0,​ 
-  nxt_actions_motor/​3, ​              ​nxt_actions_motor_sync/​5,​ 
-  nxt_actions_motor_is_moving/​1, ​    ​nxt_actions_motor_stop/​1,​ 
-  nxt_actions_motor_stop/​2, ​         nxt_actions_motor_get_speed/​2,​ 
-  nxt_actions_motor_get_rotations/​2,​ nxt_actions_motor_reset_position/​2,​ 
-  nxt_actions_touch_sensor/​2, ​       nxt_actions_sound_sensor/​2,​ 
-  nxt_actions_light_sensor/​2, ​       nxt_actions_light_sensor_LED/​2,​ 
-  nxt_actions_ultrasonic_sensor/​2, ​  ​nxt_actions_voltage/​1,​ 
-  nxt_actions_voltage_millivolt/​1, ​  ​nxt_actions_start_program/​1,​ 
-  nxt_actions_stop_program/​0, ​       nxt_actions_play_sound_file/​2,​ 
-  nxt_actions_stop_sound_playback/​0,​ nxt_actions_play_tone/​2,​ 
-  nxt_actions_get_brick_name/​1, ​     nxt_actions_set_brick_name/​1 
-]). 
-</​code>​ 
- 
-===== Komunikacja szeregowa ===== 
- 
-Moduł komunikacji szeregowej opiera się bezpośrednio na {{:​pl:​mindstorms:​dokumentacja:​appendix_1-lego_mindstorms_nxt_communication_protocol.pdf|protokole LEGO}}. 
- 
-Przykład: 
-<code prolog> 
-nxt_actions_play_tone(Frequency,​Duration) :- 
- nxt_actions_connection_type(usb),​ 
- mutex_lock(nxt_serial_device),​ 
- nxt_actions_play_tone_cmd(Frequency,​Duration),​ 
- mutex_unlock(nxt_serial_device). 
- 
-nxt_actions_play_tone_cmd(Frequency,​Duration) :- 
- nxt_actions_send_bytes(['​\x80','​\x03'​]),​ 
- nxt_actions_send_number(Frequency,​2),​ 
- nxt_actions_send_number(Duration,​2). 
-</​code>​ 
- 
-===== iCommand ===== 
- 
-Moduł iCommand wykorzystuje javową bibliotekę. Jej metody są wywoływane w Prologu przy użyciu pakietu [[http://​www.swi-prolog.org/​packages/​jpl/​|JPL]]. 
- 
-Przykład: 
-<code prolog> 
-nxt_actions_play_tone(Frequency,​Duration) :- 
- jpl_call('​icommand.nxt.Sound','​playTone',​[Frequency,​Duration],​_). 
- 
-nxt_actions_motor(Motor,​Speed,​0) :- 
- Speed > 0, 
- jpl_get('​icommand.nxt.Motor',​Motor,​MotorHandle),​ 
- jpl_call(MotorHandle,'​setSpeed',​[Speed],​_),​ 
- jpl_call(MotorHandle,'​forward',​[],​_). 
-</​code>​ 
- 
-===== Warstwa sensomotoryczna ===== 
- 
-<code prolog> 
- 
-nxt_motor(Motor,​Speed) :- 
- nonvar(Motor),​var(Speed),​ 
- nxt_actions_motor_get_speed(Motor,​Speed). 
- 
-nxt_motor(Motor,​0) :- 
- nonvar(Motor),​ 
- nxt_actions_motor_stop(Motor). 
- 
-nxt_motor(Motor,​Speed) :- 
- nonvar(Motor),​nonvar(Speed),​ 
- nxt_actions_motor(Motor,​Speed,​0). 
-</​code>​ 
- 
-===== Warstwa behawioralna ===== 
-<code prolog> 
- 
-nxt_rotate(Speed,​Degrees,​force) :- 
- nxt_robot(WC,​AL,​_,​_,​_,​_,​_,​_,​_,​_),​ 
- %Distance is pi*AL*Degrees/​360,​ 
- %Angle is Distance/​WC*360,​ 
- Angle is round(pi*AL*Degrees/​WC),​ 
- nxt_turn(Speed,​Angle,​force). 
-</​code>​ 
- 
- 
- 
-===== Obsługa wątków ===== 
-Do implementacji złożonych algorytmów sterowania NXT niezbędne jest wprowadzenie mechanizmów opóźniania akcji w czasie oraz uwarunkowanie akcji od pewnych zdarzeń. 
- 
-W module „threads” znajdują się predykaty umożliwiające tworzenie triggerów i timerów z wykorzystaniem wątków w SWI-Prolog. 
-  * Trigger uruchamia akcję pod warunkiem zajścia zdarzenia. 
-  * Timer uruchamia akcję po wyznaczonym czasie. 
- 
-===== Przykład zastosowania triggera ===== 
-<code prolog> 
- 
-start :- 
- nxt_open, 
- trigger_create(_,​check_distance,​[nxt_stop,​nxt_close]),​ 
- nxt_go(300). 
-  
-check_distance :- 
- nxt_ultrasonic(Distance,​force),​ 
- Distance < 15. 
-</​code>​ 
-Trigger będzie wyzwolony, gdy check_distance będzie prawdziwe. Wtedy zostanie wykonane zatrzymanie robota i zamknięcie połączenia. 
- 
-===== Programy sekwencyjne ===== 
-Większość predykatów ma swoją wersję z opcją '​force'​ (np. nxt_go(400,​force).),​ która wymusza natychmiastowe wykonanie polecenia. 
-Brak tej opcji sprawia, że polecenie oczekuje na wykonanie do zatrzymania robota. 
-To pozwala na pisanie sekwencyjnych programów. Przykład: ​ 
-<code prolog> 
-start :- 
- nxt_open, 
- nxt_go_cm(400,​80),​ % Jazda 80 cm do przodu z prędkością 400 stopni/​sekundę. 
- nxt_go_cm(-400,​80),​ % Jazda 80 cm do tyłu z prędkością 400 stopni/​sekundę. 
- nxt_close. 
-  
-:- start. 
-</​code>​ 
- 
-===== Laboratorium ===== 
- 
-[[pl:​mindstorms:​start|Laboratorium 215]] w budynku C-3 stanowi obszar pracy stażystów Laboratorium Informatyki. 
- 
-Aspekty organizacyjne:​ 
-  * przygotowanie zakupionych zestawów NXT, 
-  * rozmieszczenie klocków w "​specjalistycznych"​ pudełkach i oznaczenie ich, 
-  * opisanie wykonanej pracy na stronach naszej [[pl:​mindstorms:​lab:​wyposazenie|AI wiki]]. 
- 
-===== Praca ze studentami ===== 
-PLNXT zostało użyte podczas zajęć JSI ze studentami czwartego roku Automatyki i Robotyki: 
-  * 1 laboratorium zapoznawcze z Mindstorms NXT, 
-  * 2 laboratoria wykorzystujące oryginalne oprogramowanie LEGO, 
-  * 2 - dotyczące PLNXT mojego autorstwa: 
-    * [[pl:​mindstorms:​lab:​lab_plnxt_zapoznanie|zapoznawcze]],​ 
-    * [[pl:​mindstorms:​lab:​lab_plnxt_zaawansowane|zaawansowane algorytmy]]. 
- 
-===== ===== 
-Niektóre uwagi studentów zawarte w sprawozdaniach:​ 
-  * "​Naszym zdaniem PLNXT daje większe możliwości niż standardowe środowisko graficzne LEGO." 
-  * "API prologu jest zdecydowanie wygodniejszą formą tworzenia oprogramowania dla Mindstorms."​ 
-  * "​Prolog jako język programowania wprowadza zdecydowanie krótszą, a zarazem bardziej logiczną składnię, co w konsekwencji obfituje w znaczący wzrost efektywności robota."​ 
- 
-===== Efekt współpracy ze studentami ===== 
-Wykorzystanie PLNXT podczas zajęć przyniosło następujące korzyści: 
-  * konstruktywną krytykę, 
-  * pomoc przy znajdywaniu błędów, 
-  * docenienie zalet przez młodszych kolegów, prawie automatyków,​ więc fachowców, :) 
-  * nadzieję, że zostaniemy docenieni również przez koleżanki informatyczki. ;) 
- 
-===== PLNXT vs. oprogramowanie LEGO (NXT-G) ===== 
-\\ 
-^ ^ ^PLNXT ^ ^ NXT-G ^ 
-| Czytelność | | dobra | | bardzo dobra przy prostych algorytmach,​ kiepska przy skomplikowanych | 
-| Możliwość kompilacji programu i uruchamiania go bez udziału komputera | | - | | + | 
-| Możliwość kontroli NXT bez konieczność ładowania programu do pamięci | | + | | - | 
-| Łatwość programowania | | duża | | mała przy skomplikowanych projektach | 
-| Łatwość instalacji | | średnia | | duża | 
- 
-===== ===== 
-Wypowiedź jednego z użytkowników forum [[http://​messageboards.lego.com|LEGO]]:​\\ 
-"The LEGO software that comes with the nxt kit is somewhat limiting and gets hard to use once you get good at programing. In small, less complex programs nxt-g is great and easy to use. But when you get into longer, more complex programing, it is quicker to use a text based programing language."​ 
- 
-Zestaw LEGO Mindstorms NXT jest kierowany do osób w młodym wieku. To wymaga prostego, przyjemnego dla oka młodego człowieka interfejsu graficznego,​ co nie idzie w parze z funkcjonalnością. 
- 
-===== Przykład algorytmu ===== 
-**"​Sprzątacz":​**\\ 
-Robot ma za zadanie oczyścić teren w promieniu 40 cm od swojej początkowej pozycji. Jeżeli w tym obszarze znajdują się jakieś przeszkody, próbuje je wypchnąć poza niego. Po oczyszczeniu całego terenu, wraca do pozycji wyjściowej i kończy pracę. 
- 
-===== Algorytm w PLNXT ===== 
-<code prolog> 
- 
-:- consult('​../​plnxt.pl'​). 
- 
-start :- 
-    nxt_open, 
-    trigger_create(_,​ check_stop, [nxt_stop, nxt_close]),​ 
-    patrol. 
-  
-check_distance :- 
-    nxt_ultrasonic(Distance,​force),​ 
-    Distance < 40. 
-  
-patrol :- 
-    trigger_create(_,​ check_distance,​ [nxt_stop, push_out, patrol]), 
-    nxt_rotate(250,​ 360). 
- 
-check_stop :- 
-    nxt_touch(Stop,​force),​ 
-    Stop = 1. 
- 
-push_out :- 
-    nxt_go_cm(450,​ 40), 
-    nxt_go_cm(-450,​40). 
-</​code>​ 
- 
-===== Algorytm w NXT-G ===== 
-Uproszczony:​\\ 
-{{nxtg_przyklad.jpg|}} 
- 
-W NXT-G nie ma możliwości odczytu prędkości silnika! 
- 
-===== Definicja budowy robota ===== 
-W PLNXT można zdefiniować parametry robota (obwód kół, długość osi), więc możliwe jest wykonywanie pewnych manewrów.\\ 
-Np.: 
-  * obrót robota wokół własnej osi o zadany kąt, 
-  * przemieszczenie robota o zadaną odległość,​ 
-  * wykonanie skrętu z zadanym promieniem. 
- 
-===== Obrót/​przemieszczenie robota ===== 
- 
-Rozwiązanie w //​PLNXT//:​\\ 
-<code prolog> 
-nxt_rotate(+Speed,​+Angle). 
-</​code>​ 
- 
-Rozwiązanie //NXT-G//: 
-| {{nxtg_move.jpg|}} | {{nxtg_duration.jpg|}} | 
- 
-===== Promień skrętu ===== 
-W //NXT-G// nie można wykonać skrętu o zadanym promieniu. 
- 
-Rozwiązanie w //​PLNXT//:​\\ 
-<code prolog> 
-nxt_turn(+Speed,​+Angle,​+Radius). 
-</​code>​ 
- 
-Rozwiązanie //​NXT-G//:​\\ 
-| {{nxtg_move.jpg|}} | {{nxtg_steering.jpg|}} | 
- 
-===== Możliwości rozwoju ===== 
- 
-  * Warstwa behawioralna jest przystosowana jedynie do pracy z robotem Tribot i jego odmianami. Można ją rozszerzyć na inne typy, np. roboty humanoidalne. 
-  * Możliwa jest integracja z XTT - formalizmem reprezentacji wiedzy i reguł. To udostępniłoby kompletne, wizualne środowisko programowania regułowego dla Mindstorms NXT. 
-  * Integracja z telefonem OpenMoko. 
- 
-===== XTT ===== 
-Praca panów Krzysztofa Kaczora i Grzegorza J. Nalepy udostępniła narzędzie wizualnego programowania regułowego [[hekate:​hqed|HQEd]] - (Hekate Qt Editor Project) oparte o XTT (EXtended Tabular Trees). 
- 
-XTT ma trzy poziomy reprezentacji:​ 
-  * wizualny - hierarchiczna struktura tabel łączonych ze sobą, 
-  * logiczny - tabele zawierają reguł, 
-  * implementacyjny - reguły są przetwarzane przez Prolog. 
-  ​ 
- 
-===== Przykład tabel XTT ===== 
-{{hekate:​xtt-structure-therm.png?​800x320|}} 
- 
-===== XTT i PLNXT ===== 
- 
-Przetwarzanie tabel XTT przez Prolog stwarza możliwość programowania Mindstorms NXT w wizualnym środowisku HQEd. 
- 
-Użycie XTT jest głównym celem dalszych prac nad PLNXT. 
- 
-===== Kompilator prologu na platformach wbudowanych (OpenMoko) ===== 
-**Cele**: 
-  * Opracowanie środowiska umożliwiające uruchomienie kompilatora prologu na systemie wbudowanym (np. telefon z procesorem ARM). 
-  * W miarę możliwości wykorzystanie ogólnodostępnych rozwiązań,​ zgodne z przyjętymi standardami (POSIX, GNU/Linux). 
-  * Zapewnienie warunków umożliwiających działanie w czasie rzeczywistym. 
- 
-===== Platforma sprzętowa ===== 
-  * Neo Freerunner [[http://​www.openmoko.org]]. 
-  * Dostępność,​ dokumentacja,​ przystępna cena. 
-  * Spore zainteresowanie ze strony społeczności //open source//. 
-  * Co najmniej siedem różnych dystrybucji GNU/Linux możliwych do uruchomienia. 
-  * Potencjalnie interesujące rozwiązania sprzętowe (GPS, host USB, bluetooth, WiFi itd.). 
- 
-===== Neo ===== 
-{{:​student:​staze2008:​holownia:​neo_front_3.gif|Neo FreRunner}} 
- 
-===== Platforma software'​owa ===== 
-  * Baza: dystrybucja **openmoko**. 
-  * Dostępny toolchain oraz skrypty umożliwiające zbudowanie własnej dystrybucji w oparciu o openmoko. 
-  * Scheduler RT: kernel openmoko + łaty z [[http://​rt.wiki.kernel.org/​]]. 
-  * Takie rozwiązanie jest w całości zgodne z POSIX (mała konieczność ingerencji w kod źródłowy + przenaszalność). 
-  * Wybór poniekąd z konieczności (brak dobrych i ogólnodostępnych implementacji RT dla GNU/Linux). 
-  * Dostępne kompilatory prologu: SWI, Yap. 
- 
-===== Wnioski z wykonanych prac ===== 
-  * GNU/Linux + embedded zyskuje na popularności - dostępne gotowe i funkcjonalne środowiska (openmoko, OpenEmbedded,​ android, maemo...). 
-  * Wciąż małe ukierunkowanie na zastosowania z użyciem RT - konieczność ręcznej kompilacji, brak zgodności łat ze źródłami dostępnymi w dystrybucji itp. 
-  * Dzięki zgodności z POSIX i typowych rozwiązań z sytemów Unix/Linux projekt zyskuje na uniwersalności pod względem użycia platform sprzętowych (arm, x86) jak i programowych (np. GNU/Linux, *BSD, Solaris). 
- 
-===== Podsumowanie ===== 
-  * PLNXT jako nowy interfejs uzupełnia istniejące rozwiązania programistyczne o programowanie deklaratywne. 
-  * Pod wskazanymi względami jest lepsze od innych (np. NXT-G). 
-  * Daje możliwość rozszerzenia do wizualnego programowania regułowego. 
-  * Pierwsza wydana wersja PLNXT na licencji GPL jest dostępna w [[plnxt:​start|AI Wiki]]. 
- 
-===== Pokaz ===== 
-Dziękuję za uwagę! 
- 
-Zapraszam do udziału w pokazie i zadawania pytań. 
pl/plnxt/plnxt_wprowadzenie_explicite.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0