Tabele w HTML i animacja JavaScript

W tym wpisie zaprezentuję możliwe zastosowanie HTML, CSS i JS do strony, w której są  odpowiednio ostylowane dwie tabele i animacja przewijania strony w JS.

Środowisko programistyczne użyte do utworzenia projektu to Visual Studio Code z rozszerzeniem “Live Server“.
Po zainstalowaniu i włączeniu wtyczki klikamy prawym przyciskiem myszy na utworzonym pliku HTML, a następnie w “open with Live Server”. Powinna nam się otworzyć domyślna przeglądarka z podglądem strony webowej.

Poniżej zdjęcia poglądowe jak to mniej więcej powinno wyglądać:

Od razu umieszczę końcowy kod ze szczegółowymi komentarzami, a następnie opiszę co po kolei tworzyłem.

<!-- plik HTML -->
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="utf-8"/>
<title>Let's go start</title>
<!-- zewnętrzny arkusz stylów-->
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<h1 class="header">
    <div class="wrapper">

        <table> <!--tabela w HTML-->
            <tr> <!-- naglowek -->
                <th colspan="4">USŁUGI INTERNETOWE</th> 
             </tr>
            <tr> <!-- naglowki-->
               <th>Nr</th> <th>HOSTING</th> <th>DOMENA_1</th> <th>DOMENA_2</th>
            </tr>
            <tr> <!-- wiersz-->
               <td>1</td> <td>100</td> <td>0</td> <td>40</td> <!-- kolumny-->
            </tr>
            <tr> 
                <td>2</td> <td>100</td> <td>40</td> <td>40</td> <!-- kolumny-->
             </tr>
             <tr> 
                <td>3</td> <td>120</td> <td>50</td> <td>50</td> <!-- kolumny-->
             </tr>
             <tr id="scroll"> <!-- utworzenie id w celu umożliwienia identyfikacji do animacji-->
                <td colspan="4">przewiń w dół</td>
             </tr>
         </table>
        
       
    </div>
    <div class="wrapper">
    <table>
        <tr>
            <th colspan="3">PODSUMOWANIE USŁUG INTERNETOWYCH<br>
                            na dzień xx.xx.xxxx</th>
        </tr>
        <tr>
            <th>HOSTING</th> <th>DOMENA_1</th> <th>DOMENA_2</th>
        </tr>
        <tr>
            <td>jest do xx.xx.xxxx</td> <td>jest do xx.xx.xxxx</td> <td>jest do xx.xx.xxxx</td>
        </tr>
        <tr>
            <td colspan="3">Dotychczasowy poniesiony koszt</td>
        </tr>
        <tr>
            <td>320</td> <td>90</td> <td>130</td>
        </tr>
        <tr>
            <td colspan="2">410</td>  <td>130</td>
        </tr>
        <tr>
            <td colspan="3">540 - łącznie zł</td>
        </tr>
    </table>
    </div>
</h1>
<!-- zewnętrzny plik javascript-->
<script src="js/script.js"></script>
</body>
</html>
/* plik CSS */
body{ /* tło strony */
    background-color: rgb(79, 173, 76);
}
.header{ /*kolor tekstu*/
    color: darkblue;
}
.wrapper{ /* najczęściej stosowana metoda wyśrodkowania elemntu
            wrapper musi być rozciągnięty na całą szerokość i wysokość okna */    
    width: 100vw;
    height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
}

table, th, tr, td { /* utworzenie obramowania */
    border: 1px solid black;
}
th, td{ /* utworzenie odpowiedniego odstępu od obramowania i wycentrowania zawartości*/
    padding: 20px;
    text-align: center;
}
//plik JS
//pobranie elementu o id 'scroll' i w momencie jego kliknięcia wywołanie funkcji scroll()
document.getElementById("scroll").onclick = function() {scroll()};


//funkcja scroll z zainicjowana na 0 zmienną i oraz wywołaniem podfunkcji move()
function scroll(){
    i = 0;   
    move();
}


function move(){
    i++; //zwiększanie o jeden zmiennej i
    window.scrollBy(0,1); //przesuwanie ekranu w pionie
    /*jeżeli i będzie mniejsza o wysokość ekranu, wykonuj co pewien czas upłynięcia funkcję move(),
    czyli inaczej mówiąc przesuwaj w dół zawartość ekranu o całą jego wysokość względem czasu*/
    if (i < screen.height) setTimeout('move()',1);
}

