- Przejść do wybranego postu na Instagramie.
- Otworzyć narzędzia developerskie w przeglądarce.
- Wybrać zakładkę “Sieć”.
- Filtrować żądania poprzez “Img”.
- Jeżeli nie widać żadnych żądań odświeżyć stronę.
- Zaznaczyć żądanie zdjęcia, którego URL chcieliśmy znaleźć.
- Kliknąć prawym przyciskiem myszy na zdjęciu, którego link chciano skopiować.
- Wybrać “Kopiuj adres URL”.
- Wkleić łącze adresu do przeglądarki, aby zobaczyć, że jest to aktualny “jpeg” z linku.
- Aby pobrać kliknąć prawym przyciskiem myszy na zdjęciu i wybrać “Zapisz obraz jako…”.
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:
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.
System zarządzania pakietami nie może znaleźć publicznego klucza Heroku-cli
W celu naprawy błędu można spróbować następującej komendy:
curl https://cli-assets.heroku.com/apt/release.key | sudo apt-key add –
Po czym ponownie można wywołać polecenie:
sudo apt update
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: