Trochę linuksa w windowsie

To kolejny wpis – po troszkę dłuższej przerwie niż zakładałem… Dziś taki trochę bardziej technicznie i z wieloma obrazkami. Chciałbym, aby ten wpis stał się takim punktem wyjścia dla osób, które chciałyby zacząć przygodę z programowaniem, ale się trochę boją. Dziś zestawimy sobie środowisko do programowania w Javie. A już wkrótce pojawią się kolejne lekcje programowania w Javie – obiecuję!

Linux

Najpierw kilka słów wyjaśnienia. Jestem wielkim fanem Linuksa. Swoją przygodę rozpocząłem jeszcze w liceum od darmowej płytki z Ubuntu, którą za darmo zamówiłem do domu (jestem pewien, że jeszcze gdzieś leżą te płytki u moich Rodziców). To było koło roku 2007. Na Wikipedii znalazłem zdjęcie takiej płyty:

Przeszedłem przez kilka różnych dystrybucji. Pamiętam, że przez mój komputer przewinęły się Fedora i Mandriva. Jakoś jednak polubiłem się z Ubuntu, najbardziej ze środowiskiem Gnome. Oczywiście trochę prawdy było w starej prawdzie, że Ubuntu w staro-afrykańskim języku oznacza „nie umiem zainstalować Debiana”. (nie potrafiłem poradzić sobie ze sterownikami do mojej karty graficznej…) Oczywiście nigdy nie zrezygnowałem na dobre z Windowsa… Gdy w którejś późniejszej wersji Ubuntu domyślnym środowiskiem graficznym stało się Unity, to rozstałem się z tym systemem. Później próbowałem Kali, ale ostatecznie związałem się na stałe z Mintem, w którym Cinnamon okazał się być podobny do starego dobrego Gnome’a.

Ale dlaczego o tym piszę? Oczywiście swój pierwszy program w C++ napisałem w windowsowym programie DevCpp

devcpp
Źródło: http://www.bloodshed.net/dev/images/main2.jpg

Ale szybko nauczyłem się, że jak programowanie w C++, to tylko pod Linuksem! Potem poszło już z górki. Na pierwszym roku moich studiów miałem krótkie zauroczenie C#, więc programowałem w Visual Studio… Ale szybko się z niego wyleczyłem. Od tamtej pory Java i Python były moimi głównymi narzędziami do pracy. Jakoś tak przyzwyczaiłem się do pracy z linuksową linią poleceń. W systemach Windowsowych też jest linia poleceń (a nawet PowerShell), ale jakoś nigdy się do niej nie przekonałem. Teraz na moim laptopie mam zainstalowanego tylko Windowsa 10, ale nie byłbym sobą gdybym nie miał namiastki Linuksa.

Brzmię teraz jak jakiś FanBoj (czy jakkolwiek się to pisze), ale naprawdę wiele akcji powiązanych z programowaniem da się szybciej wykonać wpisując kilka poleceń w terminalu niż żmudnie klikać w interfejsie graficznym użytkownika. Poza tym, w dzisiejszych czasach (w czasach chmury), dużo pracuje się na zdalnych maszynach bez graficznego interfejsu użytkownika – z dostępem tylko przez wiersz poleceń. Stąd umiejętność obsługi Linuksa jest naprawdę dużym atutem dla kogoś, kto chciałby zostać programistą Javy.

Wracając do namiastki Linuksa na systemach Windowsowych, jest kilka możliwości. Windows 10 pozwala na zainstalowanie Linuksa wewnątrz systemu. Wystarczy otworzyć aplikację Microsoft Store i wyszukać słowa Linux:

Po chwili mamy zainstalowanego Linuksa wewnątrz Windowsa. Świetna sprawa. Niestety nie jest to najlepsze możliwe rozwiązanie… Przede wszystkim, w moim odczuciu, działa bardzo powoli. Można oczywiście zainstalować sobie jakiś kontener maszyn wirtualnych (VMware, VirtualBox, itp) i na nim zainstalować w pełni funkcjonalnego Linuksa. Jest jeszcze rozwiązanie pośrednie. A może właściwie podobne do tego pierwszego. Są programy, które można zainstalować również na starszych Windowsach, a które też symulują działanie Linuksa. Kiedyś popularny był Cygwin. Wiem, że pojawiło się coś dużo nowocześniejszego, ale nie pamiętam jak to się nazywa. Ja proponuję zainstalować coś, co daje Linuksa tak trochę przy okazji. Jest to pakiet Gita. Git jest to system kontroli wersji. Git zdecydowanie zasługuje na osobny wpis (a nawet na całą serię!) Zanim zainstalujemy Gita, sugeruję zainstalować program Notepad++ (darmowy edytor plików tekstowych) Można go pobrać ze strony: https://notepad-plus-plus.org/downloads/. Proces instalacji Notepad++ jest na tyle prosty, że opuszczę zrzuty ekranu z jego instalacji.

Git SCM

Ze strony https://git-scm.com/download/win pobieramy instalator na taką wersję systemu, którą posiadamy. Instalator jest bardzo rozbudowany, więc jeżeli nie czujesz się zbyt pewnie zachęcam do wspólnej instalacji.

Na samym początku instalator zapyta nas o to, czy akceptujemy postanowienia licencji GNU GPL w wersji 2:

Jest to jedna z kilku licencji open source. Takich licencji jest kilka, ale zasadniczo wszystkie pozwalają na darmowe użytkowanie (również w celach komercyjnych) zbudowanych programów. Wszystkie (ale na różnych warunkach) pozwalają modyfikować kod źródłowy. Niektóre pozawalają zmodyfikować kod źródłowy, zbudować program i taki program sprzedawać. Nie czuję się specjalistą w tej materii. Zainteresowanych odsyłam do strony https://opensource.org/ oraz do polskiej Wikipedii: https://pl.wikipedia.org/wiki/Otwarte_oprogramowanie.

Po zaakceptowaniu zapisów licencji przechodzimy do okienka, w którym możemy wybrać katalog, w którym ma zostać zainstalowany program:

Sugeruję zostawić domyślne położenie.

Następne okienko pozwala nam wybrać, jakie dodatkowe komponenty mają zostać zainstalowane:

Warto pozostawić zaznaczone opcje domyślne. Chciałbym zwrócić Twoją uwagę na opcję Windows Explorer integration. Ta opcja jest niezwykle przydatna (przynajmniej ja tak uważam). Mam nadzieję, że już wkrótce Ty również ją docenisz.

Kolejne okno:

Pozwala nam wybrać, czy skróty do instalowanego programu mają się pojawić w Menu Start i jeżeli mają, to jak mają być widoczne. Tutaj decyzję pozostawiam Tobie.

W następnym oknie pojawia się bardzo istotne pytanie o konfigurację Gita jako takiego:

Pytanie dotyczy domyślnego edytora tekstowego używanego przez instalowane oprogramowanie. Domyślnym wyborem jest program vim. Dla doświadczonych użytkowników Linuksa jest to dość naturalny wybór. Jednak dla nowicjuszy polecam wybranie właśnie Notepad++, który sugerowałem zainstalować wcześniej. Jako argument przeciwko programowi vim, opowiem suchar informatyczny:

Jeżeli chcesz wygenerować ciąg losowych znaków, posadź nowicjusza przed komputerem z Linuksem, włącz program vim i daj za zadanie wyłączyć ten program.

Nie jest to tak trudne, jak mogłoby się wydawać. Jest to po prostu nieoczywiste. Ale o programie vim i jego możliwościach można pisać wiele ciekawych rzeczy. Wracając do tematu: sugeruję wybrać Notepad++ i przejść dalej.

 

Kolejne okienko stawia nas przed kolejnym wyborem:

W związku z tym, że nie używam linii poleceń systemu Windows (cmd.exe) nie czuję potrzeby posiadania posiadania możliwości używania gita w linii poleceń systemu Windows. A właśnie na to pozwala wybór środkowej opcji. Ostatnia opcja – w moim odczuciu – za bardzo ingeruje w system Windows. Stąd moim faworytem jest opcja pierwsza

W kolejnym oknie:

pozostawiam opcję domyślną.

