Proste poziome menu nawigacyjne z pionowym rozwijanym w HTML i CSS

Przedstawię mniej więcej jak utworzyć menu i podmenu, które powinno wyglądać tak jak poniżej:

Menu

 

 

 

 



Składać się będą na to dwa pliki “index.html” i “style.css”.
Dokładniejszy opis wykonania będzie umieszczony w plikach źródłowych.

<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Menu</title>
<!--zewnętrzny arkusz stylów-->
<link rel="stylesheet" href="styles/style.css">
</head>
<body>
<header>
<nav>
<ul>
<li><a href="#home">Home</a></li>
<li class="dropdown">
<!--to bedzie rozwijana do dołu lista-->
<a href="javascript:void(0)" class="dropbtn">News</a>
<!--po wybraniu nic sie nie dzieje-->
<div class="dropdown-content">
<!--zagnieżdżona lista rozwijana w dół-->
<a href="#news1">News 1</a>
<a href="#news2">News 2</a>
<a href="#news3">News 3</a>
</div>
</li>
<li><a href="#contact">Contact</a></li>

</ul>
</nav>
</header>
</body>
</html>

 

 

 

/*jako że są to kaskadowe arkusze stylów, to kolejno od góry do dołu są dokonywane kolejne zmiany i też jak zajdzie potrzeba nadpisywane*/
ul {
    list-style-type: none; /*wyłączenie punktowania elementów listy*/
    margin: 0; /*zerowy margines naokoło listy*/
    padding: 0; /*otoczenie wewnętrzne*/
    overflow: hidden; /*ukrycie nadmiarowego rozmiaru listy*/
    background-color: #333;
}

li {
    float: left; /*ustawienie elementów listy tak by "pływały" w lewym kierunku*/
}

li a, .dropbtn {/*znak spacji w css oznacza następujące (niekoniecznie kolejno) po sobie elementy, natomiast przecinek oznacza tylko, że ".dropbtn" jest kolejnym elementem do takiego samego ostylowania*/
    display: block; /*wyświetlanie jako bloku*/
    color: white;
    text-align: center;
    padding: 14px 16px;
    text-decoration: none; /*wyłączenie podkreślenia w linkach*/
}

li a:hover, .dropdown:hover .dropbtn {/*":hover", czyli co będzie się działo po najechaniu na podstawowe menu*/
    background-color: #04AA6D;
}
li.dropdown {
    display: block;
}
.dropdown-content {
    display: none; /*pierwotne ukrycie menu rozwijanego w dół*/
    position: absolute; /*tak jakby usunięte jest zajmowane miejsce w dokumencie zajmowane przez element i ustawione do najbliższego pozycyjnego przodka;*/
    background-color: #333;
    min-width: 160px;
    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
    z-index: 1; /*określenie pozycji w dokumencie (że menu będzie widoczne nad elementami ciała dokumentu*/
}

.dropdown-content a:hover {
    background-color: #04AA6D; /*kolor po najechaniu na element rozwijany w dół*/
}

.dropdown:hover .dropdown-content {
    display: block;
}

Typy wejściowe w formularzu w HTML

<input type="text">
<input type="password">

Radio:

<input type="radio" id="html" name="fav_language" value="HTML"><label for="html">HTML</label>
<input type="radio" id="css" name="fav_language" value="CSS" checked="checked"><label for="css">CSS</label>
<input type="radio" id="javascript" name="fav_language" value="JavaScript"><label for="javascript">JavaScript</label>

Checkbox:

<input type="checkbox" name="vehicle1" value="Bike">
<label for="vehicle1"> I have a bike</label>
<input type="checkbox" name="vehicle2" value="Car">
<label for="vehicle2"> I have a car</label>
<input type="checkbox" name="vehicle3" value="Boat" checked>
<label for="vehicle3"> I have a boat</label>

 

 

<input type="button" value="button">
<input type="email">
<input type="file">
<input type="hidden">
<input type="image" id="image" alt="Login"
src="/login-button.png">
<input type="number">
<input type="range">
<input type="search">
<input type="tel" pattern="[0-9]{3}-[0-9]{3}-[0-9]{3}" required>
<input type="time">
<input type="date">
<input type="datetime-local">
<input type="url" placeholder="https://example.com" pattern="https://.*" size="30" required>
<input type="submit">
<input type="reset">
<input type="color">



 

 

 

 





Oczywiście gdzie nie podano, należy odpowiednio dodać atrybuty “name” i “id”, w celu ich identyfikacji i możliwości użycia w formularzu.

Skrót do ulubionych aplikacji w pasku menu pod Ubuntu

Zainstalowane aplikacje za pomocą Centrum oprogramowania Ubuntu można łatwo dodać poprzez otwarcie Podglądu i wyszukanie odpowiedniej aplikacji lub poprzez wyświetlenie programów, kliknięcie na odpowiednią ikonę aplikacji PPM(prawym przyciskiem myszki) i wybranie dodania do Ulubionych.