Najpierw utworzyłem strukturę katalogów.
Odpowiednio folder js dla plików JS, CSS dla arkuszów styli, index.html pozostał w głównym katalogu. Oraz odpowiednio w katalogu css plik style.css, a w js script.js.

Na wstępie pisania strony tworzę typowy plik html w strukturze HTML5.
Od razu dodaje zewnętrzny arkusz styli w znaczniku head. A na końcu ciała body odwołanie do zewnętrznego skryptu JavaScript.

Początkowo mam zamiar wszystko wypośrodkować więc tworzę do tego celu div-a z nazwą klasy wrapper. Potem tak jak jest napisane w pliku arkuszów styli za pomocą .wrapper odwołuje się do tego elementu oraz go wypośrodkowuje w poziomie i pionie.

Przyszedł czas na utworzenie tabel.
Słowo kluczowe/ znacznik table odpowiada za utworzenie tabeli.
tr – to wiersz
th– nagłówek
td– podział na kolumny
Najpierw tworzymy wiersz, następnie w zależności ile chcemy kolumn tyle tworzymy nagłówków. Kolumny możemy łączyć za pomocą słowa kluczowego colspan, jako argument podajemy na ile kolumn dana kolumna ma się rozszerzyć.
Kolejno tworzymy następne wiersze i kolumny.
Czas na stylizację. Dodajemy do tabeli i wszystkiego co wewnątrz obramowanie. Stosując przecinek jak pokazane w przykładzie możemy bez multiplikowania kodu użyć do kilku elementów tego samego bloku CSS. Odpowiednio następnie dodaje odstęp w tabeli od obramowania i wypośrodkowuje tekst, żeby to w miarę estetycznie wyglądało.

Kolej na drugą tabelę. Pamiętam o tym, żeby tabela była umieszczona we wrapperze, żeby zachować odpowiednie ostylowanie co do wyśrodkowania.

I teraz końcowo dodaje identyfikator scroll do ostatniego wiersza w pierwszej tabeli w celu umożliwienia odwołania się w skrypcie do wywołania funkcji scroll po kliknięciu na wiersz w tabeli.

Plik JS to prosta głównie jedna funkcja move() odpowiedzialna za przewijanie strony w dół ekranu.

Poniżej końcowy efekt:

O

Link do repo:

https://github.com/traininguniverse/simple-table

Bezpieczne hasło

Przy wymyślaniu hasła do jakiegoś serwisu czy też usługi powinniśmy stosować się do pewnych reguł. I tak między innymi:

Utworzone hasło nie powinno być hasłem słownikowym.

Nie powinniśmy w nim korzystać z danych osobowych, np. imienia, nazwiska, daty urodzenia swojej ani kogoś z bliskich.

Dobre hasło powinno mieć minimum 8 znaków, składać się z dużych liter i małych, cyfr oraz zawierać znaki specjalne.

Do każdej usługi powinniśmy używać innego hasła.

Dobrym rozwiązaniem jest korzystanie z menedżerów haseł: jedno hasło do wielu innych.
Często taki menedżer umożliwia zabezpieczenie dodatkowym plikiem, który możemy przechowywać w bezpiecznym miejscu.

Podsumowując, bezpieczne hasło zawiera:
-minimum 8 znaków
-dużą literę
-małą literę
-cyfrę
-znak specjalny

Im więcej znaków, ich kombinacji tym hasło jest trudniejsze do rozszyfrowania.

Postacie normalne w relacyjnej bazie danych

  • 1NF (pierwsza postać normalna) – dziedziny atrybutów muszą być elementarne (nierozkładalne)
  • 2NF (druga postać normalna) – musi zachodzić 1NF i każdy atrybut niebędący kluczem musi być funkcjonalnie zależny od wszystkich części klucza głównego
    ->czyli jeżeli klucz główny składa się z kilku atrybutów, każdy inny atrybut musi być zależny od kombinacji tych atrybutów
    ->inaczej mówiąc: atrybut nie będący kluczem nie może zależeć tylko od części klucza głównego
  • 3NF (trzecia postać normalna) – musi zachodzić 2NF i żaden atrybut niebędący kluczem nie może zależeć od czegoś innego niż klucz

Postacie te mają na celu pozbycie się rendudacji, wieloznaczności, anomalii i niespójności w relacyjnej bazie danych.

Zapytania i operacje w bazie danych

