Programy konsolowe

Większość użytkowników komputerów przyzwyczaiła się do programów sterowanych za pomocą myszki. W takich programach myszka służy m.in. do uruchamiania i zamykania programów, wybierania opcji w menu głównym lub kontekstowym, obsługi pasków narzędzi, zaznaczania fragmentów tekstu – w zasadzie myszka służy do wszystkiego z wyjątkiem wprowadzania tekstu. Dlatego programy takie jak Octave, w których wszystkie polecenia wydaje się za pomocą klawiatury, u użytkowników przyzwyczajonych do „okienek” budzą zdziwienie i obawę. Po kilku próbach zrobienia czegokolwiek bez myszy w programie niewyświetlającym menu i pasków narzędzi osoby takie zwykle rezygnują i wyłączają program, by nigdy do niego nie wrócić. Błąd! Programy obsługiwane za pomocą klawiatury (tzw. programy konsolowe) stosują bowiem pewne standardowe mechanizmy mające na celu uproszczenie ich obsługi. Wystarczy zapoznać się z tymi mechanizmami, by dość pewnie obsługiwać niemal każdy współczesny program konsolowy.

Dlaczego jednak w ogóle w XXI wieku wciąż powstają programy konsolowe? Dlaczego cieszą się sporym powodzeniem? Otóż podstawowa zaleta programów konsolowych, decydująca o ich przydatności, polega na łatwości automatyzacji ich obsługi. Octave może być bowiem używany nie tylko jako program interakcyjnie komunikujący się z człowiekiem, ale także jako program automatycznie wywoływany przez inne programy bez ingerencji człowieka. Tekstowa obsługa programu umożliwia traktowanie Octave jako języka programowania, przy czym tworzenie tych programów jest banalnie proste: składają się one po prostu z ciągu komend, które równie dobrze można by osobiście wydać z konsoli tekstowej. Programy konsolowe na wejściu otrzymują strumień znaków i jako wynik swojego działania produkują inny strumień znaków. Takie programy podlegają łatwej standaryzacji swoich interfejsów i mogą stanowić bazę dla bardziej zaawansowanych, łatwiejszych w obsłudze, ale mniej elastycznych rozwiązań.

Doskonałym przykładem skuteczności powyższej filozofii jest Octave w wersji 4. Otóż program ten dystrybuowany jest w dwóch wersjach: jednej, uruchamianej z linii komend (tzw. CLI, ang. command-line interface) i drugiej, w pełni okienkowej (GUI, ang. graphical user interface). Otóż wersja okienkowa jest jedynie nakładką na wersję CLI. W gruncie rzeczy każdy mógłby napisać taką nakładkę!

octave 4.0

Octave 4.0 w wersji konsolowej (CLI)

octave-gui

Octave 4.0 w wersji z graficznym interfejsem użytkownika (GUI)

Czas na zapowiadane „sztuczki” ułatwiające pracę w konsoli tekstowej.

„Strzałka w górę” (↑) i „strzałka w dół” (↓)

Klawisze nawigacyjne (tzw. kursory) „strzałka w górę” (↑) i „strzałka w dół” (↓) to chyba najczęściej używane klawisze sterujące Octave. Służą one do przywoływania na ekranie poprzednich komend. Dzięki temu nie musimy tych samych poleceń wpisywać wielokrotnie. Wystarczy odnaleźć odpowiednie polecenie wśród poleceń wydawanych niedawno i albo zatwierdzić je od razu klawiszem <enter>, albo wpierw dokonać stosownych zmian. Oczywiście w wersji GUI można odpowiednią komendę (lub jej fragment) zaznaczyć i skopiować w tradycyjny sposób. Uwaga: mechanizm strzałek (↑, ↓) pozwala cofnąć się nawet do poleceń, których używaliśmy w poprzednich sesjach programu! Wiąże się to z używaniem przez Octave tzw. mechanizmu historii.

Historia poleceń

Polecenie history wyświetla historię komend wydawanych Octave:

> history

Polecenie to wyświetla zwykle całą listę kilkuset poleceń, jakie ostatnio wydawaliśmy Octave, łącznie z poprzednimi sesjami. Taka liczba wierszy nie mieści się w tradycyjnym okienku konsoli. Dlatego Octave wyświetla tekst partiami po 24 wiersze. Ostatni, 25. wiersz zawiera informację o tym, jak można poruszać się po wyświetlanym tekście:

-- less -- (f)orward, (b)ack, (q)uit

Napis -- less -- oznacza, że program znajduje się w trybie przeglądania zgodnym z linuksowym programem less. Klawisz f przewija tekst o jeden ekran do przodu, b – o ekran do tyłu, natomiast q powoduje powrót do trybu komend.