Sprawa ma się trochę inaczej, gdy aplikację zainstalowaliśmy ręcznie poprzez komendę apt-get install lub ściągając odpowiedni pakiet zewnętrznie.
W takim przypadku, tworzymy odpowiedni plik skrótowy do aplikacji.
Przykładowy kod w skrócie z rozszerzeniem plik.desktop może wyglądać, m.in. następująco:

#!/usr/bin/env xdg-open

[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Exec=/path/to/application
Name=App name
Comment=Some comment
Icon=/path/to/icon

Nie zapominajmy o dodaniu praw dostępu do uruchamiania, chmod +x app.desktop. I gdy tworzymy plik na pulpicie systemowym możemy zezwolić na uruchamianie, poprzez co, mamy od razu skrót do aplikacji dostępny również na pulpicie.
Po zakończonej edycji pliku kopiujemy go do lokalizacji /usr/share/applications.
Oczywiście potrzebujemy do przekopiowania praw root-a.
Możemy wówczas otworzyć powyższą lokalizację w terminalu i wpisać odpowiednią komendę: sudo cp /home/user-name/Pulpit/app-name.desktop ./.

W ten sposób mamy dodany skrót do widocznych aplikacji w menu.
Teraz wystarczy wyświetlić lub wyszukać program kliknąć PPM i wybrać dodanie do ulubionych, a ikona aplikacji pojawi się w pasku menu. (pamiętajmy zawsze, że linux rozpoznaje wielkość liter, co ma duże znaczenie, bo możemy nie znaleźć naszego skrótu aplikacji).

Ubuntu 20.04 i instalacja RStudio

W nowszych dystrybucjach linux-a może istnieć problem zainstalowania RStudio, które nie jest jeszcze na chwilę obecną wydane pod to konkretne wydanie Ubuntu (problem z zależnościami bibliotek).

Rozwiązanie problemu:
Uruchomić w terminalu komendę:

sudo aptitude install clang

Następnie otrzymamy mniej więcej coś takiego:

Następujące NOWE pakiety zostaną zainstalowane:   
  clang clang-10{a} lib32gcc-s1{a} lib32stdc++6{a} libc6-i386{ab} libclang-common-10-dev{a} libclang-cpp10{a} 
  libobjc-9-dev{a} libobjc4{a} libomp-10-dev{a} libomp5-10{a} libpfm4{a} libz3-4{a} libz3-dev{a} llvm-10{a} llvm-10-dev{a} 
  llvm-10-runtime{a} llvm-10-tools{a} 
0 pakietów aktualizowanych, 18 instalowanych, 0 do usunięcia i 0 nieaktualizowanych.
Do pobrania 57,8 MB archiwów. Zajęte po rozpakowaniu: 377 MB.
Następujące pakiety mają niespełnione zależności:
 libc6-i386 : Wymaga: libc6 (= 2.31-0ubuntu9.2) but 2.31-0ubuntu9.3 is installed
Następujące działania rozwiążą problemy z zależnościami:

     Zatrzymanie bieżących wersji następujących pakietów:
1)     clang [niezainstalowany]                          
2)     clang-10 [niezainstalowany]                       
3)     lib32gcc-s1 [niezainstalowany]                    
4)     lib32stdc++6 [niezainstalowany]                   
5)     libc6-i386 [niezainstalowany]                     
6)     libclang-common-10-dev [niezainstalowany]         



Zaakceptować rozwiązanie? [Y/n/q/?] n

Wybieramy “n”, że się nie zgadzamy.
Następnie, gdy pojawi się:

Następujące działania rozwiążą problemy z zależnościami:

     Usunięcie następujących pakietów:                                      
1)     libc-dev-bin [2.31-0ubuntu9.3 (now)]                                 

     Instalacja następujących pakietów:                                     
2)     libc-dev-bin:i386 [2.31-0ubuntu9.2 (focal-updates)]                  

     Cofnięcie następujących pakietów do wcześniejszych wersji:             
3)     libc6 [2.31-0ubuntu9.3 (now) -> 2.31-0ubuntu9.2 (focal-updates)]     
4)     libc6:i386 [2.31-0ubuntu9.3 (now) -> 2.31-0ubuntu9.2 (focal-updates)]
5)     libc6-dbg [2.31-0ubuntu9.3 (now) -> 2.31-0ubuntu9.2 (focal-updates)] 
6)     libc6-dev [2.31-0ubuntu9.3 (now) -> 2.31-0ubuntu9.2 (focal-updates)] 



Zaakceptować rozwiązanie? [Y/n/q/?] Y

Akceptujemy wyświetlone rozwiązanie poprzez “Y”. W następnym kroku też kontynuujemy i powinna zacząć się wybrana konfiguracja.
Po zakończeniu instalujemy RStudio komendą:

sudo gdebi rstudio-[downloaded_version].deb

Java | dostęp do klas

Ćwiczenie.
Napisz klasę ConnectionManager, która będzie zarządzać tablicą obiektów Connection (tablica ma mieć stałą liczbę elementów). Programista-klient nie ma mieć możliwości jawnego tworzenia obiektów klasy Connection, polegając jedynie na statycznej metodzie z klasy ConnectionManager. Kiedy klasie ConnectionManager skończą się obiekty Connection, metoda ta powinna zwracać referencję pustą. Prztestuj działanie klas w metodzie main().

Rozwiązanie:

package net.traininguniverse.access;

class Connection {

    private Connection() {
    }

    public static Connection makeConnection() {
        return new Connection();
    }
}

public class ConnectionManager {

    static int count = 0;
    static final int size = 2;

    static Connection makeConnection() {
        count++;
        if (count <= size)
            return Connection.makeConnection();
        else
            return null;
    }

    public static void main(String[] args) {
        Connection[] connections = new Connection[size];

        connections[0] = makeConnection();
        connections[1] = makeConnection();
        System.out.println(connections[1]);
        System.out.println(makeConnection());
    }
}

Java | pola chronione

Ćwiczenie:
Utwórz klasę z polami chronionymi i drugą (w tym samym pliku), która posiada metodę manipulującą danymi chronionymi z pierwszej klasy.

 

Rozwiązanie:

package net.traininguniverse.main;

class Animal{
    protected String name;
    protected int age;
}

public class Main {

    void setName(Animal animal, String name){
        animal.name = name;
    }
    String getName(Animal animal){
        return animal.name;
    }
    void setAge(Animal animal, int age){
        animal.age = age;
    }
    int getAge(Animal animal){
        return animal.age;
    }

    public static void main(String[] args){
        Animal animal = new Animal();
        Main main = new Main();

        main.setName(animal,"Reksio");
        main.setAge(animal,5);

        String name = main.getName(animal);
        int age = main.getAge(animal);

        System.out.println("Zwierzak nazywa się: " + name + " oraz ma " + age + " lat");

    }
}

Uwaga!
Tylko jedna klasa może być publiczna, inaczej kompilator wyrzuci błąd, że muszą być w oddzielnych plikach.

Java | dostęp do metod chronionych

Ćwiczenie.
Wykaż, że metody chronione podlegają dostępowi pakietowemu, ale nie są metodami publicznymi.

Rozwiązanie:
Tworzymy dwie klasy: Animal i Owner w dwóch oddzielnych pakietach.
Odpowiednie klasy są dostępne poniżej:

Animal.java:

package net.traininguniverse.hiddden;

public class Animal {

    protected boolean isHungry(boolean feed) {
        if (feed)
            return false;
        else
            return true;
    }

    public boolean showIsHungry(boolean feed) {
        return isHungry(feed);
    }
}

 

 

Owner.java:

package net.traininguniverse.main;

import net.traininguniverse.hiddden.Animal;


public class Owner {

    public static void main(String[] args) {

        Animal animal = new Animal();
        //animal.isHungry(true);
        //blad kompilatora (protected access), wiec nie jest publiczna
        System.out.println(animal.showIsHungry(true));
        //wyswietla false, czyli podlega dostepowi pakietowemu
    }
}

 

Java i własna biblioteka narzędziowa

Środowisko:
-Java 11
-IntelliJ IDEA 2021.2.1
-Linux

Pokażę pokrótce jak można w powyższym środowisku stworzyć własne biblioteki pomocnicze oraz je potem wykorzystać.
Ma to na celu zredukowanie lub wyeliminowanie powtarzania kodu (można też w ten sposób korzystać z czyichś gotowych bibliotek w swoim kodzie).

Kolejne kroki:
1. Tworzę nowy projekt z biblioteką, którą chcę wykorzystać, np. w innym projekcie.
2. Eksportuję napisaną bibliotekę do jar-a.
3. Tworzę nowy projekt, w którym wykorzystam posiadaną już bibliotekę.
4. Importuję jar-a do nowego projektu.

Poniżej krótki film instruktażowy:

GitHub – personal access token

Zazwyczaj do operacji związanej z repozytoriami na Githubie korzystało się z nazwy użytkownika i hasła.
Teraz zamiast hasła powinno używać się osobistego tokenu dostępowego.
Ma to na celu m.in. poprawę bezpieczeństwa.
Do określonego tokenu przydzielane są wybrane określone przez użytkownika uprawnienia.
Natomiast po roku nie używania tokenu zostaje on automatycznie usunięty.

 

Poniżej link do strony, jak utworzyć nowy token:
https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token

 

Warto już teraz dokonać zmiany, ponieważ niebawem uwierzytelnianie za pomocą hasła wygaśnie i nie będzie możliwe.