W skrócie opisuję poniżej, które występują:

  • DML (Data Manipulation Language):
    -INSERT
    -UPDATE
    -DELETE
  • DDL (Data Definition Language):
    -CREATE (table, database, index)
    -DROP (table, database, index)
    -ALTER (alter table add/drop/update column)
  • DCL (Data Control Language):
    -GRANT
    -REVOKE
    -DENY
  • DQL (Data Query Language)
    -SELECT

Nowy proces w terminalu i dalsza praca

Często zdarza się, że pracując w terminalu pod linux-em uruchamiając nowy proces poza terminalem chcemy wciąż mieć możliwość korzystania z linii poleceń terminala.

Jest to możliwe dzięki użyciu znaku specjalnego – ampersanda – ‘&’, na końcu komendy. Uruchamia się wtedy jakaś aplikacja już w nowym procesie i można dalej korzystać z terminala.

Przykład:
Komendą ‘ps’ wyświetlamy uruchomione procesy:

Załóżmy teraz, że chcemy otworzyć dowolny edytor tekstowy i dalej pracować w dotychczas otwartym oknie. Domyślnie nie jest to możliwe:

Jednak, gdy użyjemy znaku ampersanda:

Możemy wówczas pracować i w nowo otwartej aplikacji niezależnie z terminalem, gdyż utworzył się oddzielny proces, co jest pokazane na obrazku powyżej.

Przeglądarka internetowa Mozilla Firefox i ciekawe dodatki

Wszyscy korzystamy z jakiegoś typu przeglądarki internetowej:
-Internet Explorer (Edge od Microsoftu)
Opera
-Google Chrome(Chromium)
-Mozilla Firefox

Lub innej mniej popularnej.
Otóż korzystamy i często nie zdajemy sobie sprawy, że mamy możliwość włączenia jakiejś wtyczki napisanej przez programistów dla przeglądarki lub też zmiany nużącego nas domyślnego systemowego motywu.

Opiszę tutaj dodatki do przeglądarki Mozilla Firefox, ale z pewnością do innych przeglądarek na pewno znajdziemy coś w tym samym stylu tylko jako zamiennik z jakąś inną nazwą.

Bardzo fajny może okazać się motyw animowany matrix-a (oczywiście wiąże się to z drobnym dodatkowym obciążeniem procesora, ale na pewno niewielkim).
Są to przewijające się na czarnym tle ciągi znaków.

Jest to ciekawy dodatek, ale z pewnością większość zaciekawią następujące rozszerzenia:

Dark Reader (Tryb ciemny dla wszystkich stron internetowych. Nasze oczy nie męczą się tak przy pracy w ciemności.)

Ghostery ( Bloker reklam chroniący prywatność – już dość wielokrotnych męczących Nas reklam na stronach i utrudniających przeglądanie internetu.
Dodatkowo można zastosować pomijanie polityki prywatności i ciasteczek, które wielokrotnie informują Nas o swojej obecności na każdym serwisie)

Simple Translate lub Google Translate ( Tu chyba nie trzeba wiele wyjaśniać. Są to translatory tekstu od Google w formie szybko dostępnej. Czyli zamiast za każdym razem otwierać nową zakładkę i kopiować tekst do translatora możemy skorzystać z opcji tłumaczenia całej strony lub też zaznaczonego tekstu)

Aby to oczywiście wszystko ustawić wchodzimy do menu aplikacji (te trzy poziome kreski w prawym górnym rogu przeglądarki) i klikamy “Dodatki i motywy“( lub też skrót klawiszowy Ctrl+Shift+A)

Latex – spis treści z linkami do zawartości

Tak jak w tytule pokażę, jak utworzyć spis treści/menu składające się z głównych sekcji, podsekcji i podpodsekcji zawierające linki do zawartości tych (pod)sekcji.
Poniżej listing kodu latex-a (z komentarzami):

%typ dokumentu, rozmiar czcionki
\documentclass[11pt,a4paper]{article}

%język i kodowanie
\usepackage{polski}
\usepackage[utf8]{inputenc}

%stworzenie linków w menu (niewidocznych)
\usepackage[hidelinks]{hyperref}

%autor, dzisiejsza data i tytuł dokumentu
\author{Training Universe}
\date{\today}
\title{Spis treści z linkami do zawartości}

%początek dokumentu
\begin{document}
%wyświetlenie tytułu
\maketitle

%przejście do nowej strony
\newpage
%spis zawartości
\tableofcontents
\newpage