Tabulator, czyli autouzupełnianie

Kolejnym nieocenionym mechanizmem pomocniczym programu jest klawisz <tab>. Służy on do włączania mechanizmu automatycznego uzupełniania nazw funkcji i plików. Jak to działa? Przypuśćmy, że chcemy wywołać funkcję roots służącą do znajdowania pierwiastków wielomianów. W tym celu wystarczy napisać trzy pierwsze litery tej funkcji (roo) i przycisnąć klawisz <tab>. Octave sam uzupełni brakujące litery.

Jeżeli przed przyciśnięciem klawisza <tab> wprowadzimy zbyt mało liter i Octave nie będzie w stanie jednoznacznie określić, o które polecenie nam chodzi, program nie wykona żadnej czynności. Jeżeli w tej sytuacji ponownie przyciśniemy <tab>, program wyświetli listę wszystkich dopuszczalnych uzupełnień naszego wpisu. To bardzo użyteczny sposób „przypominania” sobie nazw poleceń.

Mechanizm automatycznego uzupełniania obejmuje nie tylko polecenia programu, ale też nazwy plików w katalogu bieżącym. Cecha ta znacznie upraszcza wprowadzanie nazw plików i praktycznie eliminuje literówki. Automatyczne uzupełnianie może też być używane podczas wpisywania argumentów poleceń, np. help.

Inne skróty klawiaturowe

Oprócz klawiszy ↑, ↓ i Tab, Octave obsługuje kilkadziesiąt (!) innych skrótów klawiaturowych ułatwiających edycję poleceń. Najważniejsze z nich to:

  • ctrl+r – ułatwia wyszukiwanie konkretnego wpisu w historii poleceń. Zamiast przeszukiwać historię poleceń klawiszami ↑ i ↓, wystarczy wcisnąć ctrl+r, po czym wpisać kilka pierwszych liter poszukiwanego polecenia. Jest to tryb tzw. przeszukiwania inkrementalnego.
  • kursor w lewo (), kursor w prawo () – przemieszczają kursor o literę w lewo lub prawo.
  • ctrl + k – wycina (ang. kills) do podręcznego bufora zawartość  bieżącego wiersza począwszy od pozycji kursora.
  • ctrl + y – kopiuje (ang. yanks) tekst z podręcznego bufora.
  • ctrl + g – porzucenie trybu inverse search.
  • esc – uniwersalny sposób na wyjście z niestandardowego trybu działania konsoli, np. inverse-search.

Polecenia help i doc

Zapamiętywanie nazw i znaczenia setek poleceń typowego programu komputerowego byłoby zajęciem wyjątkowo nużącym i bezproduktywnym. Dlatego programy posiadają wbudowane mechanizmy pomocy dla użytkownika. Programy okienkowe standardowo udostępniają ten mechanizm poprzez pozycję „Pomoc” w menu lub skrót klawiaturowy F1. Octave, jak większość programów konsolowych, udostępnia system pomocy poprzez komendę help:

>> help

Czyste polecenie help wyświetla informacje dotyczące całego programu, a konkretnie – spis wszystkich poleceń programu rozpoznawanych przez system pomocy. Zwykle jednak potrzebujemy informacji o konkretnej funkcji programu. W tym wypadku podajemy ją jako argument polecenia help. Np. aby uzyskać szczegółowe informacje o znaczeniu i wszystkich możliwościach instrukcji format, wydajemy polecenie

>> help format

Oczywiście instrukcja help wyświetla informacje jako tekst, który zwykle zajmuje więcej niż jeden ekran. Do przemieszczania się po nim służą standardowe klawisze nawigacyjne: PageDown, PageUp, Kursor w dół, Kursor w górę, Home i End

Polecenie help swoje informacje wyświetla w specjalnym trybie, tzw. trybie pomocy, w którym z ekranu znikają wszystkie informacje niezwiązane z systemem pomocy programu. Aby wrócić do normalnego trybu edycji, przyciskamy klawisz q (ang. quit).

System pomocy Octave zapewnia także bezpośredni dostęp do całego, wieluset stronicowego podręcznika. Oczywiście jest on wyświetlany w formie tekstowej. Stosowne polecenie to doc, np.

>> doc operators

wyświetla (oczywiście w trybie tekstowym!) fragment podręcznika dotyczący operatorów. W czystej konsoli polecenie doc działa w osobnym trybie, tzw. info, którego nie będę tu bliżej omawiał. Tryb info opuszczamy klawiszem q.

Internetowa (HTML) wersja podręcznika znajduje się tu.

Z kolei wersja Octave GUI udostępnia dokumentację w osobnej zakładce. Jest to jednak tylko graficzna nakładka na informacje udostępniane w trybie tekstowym.