Po kliknięciu przycisku Next > pokaże Ci się kolejne okno:

Ten wybór jest istotny, jeżeli programiści używający różnych systemów operacyjnych pracują nad wspólnym projektem. Opcja domyślna jest opcją bezpieczną dla użytkowników Windowsa. Dlaczego? Żeby odpowiedzieć na to pytanie, muszę popełnić pewną dygresję:

A więc w plikach tekstowych, ale takich rzeczywiście tekstowych, a nie w dokumentach Worda czy też LibreOffice’a, bardzo ważne jest zaznaczenie, gdzie kończy się linia. W systemach uniksowych (o Uniksach i Linuksach opowiem może kiedy indziej, żeby nie uciekać za bardzo od tematu) koniec linii oznacza się znakiem specjalnym \n (w kodowaniu UTF-8). Ten znak czasami się określa to LF. Ten znak oznacza przejście do nowej linii. Ale w systemach Windows jest trochę inaczej. Bo znak LF oznacza przesunięcie karetki (kursora) do kolejnej linijki, ale w pozycji tak samo oddalonej od lewej krawędzi ekranu jak w linijce powyżej. Aby wrócić do początku linijko należy dodać znak \r nazywany znakiem powrotu karetki, określany jako CR (w kodowaniu UTF-8). Tak więc znak końca linii w Windowsach to tak naprawdę dwa znaki: \r\n. Kolejność zasadniczo nie ma znaczenia.

Pierwsza opcja oznacza tyle, że będziemy pracować na plikach, w których znak nowej linii to CRLF. Ale na serwer będziemy wysyłać pliki, w których znak nowej linii to tylko LF. I to jest chyba właściwy czas na kolejną dygresję.

Programiści pracują na plikach z kodem źródłowym. To są najzwyklejsze pliki tekstowe. Bardzo często kilku programistów pracuje nad jednym programem. Więc zmieniają wspólny plik tekstowy. I każdy, kto kiedyś współpracował nad jakimś plikiem korzystając z usługi Dropbox, wie że to może być totalny koszmar. Programiści, korzystają z czegoś dużo prostszego niż taki Dropbox. Są to systemy kontroli wersji. Git jest jednym z nich. W praktyce wygląda to tak, że na jakimś serwerze jest jedna kopia pliku. Każdy programista kopiuje ją sobie lokalnie i pracuje na lokalnej kopii. Gdy stwierdza, że chce się podzielić z innymi programistami wynikami swojej pracy synchronizuje swoją lokalną kopię z kopią na serwerze. Oczywiście jest to spore uproszczenie, ale z grubsza pokazuje ideę działania systemu kontroli wersji. Wygodnie jest, jeżeli na serwerze jest ustalone kodowanie znaków końca linii, które nie jest zmieniane przy synchronizacji lokalnej kopii ze współdzieloną kopią.

W następnym oknie:

również sugeruję zostawić opcję domyślną. MinTTY jest moim zdaniem dużo wygodniejsze we współpracy niż Windowsowy program cmd.exe.

W kolejnym oknie

pojawia się pytanie o szczegóły działania programu git. W tym momencie możemy zostawić opcję domyślną. Gdy trochę lepiej poznasz system kontroli wersji git, sam zadecydujesz czy oczekujesz innego działania programu git.

Kolejne okno

pozwala wybrać, czy chcemy wspomagania w procesie logowania do serwerów (Gita, Azure’a itd). Jest to wygodne, więc zachęcam do wybrania opcji drugiej lub trzeciej. Nie znam tego nowego rozwiązania, więc z ciekawości wybiorę ostatnią z możliwych opcji.

Kolejne okno (bez obaw, jesteśmy już blisko końca)

Pozwala nam pozostawić włączone (lub wyłączyć) dwie dodatkowe opcje. Nie są one kluczowe, ale pozwolą nam lepiej poczuć prawdziwego Linuksa.

Następnie

Możemy włączyć eksperymentalne wsparcie dla pseudo-konsol. Nie korzystałem nigdy z tej opcji, ale może nam się to przydać, więc sugeruję włączyć tę funkcjonalność.

To był ostatni ekran instalatora. Teraz możemy kliknąć przycisk Install. I po chwili instalator kończy swoją pracę:

Etykieta przycisku Next > jest trochę myląca, bo nie ma już kolejnego okna. A naciśnięcie tego przycisku zamyka instalator.

Teraz możemy uruchomić aplikację Git Bash:

W Twoim wypadku okienko będzie wyglądało inaczej. Omówię teraz to, co widzimy na przykładzie mojego okna.

pawel@DESKTOP-0BB9FUV MINGW64 ~
$

Pierwsza linijka pasuje do wzorca:

<nazwa_użytkownika>@<nazwa_komputera> <nazwa_systemu> <ścieżka>

tak więc:

  • pawel – moja nazwa użytkownika
  • DESKTOP-0BB9FUV – nazwa mojego komputera
  • MINGW64- nazwa systemu
  • ~ – ścieżka

Druga linijka jest dużo prostsza:

$

Jest tam też mrugający kursor, którego nie udało mi się wkleić. Ten znak dolara bywa nazywany znakiem zachęty i sygnalizuje, że w tym miejscu zaczyna się komenda którą chcesz wykonać. No właśnie, linia poleceń służy do wykonywania komend. Za chwilę opowiem o tym trochę więcej.

Poruszanie się pomiędzy katalogami w drzewie plików i katalogów Twojego systemu operacyjnego, przy użyciu systemowego eksploratora plików jest proste. Dla ustalenia uwagi popatrz na następujący zrzut ekranu

Z naszej perspektywy najważniejsze są dwa elementy:

  • Ścieżka do aktualnie odwiedzanego katalogu (pasek na samej górze, możesz kliknąć w napis OS (C:), żeby się wyświetliła ścieżka)
  • Zawartość katalogu (zgodna z widokiem, jaki lubisz)

Możesz teraz kliknąć dwa razy lewym przyciskiem myszki w katalog, żeby do niego „wejść”, czyli zmienić swoją lokalizację w drzewie katalogów i wyświetlić jego zawartość. Możesz kliknąć dwukrotnie lewym przyciskiem na dowolny plik, żeby go otworzyć, albo program, żeby go uruchomić. Prawy przycisk myszki daje dodatkowe możliwości. Wszystkie te akcje możesz wykonać za pomocą linii poleceń. Pokażę Ci kilka najprostszych. Zacznijmy od otworzenia naszego linuksowego terminala we właściwym położeniu. Skorzystamy tutaj z integracji programu Git bash z eksploratorem plików. Kliknij w okienku pokazanym wyżej w dowolnym miejscu (byle nie na pliku czy katalogu) prawym przyciskiem myszy. Wyświetli Ci się takie (lub bardzo podobne) okienko:

Jak klikniesz w opcję Git Bash Here, to otworzy Ci się nowe okienko:

To co się powinno Ci rzucić w oczy to inna ścieżka. To oznacza, że jesteśmy teraz w lokalizacji /c. W linuksie, wszystkie ścieżki zaczynają się od znaku slasha: /. Stąd różnica względem tego, do czego jesteś przyzwyczajony. Możemy wyświetlić zawartość katalogu, w którym jesteśmy:

$ ls

ls jest programem uruchamianym w terminalu. Po wykonaniu tego polecenia zobaczysz coś podobnego do:

Kolory są tu dość istotne. Kolorem ciemnoniebieskim są zaznaczone katalogi, na szaro są zaznaczone pliki a na jasnoniebieski są pokolorowane skróty. Program ls ma wiele dodatkowych opcji uruchomienia. Na przykład opcja -l:

$ ls -l

Listuje zawartość katalogu w bardzo charakterystyczny sposób:

W tym widoku każdy element składowy katalogu pojawia się w nowej linii. Na tym ekranie widzimy kilka kolumn (idąc od lewej):

  • uprawnienia do pliku/katalogu
  • ile twardych dowiązań pokazuje na tą pozycję
  • nazwa użytkownika, który jest właścicielem tego pliku/katalogu
  • nazwa grupy, do której należy ten plik/katalog
  • rozmiar pliku (lub 0 w przypadku katalogu)
  • data ostatniej modyfikacji pliku/katalogu
  • nazwa pliku/katalogu

