W największej możliwej ilości przypadków możliwa jest sytuacja, że kupiłeś/aś prawdopodobnie laptop z 1TB dyskiem magnetycznym. Dobrym rozwiązaniem jest przenieść dane z dysku HDD (magnetycznego) na SSD (dysk flashowy), ponieważ jest on około 10-krotnie szybszy. Większość dysków w laptopach ma rozmiar 2,5”. Chyba, że posiada się jeszcze szybszy typ NVMe (uwaga!tu opisany w poście program może mieć problem z jego wykryciem z powodu sterowników, i tu trzeba kombinować).
Dysk 2,5” SSD o pojemności 256GB można na chwilę obecną dostać za sumę około 70zł lub 512GB za około 110zł – a różnica w działaniu za te pieniądze jest kolosalna. A dokładniej odczyt/zapis informacji na dysku jest zoptymalizowany parokrotnie. Laptop ciszej pracuje i uszkodzenie dysku SSD w trakcie spoczynku i pracy jest dużo trudniejsze.
Teraz opiszę przykładowe kroki/etapy działania:
Pierwsza rzecz. Kupujemy 2,5” dysk SSD na złączu SATA. Od I do III modele są kompatybilne wstecz. Więc, jeżeli, np. w laptopie mamy Satę I i kupimy dysk na złączu III, to nie będzie żadnego problemu z działaniem.
Po drugie – musimy mieć jakiś pendrive, aby utworzyć, np. przy pomocy Rufus-a bootowalny dysk z Clonezilla. Wyszukujemy obraz iso tego unix-owego systemu i montujemy na posiadanym pendrivie.
Mamy już nowy dysk i bootowalny dysk z Clonezillą (jest to w pełni darmowy program do klonowania partycji/dysków). I teraz: albo mamymiejsce na drugi 2,5” dysk w laptopie albo musimy posiadać adapter na złącze USB lub inne by podłączyć nowy dysk do naszego komputera.
3. Najpierw powinniśmy podłączyć sam nasz nowy dysk i utworzyć tablicę partycji -> partycję (np. ms-dos/ lub fat32) na SSD, gdyż Clonezilla tego nie zrobi. Możemy do tego użyć unixowego programu GParted lub jakiegoś darmowego windowsowego programu do partycjonowania dysków.
4. Odpalamy Clonezillę.
Wybieramy opcję nam odpowiadającą typu, np. dysk->to->image.
I jeszcze jedna bardzo ważna kwestia: partycje z danymi powinny mieścić się w rozmiarze nowego dysku ( z większym Clonezilla sobie nie poradzi).
Czyli w tym celu używamy znowu jakiegoś programu do partycjonowania i zmieniamy obrazy partycji systemów, tak by nam odpowiadały. Pamiętajmy, jednak, by nie ruszać partycji EFI, bootowalnych, itp. Dane z rozmiarami wszystkich partycji muszą mieścić się w zakresie pojemności nowego dysku.
5. Tworzymy obraz dysku.
6. Następnie odtwarzamy obraz dysku HDD na naszym nowym dysku SSD.
Alternatywnie można użyć, jak ktoś woli GUI, czyli z graficznym interfejsem użytkownika – program Rescuezilla.
Ważna wskazówka: Wszystkie partycje powinny być umieszczone jak na stosie od lewej do prawej i mieścić się w rozmiarze nowego dysku.
#!/bin/bash
# Ustaw lokalizację pliku App.AppImage
APPIMAGE_PATH="$HOME/Apps/App.AppImage"
# Sprawdź, czy plik istnieje
if [[ ! -f "$APPIMAGE_PATH" ]]; then
echo "Plik App .AppImage nie został znaleziony w lokalizacji: $APPIMAGE_PATH"
echo "Upewnij się, że podałeś poprawną ścieżkę w zmiennej APPIMAGE_PATH."
exit 1
fi
# Nadaj uprawnienia wykonywalne, jeśli nie są ustawione
if [[ ! -x "$APPIMAGE_PATH" ]]; then
echo "Nadawanie uprawnień wykonywalnych dla pliku .AppImage..."
chmod +x "$APPIMAGE_PATH"
fi
# Uruchom aplikację z obsługą flagi --no-sandbox
echo "Uruchamianie App ..."
"$APPIMAGE_PATH" --no-sandbox
# Sprawdź, czy aplikacja zakończyła się błędem
if [[ $? -ne 0 ]]; then
echo "Wystąpił problem z uruchomieniem App. Sprawdź komunikaty błędów powyżej."
exit 2
fi
echo "App został uruchomiony pomyślnie!"
exit 0
2. Edytorem nano tworzymy/edytujemy plik do skrótu uruchamialnego:
Możliwe, że podczas pracy komputera system operacyjny Ubuntu (v22 lub inny) się zawiesi (np. w związku z ograniczeniem RAM i swap-u). Po ponownym uruchomieniu komputera z systemem może wystąpić wtedy problem z zamontowaniem tego dysku.
Rozwiązaniem może być przeskanowanie w celu naprawy błędów plików:
sudo ntfsfix /dev/sdb1
,gdzie /dev/sdb1 to lokalizacja dodatkowego dysku
Można go również odmontować:
sudo umount /dev/sdb
Jak i zamontować od nowa:
sudo mount /dev/sdb/ /mnt/drive
,gdzie /mnt/drive to miejsce katalogu, w którym montujemy dysk
Teraz nie powinno być problemów z widocznością dysku.
Od pewnego czasu Microsoft zapowiedział, że zaprzestanie dodawać aktualizacje do Windowsa 10. Linux Ubuntu v24 jest obecnie najnowszą wersją LTS (Long Time Support – czyli z długotrwałym wsparciem). W związku z powyższym dobrym rozwiązaniem, jest przesiadka na Windows 11 i najnowszą wersję Ubuntu 24.
Można podejmować różne próby: -najpierw stawiać Ubuntu, a potem Windows lub –zacząć od Windowsa i kolejno Ubuntu
I tu mała dygresja. Microsoft jak zwykle albo jako monopolista na rynku systemów operacyjnych ( nie licząc MacOS od Apple) albo po postu nie stara się uwzględniać innych dystrybucji albo dokłada starań w ich eliminacji. Dlaczego to piszę? – Gdyż, jeżeli zainstalujemy najpierw Ubuntu, a potem Windows, to ten ostatni nadpisze GRUB-a od Linuksa albo wręcz wymaże wpis partycji Ubuntu.
Dlatego polecam. Najpierw postawić Windows 11, a dopiero potem Ubuntu 24. Nie powinno być żadnych komplikacji, a wręcz przeciwnie. Instalator Ubuntu 24 nie dość, że wykryje Boot-loadera Windows-a, to jeszcze w dodatku sam z automatu zmieni rozmiar partycji tego systemu oraz utworzy partycje (dwie: jedą pod /boot/efi i drugą pod /) dla Ubuntu. (Nie trzeba więc manipulować żadnym programem do tworzenia/modyfikowania partycji).
Teraz pokrótce opiszę sprawdzony przez siebie sposób na oba systemy:
1. W BIOS-ie Legacy support jest wyłączony, tylko na UEFI na on. Secure Boot może być włączony (Ubuntu w wersji 24 nie ma z tym większych problemów).
2. Instalacja z wymazaniem całego dysku pod Windows 11.
3. Instalacja Ubuntu 24. Uwzględnienie Windows-a i zmiana rozmiaru jego partycji na mniejszy.
I w ten sposób powinniśmy mieć po starcie komputera odpalony GRUB od Ubuntu z możliwością wyboru jednego z dwóch systemów.
Oczywiście, nie piszę, że próba instalacji najpierw Windows-a jest skazana na niepowodzenie. Trzeba jednak odzyskiwać nadpisany GRUB i wymazaną partycję Linux-a (spod oczywiście dystrybucji USB Live Ubuntu przykładowo).
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.