Jest wiele sposobów na zaszyfrowanie folderów w Ubuntu. Jednak nie każdy jest prosty i w miarę intuicyjny. Korzystając z domyślnego od Nautilusa (menadżera plików) szyfrowany folder jest najpierw pakowany w jeden plik, np. zip, a potem dopiero szyfrowany. Aby go z powrotem otworzyć, program go odszyfrowuje i zapisany jest w tym pliku zip, który musimy dodatkowo rozpakować. Jakby na to nie spojrzeć ta metoda i inne konsolowe są dosyć czasochłonne i uciążliwe. Najlepszym sposobem jest więc zamontowanie jakiegoś folderu jako zaszyfrowany/odszyfrowany jako taki niby oddzielny dysk. Godnym polecenia jest m.in. Cryptomator.
Podaję link do oficjalnej strony: Cryptomator Dla Linuxa dostępny jest plik AppImage do ściągnięcia. Gdy mamy go już na swoim dysku, zmieniamy uprawnienia do pliku komendą:
chmod +x cryptomator-(tutaj wersja).AppImage
Uruchamiamy zaś podwójnie klikając LPM lub wpisując:
./cryptomator-(tutaj wersja).AppImage
w terminalu. Tworzymy nowy sejf – nadajemy nazwę , wybieramy lokalizację i podajemy hasło – przez Nas wymyślone i na koniec klikamy, że chcemy utworzyć sejf. Mamy zamontowany w Naszej lokalizacji nowy folderjako wirtualny dysk w systemie. Teraz wystarczy tylko umieścić interesujące Nas pliki w folderze.
Pokażę jak to dzięki pomocy jednej funkcji JavaScript – eval() i podstawowej znajomości HTML, CSS i JavaScript można zbudować kalkulator w przeglądarce internetowej.
Zamieszczam poniżej informacje na temat ciekawego zintegrowanego środowiska programistycznego powiązanego ze znaną już chyba każdemu sztuczną inteligencją AI (Artificial Intelligence). Nazwa programu – Cursor. Link do oficjalnej strony projektu: https://www.cursor.com/
I jeszcze krótkie ciekawe demo z jego możliwości:
Co ciekawe, jeżeli ktoś dotychczas korzystał z Visual Studio Code, to umożliwia on zaimportowanie z niego wtyczek, zależności/ ustawień.
Pokażę jak można stworzyć prosty formularz kontaktowy na naszej stronie domowej obsługujący SMTP Google Gmaila, PHPMailer bazujący na hostingu lub początkowo na własnym serwerze Apache z obsługą PHP. Czyli, formularz kontaktowy, który stworzymy będzie przy pomocy PHPMailer-a wysyłał nam na konto Google Gmail dane z tego formularza w postaci nowych emaili.
Zanim opiszę kolejne kroki wykonania, krótka finalna prezentacja.
Oraz wygląd wysłanej wiadomości:
To już wiemy czego możemy oczekiwać, a teraz środowisko w którym będziemy pracować. Wszystko będzie postawione na serwerze Apache z PHP. Skorzystać można z gotowego zestawu XAMPP lub też samemu oddzielnie postawić serwer z PHP.
Dobrze, teraz tworzymy jakiś katalog w folderze publicznym www, a wewnątrz plik index.html, css, js oraz konfigurujemy w utworzonym pliku html formularz kontaktowy. Tu z polami: name, email, message. Można dodawać inne lub też dowolnie konfigurować. Załączam plik webowy:
Teraz tworzymy poprzez konto Gmail nowy Google Cloud Project. I tak: stan publikacji – ustawiamy na wersję produkcyjną Musimy pamiętać, żeby zaznaczyć dane logowania OAuth 2.0 jako Web application URI przekierowania powinny być następujące: -http://localhost/callback.php -http://127.0.0.1/callback.php Otrzymujemy w wyniku procesu utworzenia projektu: -identyfikator klienta -tajny klucz klienta -stan powinien być włączony
Powinniśmy również zainstalować:
composer require phpmailer/phpmailer
composer require google/apiclient
W celu otrzymania refresh-tokenu wywołujemy plik get_refresh_token.php:
php get_refresh_token.php
Niezbędne będzie utworzenie następujących dwóch plików php:
// get_refresh_token.php
<?php
require 'vendor/autoload.php';
$client = new Google_Client();
$client->setClientId('tu wstawiamy id klienta z cloud projektu');
$client->setClientSecret('tutaj wstawiamy tajny klucz klienta');
$client->setRedirectUri('http://localhost/callback.php');
$client->addScope('https://mail.google.com/');
$client->setAccessType('offline');
$client->setPrompt('consent');
// Generate the URL for the consent screen
$authUrl = $client->createAuthUrl();
echo "Please visit this URL to authorize the application: " . $authUrl . "\n";
// After authorization, Google will redirect to your callback URL with a code
// You need to exchange this code for tokens
echo "Enter the code you received: ";
$authCode = trim(fgets(STDIN));
// Exchange the auth code for tokens
$token = $client->fetchAccessTokenWithAuthCode($authCode);
if (isset($token['refresh_token'])) {
echo "Refresh Token: " . $token['refresh_token'] . "\n";
} else {
echo "No refresh token received. Make sure you've set access type to offline and prompted for consent.\n";
}
?>
Oraz:
// callback.php
<?php
require 'vendor/autoload.php';
$client = new Google_Client();
$client->setClientId('nasz identyfikator klienta');
$client->setClientSecret('tajny klucz klienta');
$client->setRedirectUri('http://localhost/callback.php');
if (isset($_GET['code'])) {
$token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
$client->setAccessToken($token);
// Check if we have a refresh token
if (isset($token['refresh_token'])) {
$refresh_token = $token['refresh_token'];
echo "Refresh Token: " . $refresh_token;
// Here you would typically save this refresh token securely for future use
} else {
echo "No refresh token received.";
}
} else {
echo "No authorization code received.";
}
?>
Będzie nam jeszcze potrzebny refresh_token. A to oto sposób na jego uzyskanie:
php get_refresh_token.php
Wszystkie pliki powinny znajdować się w tej samej lokalizacji.
Teraz możemy zająć się tworzeniem głównego pliku PHP – > contact.php odpowiedzialnego za korzystanie z providera Google, PHPMailera i wysyłanie emaila na nasze konto pocztowe.
Poniżej plik contact.php:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once 'vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\OAuth;
use League\OAuth2\Client\Provider\Google;
// Stała konfiguracja
$config = [
'client_id' => 'tu umieszczamy nasze id klienta',
'client_secret' => 'tajny klucz klienta',
'refresh_token' => 'utworzony przez nas refresh_token',
'gmail_address' => 'nasza nazwa konta gmail'
];
// Sprawdź, czy dane formularza zostały przesłane
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Pobierz dane z formularza
$sender_name = $_POST['name'] ?? '';
$sender_email = $_POST['email'] ?? '';
$message = $_POST['message'] ?? '';
$mail = new PHPMailer(true);
try {
// Konfiguracja OAuth2
$provider = new Google([
'clientId' => $config['client_id'],
'clientSecret' => $config['client_secret'],
]);
// Wyłącz wyświetlanie logów SMTP
$mail->SMTPDebug = SMTP::DEBUG_OFF;
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->Port = 587;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->SMTPAuth = true;
$mail->AuthType = 'XOAUTH2';
$mail->setOAuth(
new OAuth([
'provider' => $provider,
'clientId' => $config['client_id'],
'clientSecret' => $config['client_secret'],
'refreshToken' => $config['refresh_token'],
'userName' => $config['gmail_address'],
])
);
// Konfiguracja wiadomości
$mail->setFrom($config['gmail_address'], 'Contact form');
$mail->addAddress($config['gmail_address'], 'Your name');
$mail->Subject = "New message from $sender_name";
$mail->Body = "You received a new message from:\n\n";
$mail->Body .= "Name: $sender_name\n";
$mail->Body .= "Email: $sender_email\n\n";
$mail->Body .= "Message:\n$message";
$mail->send();
echo '<p style="color: green;">Your message has been sent successfully. Thank you for contacting us!</p>';
} catch (Exception $e) {
echo '<p style="color: red;">An error occurred while sending the message. Please try again later.</p>';
error_log("Sending email failed: " . $mail->ErrorInfo . "\n" . $e->getMessage());
}
} else {
// Wyświetl formularz, jeśli nie został jeszcze przesłany
include 'form.html';
}
?>
I na tym kończąc powinniśmy mieć rezultat jak pokazany na samym początku tego posta.
Instalacja środowiska programistycznego np. ‘Visual Studio Code‘.
Instalacja Node.js.
Weryfikacja instalacji:
node -v
npm -v
Tworzenie projektu React JS:
npx create-react-app todoapp
cd todoapp
code .
npm start
Tworzenie projektu Firebase.
Tworzenie bazy danych dla aplikacji: a)klikamy ‘Firestore database‘ b)następnie: ‘Start in test mode‘ c) nadanie nazwy dla kolekcji d) dodanie jakichś przykładowych danych
Integracja Firebase z projektem React
npm install firebase
Stworzenie pliku konfiguracyjnego ‘firebase.js‘ w katalogu źródłowym. Tutaj dodajemy konfigurację z Firebase do połączenia: a) klikamy w ikonkę Web ” b) nadanie nazwy dla naszej aplikacji c) rejestracja aplikacji d) skopiowanie ‘firabaseConfig‘
Zainstalować wtyczkę Visual Studio Extension: ‘Prettier-Code formatter‘ do sformatowania kodu żeby bardziej przejrzyście wyglądał skrót: ‘Ctrl + Shift + I’ do użycia po włączeniu wtyczki
Instalacja rozszerzenia ‘Print‘, jeżeli chcemy wydrukować kod źródłowy.
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 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ą klasywrapper. 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.
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.
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.