Opcji tego programu jest dużo więcej. Tutaj znajdziesz opis ich wszystkich.

Kolejny program linii poleceń, który się nam przyda do cd. Program ten służy do zmiany katalogu, w którym przebywamy. Na przykład

$ cd Windows

przeniesie nas do katalogu C:\Windows (albo po linuksowemu: /c/Windows). Zaobserwujemy to po ścieżce w oknie terminala. Możemy też wykonać program ls, żeby się przekonać że zobaczymy inną listę plików i katalogów niż widzieliśmy przed chwilą. Program cd akceptuje dwa różne rodzaje ścieżek:

  • względne (jak w przypadku powyżej) – czyli biorące początek w aktualnym katalogu. W naszym przypadku to oznaczało po prostu katalog bezpośrednio w katalogu, w którym przebywaliśmy
  • bezwzględne – które zaczynają się od slasha – będą działać niezależnie od tego, w którym katalogu przebywamy (w przeciwieństwie do tych względnych)

Dla programu cd są jeszcze dodatkowe nazwy specjalne:

  • . – katalog bieżący
  • .. – katalog nadrzędny
  • ~ – katalog domowy

Tak więc wykonując polecenie cd .. przejdziemy do katalogu nadrzędnego. Myślę, że tyle na początek nam wystarczy.

Java

W tym wpisie pokażę Ci jak zainstalować pakiet open-jdk. Ale zanim przejdę do tego, winny Ci jestem pewne wytłumaczenie. Java jest dystrybuowana w dwóch rodzajach pakietów:

  • JRE (Java Runtime Environment)
  • JDK (Java Development Kit)

JRE pozwala tylko na uruchomienie skompilowanej aplikacji, natomiast JDK dodatkowo pozwala na kompilację. Kompilacja w dużym skrócie polega na przetłumaczeniu kodu źródłowego aplikacji (który jest czytelny dla człowieka) na instrukcje, które będzie potrafił wykonać komputer. W związku z tym, że chcesz zostać programistą Javy, dużo przydatniejszy będzie dla Ciebie pakiet JDK. Instalacja jest bardzo prosta, ale przebiega w zupełnie innym stylu, niż to, do czego jesteś przyzwyczajony. Ze strony https://jdk.java.net/15/ pobierz paczkę ZIP z buildem dla Windowsa. Po pobraniu archiwum musisz je rozpakować. Wynik dekompresji przenieś do katalogu: C:\Program Files\Java. Najprawdopodobniej będziesz musiał stworzyć taki katalog. I właściwie to tyle, jeżeli chodzi o proces instalacji;) Jak to sprawdzić? Otwórz Git Bash w katalogu, który przeniosłeś przed chwilą:

pawel@DESKTOP-0BB9FUV MINGW64 /c/Program Files/Java/jdk-15
$ ls
bin/  conf/  include/  jmods/  legal/  lib/  release

pawel@DESKTOP-0BB9FUV MINGW64 /c/Program Files/Java/jdk-15
$

W katalogu bin jest kilka programów, które można uruchomić w linii poleceń. Te programy mają swoje opcje uruchomienia (o których porozmawiamy kiedy indziej). Możemy sprawdzić, że programy są zainstalowane, na przykład przez wykonanie komendy:

pawel@DESKTOP-0BB9FUV MINGW64 /c/Program Files/Java/jdk-15
$ bin/java -version
openjdk version "15" 2020-09-15
OpenJDK Runtime Environment (build 15+36-1562)
OpenJDK 64-Bit Server VM (build 15+36-1562, mixed mode, sharing)

bin/java jest ścieżką względną do programu (pliku wykonywalnego). Opcja -version wyświetla, której wersji Javy będziesz używał przy użyciu tego konkretnego pliku wykonywalnego. I teraz zawsze możemy uruchamiać ten program, przy użyciu pełnej ścieżki do pliku wykonywalnego. Możesz mi wierzyć, nie jest to zbyt wygodne.