%sekcja 1 i jej etykieta
\section{Sekcja 1}
\label{sec:Sekcja 1}

%odpowiednio podsekcja sekcji 1
\subsection{Sekcja 1.1}
\label{subsec:Sekcja 1.1}

%podpodsekcja sekcji 1
\subsubsection{Sekcja 1.1.1}
\label{subsubsec:Sekcja 1.1.1}

%przykładowy tekst
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec commodo mauris vitae ligula mollis, vitae malesuada sem ultrices. Vivamus tristique dapibus lorem sed ultrices. Phasellus eu elit luctus, vulputate leo ut, tincidunt mauris. Sed sed tellus auctor, aliquam sem id, pulvinar lectus. Fusce fermentum nisi eu elit sagittis aliquam. Praesent et justo in mi vulputate pharetra. Nunc id massa a mauris lobortis efficitur. Quisque commodo, lacus a consectetur feugiat, orci sapien luctus turpis, ut finibus dui quam ut magna.

Maecenas efficitur, lacus eget luctus ultrices, lectus ipsum gravida mauris, vitae volutpat justo urna id urna. Sed nec ex feugiat, consequat libero in, commodo nunc. Curabitur dictum, eros sit amet scelerisque luctus, neque enim dignissim tortor, a scelerisque erat nisi sed mauris. Vestibulum efficitur aliquam mauris, sed malesuada risus aliquet sit amet. Morbi at mauris in sapien hendrerit aliquet a non ante. Mauris at fringilla dui. Etiam sollicitudin ipsum ut nisl congue, eget suscipit mi sagittis. Sed aliquet risus non justo vestibulum, eu varius lacus dapibus. Integer et pellentesque sapien.

Vestibulum id faucibus eros, vitae facilisis est. Ut ut ligula sit amet odio aliquam viverra sed vitae ex. Maecenas lobortis interdum elit, ac condimentum ipsum faucibus in. In hac habitasse platea dictumst. Nunc non enim sed tellus tincidunt suscipit vitae et nulla. Cras tincidunt erat id mi tincidunt, eu euismod orci venenatis. Etiam sit amet vulputate nunc. Nulla id lectus vitae justo finibus volutpat. Aenean consequat sapien a arcu interdum luctus.

Sed malesuada ligula ut massa elementum, sit amet consectetur mi vestibulum. Mauris fermentum laoreet dui sed iaculis. Morbi luctus libero ac sem varius ultrices. Donec interdum auctor nulla, ac bibendum enim feugiat nec. Sed id aliquam ex, et commodo lectus. Curabitur elementum, enim vel congue auctor, purus massa commodo erat, nec scelerisque risus dui vitae sapien. Nulla facilisi. Sed id felis tempor, venenatis justo nec, viverra mi. Nunc sollicitudin, lacus in pulvinar finibus, nunc ligula viverra nisl, et dictum orci felis eu nunc. Quisque sed massa sit amet purus venenatis dignissim.

Praesent ac aliquam leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam eget iaculis enim. Duis varius lectus sed eleifend fringilla. Nullam viverra est sed tristique hendrerit. Suspendisse pellentesque, enim id mattis aliquam, elit orci elementum nulla, sed interdum elit neque id felis. Integer consectetur, ex a porttitor egestas, tortor sem pharetra neque, nec efficitur turpis urna a tellus. Donec pulvinar, erat at rhoncus dictum, sem purus volutpat velit, id fermentum felis tortor eu ligula. Sed in ante nibh. Fusce eleifend dapibus lectus. Sed non enim id enim ultricies elementum. Sed convallis bibendum erat vitae vulputate.

\newpage


\subsubsection{Sekcja 1.1.2}
\label{subsubsec:Sekcja 1.1.2}

\newpage

\subsubsection{Sekcja 1.1.3}
\label{subsubsec:Sekcja 1.1.3}

\newpage

\section{Sekcja 2}
\label{sec:Sekcja 2}

\subsection{Sekcja 2.1}
\label{subsec:Sekcja 2.1}

\newpage

\subsection{Sekcja 2.2}
\label{subsec:Sekcja 2.2}

%koniec dokumentu
\end{document}

Ogółem wszystko sprowadza się do użycia paczki do linków, wyświetlenia tabeli zawartości i utworzenia odpowiednich sekcji dokumentu.