Pliki pomocnicze

Octave posługuje się kilkoma plikami pomocniczymi:

  • .octave_hist to plik przechowujący wprowadzane przez nas komendy. Dzięki niemu mechanizm historii poleceń działa nawet po wyłączeniu i włączeniu programu.
  • .octaverc to plik wczytywany tuż po uruchomieniu programu. Można w nim umieścić własne polecenia dostosowujące konfigurację programu do naszych upodobań.

W systemie Linux pliki te znajdują się w katalogu domowym. W Windows prawdopodobnie ich lokalizację określa zmienna środowiskowa USERPROFILE.

Gdzie są moje pliki?

Pracując z programem Octave, często posługujemy się dodatkowymi plikami. Musimy jednak mieć pewność, że program potrafi je (poprawnie) zlokalizować. Do osiągnięcia tego celu służą następujące komendy:

  • pwd – wyświetla nazwę bieżącego katalogu.
  • ls – wyświetla zawartość katalogu bieżącego.
  • cd – zmienia katalog bieżący

Oto przykład ich zastosowania (w systemie Linux):

> pwd
ans = /home/zkoza
> cd octave
> pwd
ans = /home/zkoza/octave
> ls
programik.m

W powyższym przykładzie: najpierw za pomocą polecenia pwd sprawdzam, że bieżącym katalogiem programu jest /home/zkoza; następnie poleceniem cd zmieniam ten katalog na /home/zkoza/octave, sprawdzam wartość bieżącego katalogu (pwd) i wyświetlam jego zwartość (ls). W katalogu tym znajduje się tylko jeden, wcześniej umieszczony tam plik o nazwie programik.m.

Informacja dla zaawansowanych: w systemach Uniksowych polecenie ls przyjmuje praktycznie te same opcje, co analogiczne polecenie w systemach UNIX-owych, np ls -l.

W wersji okienkowej operacje na plikach ułatwia okienko File Browser.

Własne programy

Jesteśmy już gotowi zapoznać się z najbardziej użyteczną właściwością programów konsolowych – łatwością rozszerzania ich funkcjonalności za pomocą własnych plików tekstowych (tzw. skryptów). Idea jest genialna w swej prostocie: zamiast pisać polecenia bezpośrednio w programie, można je zapisywać w osobnym pliku, a potem wczytywać do programu tak, jakby pochodziły z klawiatury. Podstawowa zaleta tego rozwiązania polega na trwałości skryptów, które możemy spokojnie rozwijać przez wiele dni, a potem używać przez wiele lat. Skrypty rozwiązują więc podstawowy problem programów pisanych bezpośrednio w konsoli Octave – ich ulotność i jednorazowość.