Możemy sobie bardzo ułatwić życie. Wróćmy na chwilę do programu ls. Temu programowi też odpowiada odpowiedni plik wykonywalny gdzieś w komputerze, a dokładniej: /usr/bin/ls. I możemy uruchamiać program ls przez podanie pełnej ścieżki do pliku wykonywalnego. Całe szczęście nie musimy. Dlaczego? Dzięki temu, jak stworzone są systemy operacyjne. W każdym systemie operacyjnym jest zmienna środowiskowa PATH, która zawiera listę katalogów, które system operacyjny przeszukuje w poszukiwaniu plików wykonywalnych.

W dużym skrócie: możemy wpisać w konsolę java. System operacyjny odczyta wartość zmiennej PATH, zajrzy do wszystkich katalogów, które są wymienione wewnątrz tej zmiennej (i jeszcze kilku innych, ale to nie jest w tym momencie takie istotne) i poszuka w nich pliku wykonywalnego o nazwie java. W tym momencie nigdzie takiego pliku nie znajdzie.

pawel@DESKTOP-0BB9FUV MINGW64 /c/Program Files/Java/jdk-15
$ java
bash: java: command not found

Rozwiązanie tego problemu jest proste: trzeba zaktualizować zmienną środowiskową PATH. Pokażę teraz, jak to zrobić globalnie w systemie Windows 10.

Kliknij w przycisk Menu Start i zacznij pisać: Edytuj zmienne środowiskowe systemu:

Po wybraniu tej opcji pokaże Ci się okienko:

Kliknij w przycisk Zmienne środowiskowe...

I teraz możesz edytować zmienną środowiskową Path (albo dla swojego użytkownika, albo dla całego systemu):

Dodajesz Nowy wpis:

I gdy ponownie uruchomisz program Git Bash system operacyjny znajdzie komendę java:

pawel@DESKTOP-0BB9FUV MINGW64 ~
$ java -version
openjdk version "15" 2020-09-15
OpenJDK Runtime Environment (build 15+36-1562)
OpenJDK 64-Bit Server VM (build 15+36-1562, mixed mode, sharing)

Dobrą praktyką jest zrobienie dodatkowej zmiennej środowiskowej, która się nazywa JAVA_HOME:

I użycie tej zmiennej środowiskowej w wartości zmiennej PATH:

W ten sposób masz w pełni poprawnie zainstalowaną Javę na swoim komputerze.

Maven

Zdaję sobie sprawę, że wpis zrobił się już naprawdę długi, ale mam nadzieję, że jeszcze ktoś czyta w tym miejscu.

Chciałbym, żebyśmy zainstalowali sobie jeszcze jeden program. Ten program nazywa się Maven. Już wkrótce popełnię pełnoprawny wpis o tym narzędziu. W tym momencie, wystarczy, że powiemy sobie że to program, który znacząco upraszcza pracę nad rozbudowanymi programami napisanymi w Javie. W szczególności pomaga w wygodny sposób zarządzać zewnętrznymi bibliotekami, których potrzebujemy w naszym programie.

Instalacja Mavena przebiega identycznie do instalacji open-jdk:

  1. Ze strony http://maven.apache.org/download.cgi pobierz paczkę Binary zip archive.
  2. Rozpakuj zawartość paczki
  3. Skopiuj wynikowy katalog do C:\Program Files\Apache (najpierw utwórz właściwy katalog)
  4. Dodaj katalog C:\Program Files\Apache\apache-maven-3.6.3\bin do zmiennej środowiskowej PATH:
  5. Zrestartuj program Git Bash
  6. Sprawdź, czy instalacja się powiodła:
    pawel@DESKTOP-0BB9FUV MINGW64 ~
    $ mvn -v
    Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
    Maven home: C:\Program Files\Apache\apache-maven-3.6.3
    Java version: 15, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk
    -15
    Default locale: pl_PL, platform encoding: Cp1250
    OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
    

Podsumowanie

Dziękuję Ci, że wspólnie przebrnęliśmy przez instalację narzędzi, które przydadzą się nam w dalszej wspólnej przygodzie w programowaniem i nie tylko.

Bądź przygotowany, bo następne wpisy już wkrótce.

Aspirujący twórca internetowy, który zna się na programowaniu i chce się dzielić wiedzą

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Scroll to top