Poniżej link do wygenerowanego dokumentu w postaci pdf:
https://traininguniverse.net/wp-content/uploads/2023/07/menu-content.pdf

Aktualizacja Snap Store pod Ubuntu

Jeżeli chcemy aktualizować Snap Store pod którąś z dystrybucji Ubuntu możemy wtedy napotkać błąd, gdyż jest on w ciągłym użyciu.
Na szczęście istnieje sposób aby to obejść.


Powinniśmy otworzyć terminal i wpisać:

sudo snap refresh snap-store

Umożliwi Nam to uzyskanie ‘pid‘, czy id tego procesu.


Następnie kończymy ten proces komendą:

kill <pid>

I ponownie wykonujemy komendę:

sudo snap refresh snap-store

W ten sposób Snap Store powinien zostać zaktualizowany.

Zdalna praca i dostęp

Praca zdalna. Po co to?
Jeżeli chcesz połączyć się z jakimś innym komputerem i przejąć nad nim kontrolę dostępu (oczywiście tylko już pod uruchomioną konkretną dystrybucją systemu operacyjnego (bez restartów itp.)) w celu pomocy dla kogoś wykonania jakiejś czynności (tak działa usługa HelpDesk którą oferują poszczególne firmy informatyczne)/uzyskania tej pomocy, lub też zademonstrowania czegoś na odległość. To właśnie w takim celu służą narzędzia/programy do pracy zdalnej.

Najpopularniejszy jest obecnie TeamViewer. Podaje link:
https://www.teamviewer.com/pl/

Podam też jedną z alternatyw, czyli AnyDesk, link poniżej:
https://anydesk.com/pl

Oba są wieloplatformowe, czyli dostępne m.in. na:
-Windows
-Linux
-macOS
-ChromeOS
-Raspberry Pi
-Android
-iOS

Jeżeli chodzi o AnyDesk pod linuksem to nie ma w ustawieniach opcji wyłączenia autostartu z systemem. Z pomocą przychodzi komenda:

systemctl disable anydesk.service

Natomiast w programie TeamViewer tę opcję znajdziemy. Piszę o tym gdyż nie każdy może sobie życzyć uruchomienia aplikacji pracy zdalnej przy każdym starcie systemu.

AnyDesk umożliwia też nagrywanie, czego nie ma w TeamViewer (przypuszczam, że nagrywanie w AnyDesk jest widoczne dla obu stron).
Jeżeli natomiast chcielibyśmy zrobić to anonimowo lub też przy pomocy TeamViewer-a to przydatny jest program OBS Studio. Polecam serdecznie.
Jest on dostępny na głównie znane systemy (Windows, Linux, macOS). Możemy wtedy anonimowo nagrywać kogoś, lub w innym celu.
Przydatny jest do nagrywania zawartości całego pulpitu, poszczególnych okien (obrazu i dźwięku). Przechwytuje zawartość z peryferiów, np. kamery, mikrofonu.
Jest on darmowym, o otwartym kodzie źródłowym, programem, o naprawdę sporych możliwościach, jak i bardzo intuicyjnym w obsłudze. Link do projektu:
https://obsproject.com/

Problem z zalogowaniem się na konto MySQL

Gdy nie możemy zalogować się na Nasze konto w bazie danych mysql, np. :

sudo mysql -u root -p

Powyższa komenda nie działa – logowanie jest nieskuteczne.


Polecam usunąć wszystko co zainstalowaliśmy:

sudo apt-get purge mysql-server mysql-client mysql-common mysql-server-core-8 mysql-client-core-8

sudo rm -rf /etc/mysql /var/lib/mysql

sudo apt-get autoremove

sudo apt-get autoclean

 

Zainstalować od nowa:

sudo apt-get install mysql-server mysql-client mysql-common mysql-server-core-8 mysql-client-core-8

 

Stworzyć nowego użytkownika:

CREATE USER 'your_new_username'@'your-hostname' IDENTIFIED BY 'your-password';

 

I nadać wszystkie przywileje dla utworzonego użytkownika:

GRANT ALL PRIVILEGES ON *.* to 'your_new_username'@'your-hostname' WITH GRANT OPTION;

 

Powinno teraz zadziałać logowanie:

mysql -h host -u user -p

 

 

Przydatne polecenia:

CREATE DATABASE name; #stworzenie nowej bazy danych
USE name; #wybór istniejącej bazy danych
SELECT DATABASE(); #podgląd w jakiej bazie danych aktualnie się znajdujemy