Wprowadzenie do Linuksa

Mamy świadomość, że II etap Olimpiady dla części z Was może być jednym z pierwszych kontaktów z Linuksem. Z myślą o tych osobach powstał ten krótki podręcznik, który mamy nadzieję pomoże Wam odnaleźć się w tym środowisku.

Zachęcamy do pobrania przygotowanego obrazu maszyny wirtualnej, który zawiera środowisko, które będzie dostępne podczas zawodów II stopnia: https://fox.dasie.mimuw.edu.pl/oizaw/OIJZAW.ova. Obraz ten można łatwo użyć w programie Oracle VM Virtualbox, importując ściągnięty obraz i uruchamiając go.

Przygotowaliśmy także krótki tutorial wideo, dostępny pod adresem https://www.youtube.com/watch?v=LIESFnJ_PI4, pokazujący wszystkie przydatne komendy (także opisane poniżej), dostępne w środowisku. Zapraszamy do obejrzenia go przed zawodami.

Specyfikacja środowiska dostępna jest w dokumencie Wybrane polecenia.

Uwaga. We wszystkich poniższych komendach oraz nazwach plików wielkość liter ma znaczenie!

Pisanie programów

Do pisania swojego kodu możesz wykorzystać jedno z dostępnych środowisk programistycznych takich jak Geany czy Code::Blocks. Aby uruchomić dowolne z nich wybierz z menu Programy podmenu Programowanie. Na początek polecamy użycie Geany.

Uwaga. Środowiska te mozna zainstalować także na Windowsie (bez instalowania całej maszyny wirtualnej). Geany dostępne jest do pobrania pod adresem https://www.geany.org/, natomiast Code::Blocksa można znaleźć na stronie http://www.codeblocks.org/. Do środowisk na Windowsie należy osobno zainstalować kompilator, bądź interpreter. Dla C++ można pobrać kompilator TDM-GCC (https://jmeubank.github.io/tdm-gcc/download/), natomiast dla Pythona dostępny jest interpreter z oficjalnej strony: https://www.python.org/downloads/.

Do tworzenia swoich rozwiązań możesz też wykorzystać proste edytory tekstowe takie jak Gedit czy Kate. Znajdziesz je w menu Programy, w podmenu Akcesoria.

Terminal

W środowisku Linux ważnym narzędziem jest terminal. Aby go uruchomić, z menu Programy wybierz Emulator terminala albo po prostu kliknij odpowiednią ikonkę na pasku.

Po uruchomieniu będziesz w swoim folderze domowym czyli /home/zawodnik.

  • Aby przejść do podfolderu wpisz:
cd nazwa_podfolderu
  • Aby wrócić do folderu nadrzędnego wpisz:
cd ..
  • W każdym momencie możesz sprawdzić w jakim folderze się znajdujesz:
pwd

Kompilacja dla programów w języku C++

Aby skompilować swój program, w terminalu wejdź do folderu, w którym zapisałeś swoje rozwiązanie (załóżmy, że nazwałaś/eś je nazwapliku.cpp i uruchom poniższą komendę:

make nazwapliku

albo

g++ -O3 -static -o nazwapliku nazwapliku.cpp -std=c++17

W wyniku jej działania, w folderze, w którym się znajdujesz, powstanie plik o nazwie nazwapliku.

W przypadku tej drugiej możliwości możesz rozważyć dodanie flagi kompilatora -Wall. Jej użycie spowoduje bardziej szczegółowe wypisywanie ostrzeżeń podczas kompilacji co pozwala odnaleźć wiele błędów.

Jeśli swój kod piszesz w środowisku programistycznym takim jak Geany czy Code::Blocks to do kompilacji możesz użyć wbudowanej w niego opcji (np. w Geany wystarczy wybrać z menu Zbuduj opcję Zbuduj).

Uruchamianie programów

Aby uruchomić swoje rozwiązanie uruchom terminal oraz wejdź do folderu, w którym zapisałeś swój kod. Dla osób korzystających z języka C++, jeśli tego wcześniej nie zrobiłeś, najpierw skompiluj rozwiązanie.

  • Dla skompilowanych programów w języku C++ wpisz
./nazwaprogramu

aby uruchomić swój program. Z kolei aby uruchomić program napisany w Pythonie wystarczy użyć:

python3 nazwaprogramu.py

Aby zakończyć uruchomienie programu, wcisnij ctrl+c.

  • Aby uruchomić swój program oraz przekierować zawartość pliku plik_testowy.in na standardowe wejście użyj:
./nazwaprogramu < plik_testowy.in

lub

python3 nazwaprogramu.py < plik_testowy.in
  • Aby uruchomić swój program, przekierować zawartość pliku plik_testowy.in na standardowe wejście oraz wynik działania programu zapisać do pliku wynik.out użyj:
./nazwaprogramu < plik_testowy.in > wynik.out

bądź

python3 nazwaprogramu.py < plik_testowy.in > wynik.out
  • Aby uruchomić swój program w wirtualnym środowisku emulującym działanie procesora (w podobnym środowisku Jury będzie oceniać rozwiązania) i zmierzyć czas jego wykonania, użyj następującego polecenia:
oiejq ./nazwaprogramu < plik_testowy.in > wynik.out

albo

oiejq /usr/bin/python3 nazwaprogramu.py < plik_testowy.in > wynik.out

Zwróć uwagę, że w tej ostatniej komendzie wymagana jest pełna ścieżka do Pythona.

Testowanie

Aby przetestować swój program na testach przykładowych możesz użyć skryptu ./ocen. W tym celu:

  • zapisz swoje rozwiązanie w folderze /home/zawodnik/rozw z nazwą odpowiadającą trzyliterowemu kodowi zadania i rozszerzeniem odpowiadającym językowi, w którym piszesz
  • w terminalu wejdź do ww. folderu
  • uruchom komendę
./ocen zadanie

używając trzyliterowego kodu zadania (pisanego małymi literami!). Na przykład dla zadania Serca (ser), plik z rozwiązaniem powinien znajdować się w pliku ser.cpp lub ser.py, a następnie należy wpisać:

./ocen ser

Komenda ta kompiluje i uruchamia rozwiązanie wybranego zadania na testach przykładowych.

Wysyłanie rozwiązań

Poza wysyłaniem rozwiązań przez przeglądarkę, możesz także użyć skryptu submit. Jeżeli Twoje zadanie jest zapisane jako abc.cpp, bądź abc.py, gdzie abc jest trzyliterowym kodem zadania podanym w treści zadania, wystarczy, że wpiszesz:

submit abc.cpp

bądź

submit abc.py

Możesz także wysłać zadanie nazwane inaczej, ale musisz wcześniej podać trzyliterowy kod zadania, na przykład:

submit abc mojkod.cpp

albo

submit abc mojkod.py

Wyśle odpowiednio mojkod.cpp bądź mojkod.py do zadania abc.

Skrypt submit działa także w przypadku awarii sieci; wówczas rozwiązanie zostaje automatycznie dostarczone do SIO, gdy komputer odzyska łączność z siecią. W szczególności polecamy używać skryptu submit pod koniec zawodów, kiedy strona WWW może mieć opóźnienia spowodowane dużym obciążeniem.