Utworzenie własnego skryptu jest banalnie proste: jest to dowolny plik tekstowy o rozszerzeniu .m, np. programik.m. W pliku tym wpisujemy dowolne komendy Octave. Możemy opisać je za pomocą komentarzy (przypominam, że w Octave komentarzem jest tekst od znaku # do końca wiersza).

Aby wykonać polecenia w tak utworzonym pliku (czyli „uruchomić skrypt”), wystarczy jako komendę wpisać w Octave… nazwę skryptu bez rozszerzenia *.m.

Załóżmy, że skrypt nazywa się programik.m, a jego zawartość wygląda następująco:

# W pliku programik.m znajduje się trywialny program testowy Octave
1/7
2/7
3/7

Jeżeli wydamy polecenie programik:

> programik

Program odpowie następująco:

ans =  0.14286
ans =  0.28571
ans =  0.42857

co świadczy o wykonaniu wszystkich instrukcji z pliku programik.m.

Teraz możemy dowolnie modyfikować plik i uruchamiać go w Octave za pomocą klawiszy historii (↑, ↓). Prawda, że to niezwykle prosty i użyteczny mechanizm?

Oczywiście aby program mógł wczytać skrypt, plik skryptu musi znajdować się w katalogu bieżącym, który ustalamy omówionymi powyżej poleceniami pwd i cd.

Na koniec mały smaczek. Jeżeli zapytamy się Octave, co wie na temat polecenia programik:

> help programik

Otrzymamy następującą odpowiedź:

octave:6> help programik
programik is the file ./programik.m

W pliku programik.m znajduje się trywialny program testowy Octave
...

Widać więc, że w skryptach można w trywialny sposób umieszczać nie tylko kod, ale i jego dokumentację, którą stanowią komentarze umieszczone przed pierwszą instrukcją Octave.

Własne programy w wersji GUI

Octave GUI posiada osobny edytor skryptów. Trywializuje to tworzenie, otwieranie i zapisywanie skryptów oraz ustalanie katalogu bieżącego. Dodatkowo w manu w pozycji File/Recent Editor Files znajduje się lista ostatnio otwieranych bądź zapisywanych plików.

Niezwykle przydatną funkcjonalnością wersji okienkowej jest możliwość uruchamiania skryptów w trybie debugera. Rozpatrzmy następujący przykład prostego skryptu programik.m:

# wykres sin(x) w kolorze czerwonym, linią ciągłą, z plusikami co 0.1
x = 0:0.1:10;
y = sin(x);
plot(x, y, "+-r");

Aby uruchomić program edytowany w zakładce Editor, należy wcisnąć klawisz F5 lub wybrać z menu tej zakładki polecenie Save & Run bądź też kliknąć odpowiedni przycisk na pasku narzędzi tej zakładki – pierwszy z grupy przycisków opisanych na poniższym rysunku:

octave-debug-toolbar-200-explained

Pasek narzędziowy debugera Octave

Po wykonaniu tej czynności Octave po prostu uruchomi cały skrypt zapisany w edytorze, a wyniki jego działania można obejrzeć w zakładce Command Window. Aby wejść w tryb debugowania programu, należy przed jego uruchomieniem zadeklarować w edytorze co najmniej jeden punkt przerwania programu. W tym celu w wierszu, przed którym chcemy zatrzymać program, umieszczamy kursor i klikamy na pasku narzędzi czerwone kółko. Jeszcze łatwiejszy sposób polega na kliknięciu myszką na lewo od numeru odpowiedniego wiersza – por. rysunek poniżej.

octave-debug-edit-zoom

W trybie debug czerwone kółka na lewo od numeru wiersza informują o pozycji punktów przerwania, a żółty trójkąt wskazuje kolejną instrukcję do wykonania

Można ustawić dowolną liczbę punktów przerwania, jednak ich położenie nie jest zapisywane w pliku programu. Po dojściu programu do kolejnego punktu przerwania mamy kilka możliwości: uruchomić jedną instrukcję (F10), wejść do kodu funkcji zdefiniowanej w m-pliku (F11) lub kontynuować wykonanie programu aż do napotkania kolejnego punktu przerwania (F5). To, którą z tych opcji wybierzemy, zależy od struktury programu: inaczej debuguje się pętle, inaczej kod szeregowy. Debuger należy opuścić klawiszem F5 (Quit Debug Mode), co jest niedoróbką omawianej wersji debugera. W każdej chwili pracy w trybie Debug można przejść do zakładki Command Window i w znany już sposób zbadać stan dowolnych zmiennych.

Quiz

  1. Czym różnią się programy tekstowe od programów okienkowych?
  2. Co to jest historia poleceń? Gdzie jest przechowywana?
  3. Jakie skróty klawiaturowe ułatwiają pracę z historią poleceń?
  4. Co to jest autouzupełnianie? Jakie skróty klawiaturowe uaktywniają autouzupełnianie?
  5. Jak w Octave zorganizowano system pomocy?
  6. Jak opuścić tryb pomocy lub tryb info?
  7. Co to są skrypty?
  8. Jak uruchamia się skrypty?
  9. Jakie są zalety skryptów?
  10. Jak w Octave ustala się nazwę katalogu bieżącego?
  11. Do czego służy debuger?
  12. Do czego w pracy z debugerem służą punkty przerwania (breakpoints)?

Zadania

  1. W wierszu poleceń programu wprowadź trzy pierwsze litery polecenia sombrero, tj.
    >> som
    

    i przyciśnij tabulator. Zwróć uwagę na to, że program sam uzupełnił zapis polecenia.

  2. Sprawdź w systemie pomocy programu (>> help sombrero), do czego służy funkcja sombrero i jakie znaczenie ma jej (opcjonalny) argument.
  3. Wywołaj sombrero z niestandardowym argumentem, np. 30 lub 100.
  4. Przeczytaj w podręczniku Octave (>> doc sombrero), jaka jest rola polecenia sombrero? Jakie inne polecenie służy podobnemu celowi?
  5. Sprawdź, że wykresy generowane przez Octave możesz myszką obracać, przybliżać lub oddalać.
  6. [Ambitne] Za pomocą polecenia help sprawdź, w jakim pliku znajduje się definicja funkcji sombrero.
    • Przekopiuj ten plik do swojego katalogu roboczego i nadaj mu nazwę kolec.m.
    • W tym nowym pliku zmień nazwę i definicję funkcji, tak by polecenie kolec wyświetlało wykres funkcji z(x,y) = 2^{-\sqrt{x^2+ y^2}} dla -4 \le x,y \le 4.
    • Zmień komentarz w swoim pliku (np. przetłumacz jego część na polski). Sprawdź, że Twój nowy komentarz pojawi się na ekranie po wydaniu polecenia help kolec.