Warsztaty z QT

O ile dobrze pójdzie to przyda się nam poniższy kod:

#include <QFile>
#include <QPixmap>
#include <QSqlDatabase>
#include <QSqlRecord>
#include <QSqlError>
#include <QSqlQuery>
#include <QDebug>
#include "studentdbhandler.h"
void StudentDBHandler::createTableIfNotExists(QSqlDatabase &db)
{
if (!db.isOpen()) {
qDebug() << "Error: Failed to connect to database";
return;
}
QSqlQuery query(db);
QString createTableQuery;
if ("QSQLITE" == m_dbType) {
createTableQuery = R"(
CREATE TABLE IF NOT EXISTS Students (
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description VARCHAR(255) NOT NULL,
avatar BLOB
)
)";
} else { // For other database types like MySQL
createTableQuery = R"(
CREATE TABLE IF NOT EXISTS Students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description VARCHAR(255) NOT NULL,
avatar LONGBLOB DEFAULT NULL
)
)";
}
if (!query.exec(createTableQuery)) {
qDebug() << "Error: Failed to create table" << query.lastError().text();
}
}
void StudentDBHandler::addStudent(const std::string_view &name,
const std::string_view &description,
const std::string_view &imagePath)
{
QSqlDatabase db = getDatabaseConnection();
if (!db.isOpen()) {
qDebug() << "Error: Failed to connect to database";
return;
}
createTableIfNotExists(db);
QSqlQuery query(db);
query.prepare("INSERT INTO Students (name, description, avatar) VALUES (:name, :description, :avatar)");
query.bindValue(":name", name.data());
query.bindValue(":description", description.data());
if (!imagePath.empty()) {
QFile file(imagePath.data());
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "Error: Failed to open image file" << imagePath;
return;
}
QByteArray imageData = file.readAll();
query.bindValue(":avatar", imageData);
} else {
query.bindValue(":avatar", QVariant(QVariant::ByteArray));
}
if (!query.exec()) {
qDebug() << "Error: Failed to add student" << query.lastError().text();
} else {
qDebug() << "Student added successfully";
}
db.close();
}
void StudentDBHandler::listStudents()
{
auto students = getStudents();
for (const auto student : students) {
qDebug() << student.studentId_ << "Name:" << student.name_
<< "Description:" << student.description_;
}
}
std::vector<Student> StudentDBHandler::getStudents()
{
QSqlDatabase db = getDatabaseConnection();
if (!db.isOpen()) {
throw std::runtime_error("Error: Failed to connect to database");
}
QSqlQuery query(db);
if (!query.exec("SELECT * FROM Students")) {
throw std::runtime_error("Error: Failed to retrieve students"
+ query.lastError().text().toStdString());
}
QSqlRecord record = query.record();
const auto idIndex = record.indexOf("id");
const auto nameIndex = record.indexOf("name");
const auto descriptionIndex = record.indexOf("description");
const auto avatarIndex = record.indexOf("avatar");
std::vector<Student> students;
while (query.next()) {
Student student;
student.studentId_ = query.value(idIndex).toInt();
student.name_ = query.value(nameIndex).toString().toStdString();
student.description_ = query.value(descriptionIndex).toString().toStdString();
QPixmap pixmap;
pixmap.loadFromData(query.value(avatarIndex).toByteArray());
student.avatar_ = std::move(pixmap);
students.emplace_back(std::move(student));
}
db.close();
return students;
}
QSqlDatabase StudentDBHandler::getDatabaseConnection()
{
static int nextDbConnectionNumber{}; /// to disable DB warning: https://stackoverflow.com/questions/55199965/qsqldatabase-how-to-avoid-qt-sql-default-connection-still-in-use-duplicate
QSqlDatabase db = QSqlDatabase::addDatabase(m_dbType.c_str(),
"connection_" + QString::number(nextDbConnectionNumber++));
db.setDatabaseName(m_dbName.c_str());
if (m_dbType == "QMYSQL") {
db.setHostName(m_dbHost.c_str());
db.setUserName(m_dbUser.c_str());
db.setPassword(m_dbPassword.c_str());
}
if (!db.open()) {
qDebug() << "Error: Failed to connect to database";
}
return db;
}
#ifndef STUDENTDBHANDLER_H
#define STUDENTDBHANDLER_H
#include <string>
#include <string_view>
#include <vector>
#include <optional>
class QSqlDatabase;
class QPixmap;
struct Student {
int studentId_;
std::string name_, description_;
std::optional<QPixmap> avatar_;
};
class StudentDBHandler {
public:
StudentDBHandler(const std::string& dbType, const std::string& dbName, const std::string& dbHost = "",
const std::string& dbUser = "", const std::string& dbPassword = "")
: m_dbType(dbType), m_dbName(dbName), m_dbHost(dbHost), m_dbUser(dbUser), m_dbPassword(dbPassword) {}
void addStudent(const std::string_view& name, const std::string_view& description, const std::string_view& imagePath = "");
std::vector<Student> getStudents();
void listStudents();
private:
void createTableIfNotExists(QSqlDatabase& db);
QSqlDatabase getDatabaseConnection();
std::string m_dbType;
std::string m_dbName;
std::string m_dbHost;
std::string m_dbUser;
std::string m_dbPassword;
};
#endif // STUDENTDBHANDLER_H
  1. Wygodnym programem do przeglądania bazy danych jest: Dbeaver
  2. Polecam sobie aktywować bazę danych MySQL (dostępna przez https://panel.agh.edu.pl/)
    • Aby się połączyć z bazą danych potrzebny VPN AGH.
    • Alternatywnie można skorzystać z bazy danych SQLite, która działa lokalnie.
  3. Samo dodanie plików do projektu może spowodować błędy kompilacji! Dlatego trzeba jeszcze w pliku CMakeLists.txt dodać komponenty QT korzystające z bazy danych. Czyli człon Sql:
    find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Sql)
    find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Sql)
    find_package(Qt6 REQUIRED COMPONENTS Sql)

    Oraz też kod przy linkowaniu:
    target_link_libraries(AplikacjaNaWarsztatyPrototyp PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Sql)

Nie! Nie potrzebujesz korepetycji z C++! Nie wyrzucaj pieniędzy!!!

[Doprecyzuje: chodzi mi o korepetycje uczące C++, nie te przygotowujące do matury. Matura z informatyki jest tak specyficznym egzaminem, że poniższy wpis tego nie dotyczy. Niestety z moich obserwacji niewiele ma matura z informatyki pisana w C++ wspólnego z C++.]

Ostatnimi czasy pocztą pantoflową docierają do mnie zapytania o korepetycje z C++. Przy okazji rozmów z rodzicami osób, dla których szukane są korepetycje, dowiaduję się, że mimo iż w internecie jest dużo ofert, to od kilku miesięcy nie udało się im nikogo znaleźć, kto by spełniał kryteria. Korepetycje są modne, dzięki nim osoby mające problemy szybciej nadrabiają i zdają (chociaż nie zawsze), na uczelniach wiszą ogłoszenia z korepetycjami, korepetytorzy proszą swoich „klientów” aby mówili o nich swoim kolegom i tak się to nakręca. Korepetycje z języków obcych z native speakerem – mają uzasadnienie, jednakże zamierzam obronić tezę, że do zwykłej nauki C++ nie potrzebujesz korepetycji, a jak masz za dużo pieniędzy, to przelewaj na cele charytatywne (np. Siepomaga.pl).

W temacie korepetycji muszę powiedzieć, że na studiach na UJ nie brałem ani razu korepetycji, mimo iż byłem po profilu humanistycznym, a UJ ciśnie matematykę. Jak sobie poradziłem bez korepetycji:

  • praca – musisz przysiąść, może nawet więcej niż inni
  • regularność – przez cały semestr trzeba pracować
  • utkniesz na problemie, którego nie możesz rozwiązać – pytasz nauczyciela. Każdy nauczyciel akademicki ma obowiązek mieć konsultacje – chodzisz na nie, nawet co tydzień. Jak nauczyciel nie umie tłumaczyć to drążysz -on na tym też skorzysta bo się nauczy. Na zajęciach pytasz, nie przejmuj się jak nikt inny nie pyta.
    • wstydzisz/boisz się nauczyciela to pytasz kolegów/koleżanki, równocześnie pomagając innym kolegom/koleżankom
  • korzystasz z wyszukiwarki, musisz sam spróbować naprawić problem zanim spytasz (nie dotyczy jeśli wątpliwości są w trakcie zajęć)

Powyższe kroki można podsumować sformułowaniem: musisz postępować jak sympatyczny kujon, który pomaga innym.

Jak się nauczyć C++ bez korepetycji

A teraz konkretnie: aby się nauczyć C++ potrzebujesz dwóch rzeczy: teorii i kodzenia. Za teorię polecam książkę (opisałem je w innym moim wpisie), np. rozdział dziennie. A potem kodujesz, aż przetestujesz co było w książce. Ja stosowałem taką metodę, że czytałem sobie rozdział z Symfonii C++ (poprzednik Opus Magnum Grębosza), dokładnie analizowałem kod, jak już go rozumiałem to bez patrzenia do książki robiłem to samo. Jeśli się udało to kolejny przykład, a jak nie… to wracałem do książki, analizowałem ponownie i znowu siadałem aby to zakodować. Poza zrozumieniem rozdziałów z książki są tam ćwiczenia – sugeruję je robić (przynajmniej na początku), ale nie tylko „w głowie”, ale na komputerze. Nudzą Cię ćwiczenia, to korzystaj z narzędzi online judge np. Hackerrank – tam za zadania dostajesz punkty, za punkty np. złotego badge’a. Masz już dużo punktów, maksymalne odznaczenia, zadanka przychodzą Ci łatwo – czas „zmaterializować” dotychczasową wiedzę! Robi się to w jeden sposób – poprzez zrobienie większego zadania własnego (innymi słowy powinieneś zrobić własny projekt, lub projekty)! Pomysłów jest wiele, wszędzie wokoło programy, oraz, co dziwne, braki wielu narzędzi. Jako inspirację polecam mój wpis. Poza samym aspektem nauczenia projekty mają zalety, o których nie macie nawet pojęcia (piszę to z perspektywy doświadczonego programisty C++ o doświadczeniu komercyjnym) – rekruterom własny projekt wpisany w CV udziela bardzo wiele cennych informacji.

Już umiesz programować w C++, co dalej?

[Zakładając, że chcesz iść dalej w C++] Dalej czytasz książki, nadążasz za bieżącymi standardami C++, kodujesz (co prawda można już wtedy więcej „w głowie”, jednakże nie za dużo). Ale nadchodzi kolejny etap, do którego już potrzebujesz innych ludzi (= potrzebujesz zespołu). Zespół będzie Cię uczyć jak się programuje, oraz czytania kodu. W książkach się robi pewne rzeczy, których się nie robi w kodzie komercyjnym (chociażby polskie nazwy i nawet komentarze), ale tych aspektów jest znacznie więcej. Akapit ten sprowadza się do tego, że powinieneś: znaleźć pracę w C++.

Są ludzie, którzy od razu na studiach chcą założyć własną firmę, bo są kreatywni, mają czas (tak, uwierzcie mi – macie go … w porównaniu z tym co będzie!). Jednakże sugeruję gdzieś powspółpracować z bardziej zaawansowanymi programistami. Niezależnie od tego jak jesteś dobrym w czymkolwiek, to pokornie znoś krytykę, rozmawiaj na argumenty.

A czasowo?

Masz już trochę wiosen, znasz siebie lepiej niż trenerzy personalni. Proponuję rozdział dziennie w dni robocze, nie mniej, w weekendy nadrabiamy. Na uczelni przedmiot to 14 tygodni (wg mnie za mało) * 5 dni = 70 rozdziałow. Opus Magnum ma 38. Niektóre dłuższe. Zacznij od pierwszego tygodnia zajęć!
Nie namawiam Cię do mycia toalet publicznych własną szczoteczką do zębów bez rękawiczek. To jest fajne, tylko trzeba poznać C++.

Podsumowując

Nie czytaj głupot w internecie tylko się bierz za książkę i programy! Bądź dobrym kolegą! Kujon to ten co mu się coś chce i w życiu coś osiągnie!

Jak nauczyć się najnowszego C++ i być na bieżąco

[Jest to rozwinięcie mojego artykułu jak się nie zasiedzieć w IT]

C++ od ponad 10 lat ma bardzo szybki rozwój, w którym to standardy pojawiają się co 3 lata, kiedyś ten cykl wydawniczy był znacznie dłuższy. Ma to duże zalety, gdyż jest to język coraz bardziej nowoczesny, coraz wygodniejszy w użyciu, ale ma też wadę – ciężko być na bieżąco a najnowszym C++. Trudność ta polega na tym, że:

  1. Książki nie nadążają z najnowszymi standardami – książka jak już przejdzie cały cykl wydawniczy i się przebije do opinii publicznej to już jest co najmniej jeden standard w plecy.
  2. Firmy nie zawsze są w stanie podbić do nowszego standardu.
  3. Czynnik ludzki – nam się chce, ale komuś w zespole może się nie chcieć nadążać, bo to nie jest łatwe.

Zacznę od tego, że w nauce języków programowania jestem zwolennikiem książek, gdyż:

  1. Jakość: książkę autor lepiej przemyśli (bo nie tak łatwo ją potem zmienić), błędy mogą pogrążyć pisarza, że w przyszłości jego książki będą uważane za słabe, dlatego autorzy książek piszą je jak najlepiej. Następnie książka jest czytana i recenzowana przez innych, zawsze zgłoszą błędy. Autor nie jest anonimowy, to motywuje do większego starania.
  2. Kompletność: Wystarczające omówienie zagadnienia, książka ma cel, do którego dąży, nie musi być jak najkrótsza jak artykuły internetowe, ma dobrze wyjaśnić pewne zagadnienia. Dlatego książki posiadają dużo przykładów kodu, wyjaśniają go, oraz pokazują wydruk.

Oczywiście nie mówię, że artykuły poświęcone programowaniu są złe (sam zresztą piszę artykuły o programowaniu w C++ na stronę cpp0x.pl). Jeśli chcemy być na bieżąco to się bez tego nie obejdzie, bo artykuły powstają szybciej i są w stanie opowiedzieć o pojedynczym zagadnieniu w sposób prawie jak książka, ale nie opowiedzą o wszystkim.

Nowy standard C++, co to tak właściwie oznacza?

Oznacza to zasadniczo dwa aspekty:

  1. Rozwój biblioteki standardowej: czyli dodatkowe funkcje, metody, kontenery standardowe, nagłówki, stałe matematyczne itp.
    • Bardzo rzadko, ale jednak się zdarza, że ze standardu jest coś uznawane za złą praktykę i potem usuwane po kilku standardach np. auto_ptr w standardzie C++11 uznane za przestarzałe i usunięte w C++17. Nie wiele rzeczy jest usuwanych, tylko tzw. „ewidentne dziadostwo” (to nie jest określenie fachowe – sam to wymyśliłem, bo jest trafne).
  2. Wprowadzane ułatwienia do języka C++, które pomagają programistą pisać wysokiej jakości kod, które wyposażają w czytelne dla programisty i kompilatora oznaczenia (np. override), których tenże kompilator pilnuje. Identyfikowane są aspekty niezdefiniowane, którym jest precyzowane zdefiniowane znaczenie (np. constinit). Jak również rozluźnianie pewnych reguł, niesłusznie zbyt restrykcyjnych (np. co może zawierać funkcja constexpr). Poza tym aspekty związane z polepszeniem wydajności kodu.
    • Uspokoję czytelników: kolejne standardy C++ starają się zachowywać maksymalną kompatybilność wsteczną z poprzednimi standardami. W praktyce: można pisać w C++03 (z 2003 roku) i kompilować kompilatorem z C++23 i kod powinien się kompilować. Z tymże takie postępowanie jest nieprofesjonalne aby nie używać nic z nowości.

A teraz konkretnie – jak nauczyć się najnowszego C++?

Niestety właśnie w tym problem, że nie ma na to odpowiedzi podanej na tacy. Nie ma książki, która uczyłaby od razu C++ w najnowszym standardzie (na ten moment C++23 z 2023 roku). Powiem więcej, nie zetknąłem się z dobrą książką, która by od zera wprowadzała w C++ więcej niż C++11. Kursy internetowe również są do tyłu, najpopularniejszy kurs C++ Pasja Informatyki jest starszy niż C++11.

Rozwiązanie (wg mnie)

Nie* ma „papki łatwej do przyswojenia”, więc jak sobie z tym poradzić?

  1. Przeczytać && przećwiczyć Opus Magnum Grębosza – z niej nauczymy się do C++11 włącznie. Jest to najlepsza znana mi książka, największą konkurencją jest Język C++ Stroustrupa, ale jest to o wiele cięższa książka w przyswojeniu, wg mnie i wielu moich studentów właśnie Grębosz jest lepszy.
  2. C++14 i C++17 w łatwej formie można opanować z dodatkowego tomu Grębosza: Opus magnum C++: Misja nadprzestrzeń. Niestety jest to książka tłumacząca C++14 i 17 w wersji: „co się zmieniło” z przykładami, dlatego trzeba to co mamy sobie ułożyć w głowie. Jak się uczymy programować to jest to trudne (najpierw się uczymy, że się robi tak a tak, a potem się to zmienia).
  3. Z kolei aby ogarnąć C++20 natrafiłem na jedną książkę wartą polecenia: Wysoce wydajny C++. Opanuj sztukę optymalizowania działania kodu. Wydanie II – Bjorn Andrist, Viktor Sehr. Książka ta nie jest spisaniem „co przybyło w C++20”, ale bardziej skupienie od podstaw na tym jak działają komputery, jak korzystać z tego wydajnie. Opisuje ona nowe funkcjonalności C++20. Trudność tej książki jest różna, dla większości tej książki wystarczy przeczytanie Opus Magnum, ale są też rozdziały trudne pod koniec. Polecam jej przeczytanie, gdyż skupia się na działaniu komputerów wpływającym na wydajność – zrozumienie tego jest konieczne dla programisty C++.
  4. Do C++23 nie widziałem jeszcze napisanej książki, więc odsyłam do wystąpień konferencyjnych cppcon: C++23 – What’s In It For You? – Marc Gregoire – CppCon 2022

„Papka” może istnieć

Za „papkę” mam na myśli kurs programowania w C++ od zera do (prawie) najnowszego standardu. Wcześniej pisałem, że nie istnieje, ale jednak może ona istnieć, jednakże nie wszyscy mają do niej dostęp. Taką „papką” są dobre wykłady z C++. Tam wykładowca musi robić to co wyżej opisałem, aby z tego zrobić aktualną syntezę przedstawioną Państwu. Niestety nie wszyscy wykładowcy przygotowują najnowszą „papkę”. Oczywiście nie musi to wynikać ze złej woli – zatwierdzanie standardu jest w połowie semestru zimowego, oprogramowanie na uczelni może nie być aktualny (nie wspierać nowych standardów).

Ktoś może spytać o standard C++ – tam niby jest wszystko, ale językiem encyklopedycznym. Nie jest to do nauki programowania.

Niekompletność „papki”

Na uczelniach jest określona liczba godzin na wykłady, przy obecnej wersji C++ potrzeba by co najmniej 60 godzin wykładów i 60 godzin ćwiczeń praktycznych. Na ogół nie ma tego tak dużo, nawet czasami jest 14 godzin, wtedy robi się przegląd najpopularniejszych aspektów C++.

Podstawowe aspekty nowych standardów C++ na początkowych etapach nauki

Prowadzę programowanie w C++, takie aspekty najnowszych standardów zdążę powiedzieć (inne aspekty są zbyt zaawansowane na te 14-28 godzin)
[uwaga: poniższe punkty są w formie notatek, powinienem to porządniej opisać]

  1. C++23:
    • Operator indeksowania wieloargumentowy:
      T& operator[](size_t x, size_t y, size_t z)
    • W końcu w standardzie jest wyświetlanie warningów czasu kompilacji:
      #warning "Teraz jest to w standardzie"
    • Wygodne wyświetlanie zmiennych na ekran:
      std::println("To jest liczba {}", 44);
      std::print("{}", vectorInstance); // można cały std::vector wyświetlić
  2. C++20:
    • Moduły – przyśpieszenie kompilacji
    • Designed initialised” – możliwość przypisywania wartości poszczególnym polom w strukturach przy inicjalizacji
    • Operator porównywania: bool operator <=>(...) – teraz można wszystkie operatory porównania „wygenerować” z jednokrotnie napisanego operatora
    • skrócona wersja szablonów: void f(auto value) {…}
    • inicjalizatory w range-based-for:
      for(auto obj = GetObj(); auto item : obj.GetCollection()){
    • pomijanie typename przy typach zagnieżdżonych – teraz wolno
    • Z dużych zmian: w C++20 zostały jeszcze wprowadzone koncepty i courutines – są to jednak zbyt zaawansowane mechanizmy aby je przedstawić na początkowym etapie nauki

Łatwe dodawanie bibliotek zewnętrznych do projektu niezależnie od systemu operacyjnego – manager pakietów VCPKG + CMake

Informatyk jest w życiu uczony lenistwa – po co robić coś co dobrze zrobił już ktoś inny, czyli używamy bibliotek.


Niestety mimo iż C++ jest bardzo popularny, a wg Tiobe-index jest to III najpopularniejszy język programowania, oraz mimo dużej społeczności, prężnego rozwoju standardów co trzy lata wciąż istnieje problem z instalacją dodatkowych bibliotek programistycznych. Pojawiło się wiele narzędzi, które to umożliwiają, np. wieloplatformowy manager pakietów Conan, a także wiele innych. Jednakże jeden z nich wg mnie zasługuję na szczególną uwagę: vcpkg, gdyż jest bardzo wygodny w użyciu, opensourcowy, oraz zawiera dużo bibliotek (nie tylko twórcy mogą dorzucić tam bindingi do bibliotek, ale każdy, przez co baza jest olbrzymia), a także jest wieloplatformowy (wszędzie się go łatwo używa, ale na Windowsie dla środowiska Microsoft Visual Studio jeszcze łatwiej).

Dużo z teorii na temat bibliotek niestandardowych opisałem w innym moim wpisie, więc tutaj, żeby się nie powtarzać, od razu polecimy z koksem.

Instalacja biblioteki
Mamy projekt, w którym chcemy skorzystać z biblioteki, która zawiera zarówno nagłówki, jak i źródła. Aby jej użyć musimy wykonać następujące kroki:

  1. mieć zbudowany VCPKG
  2. zawołać vcpkg install $MY_LIBRARY np. boost-program-options (do parsowania argumentów uruchomienia programu), czyli będzie to: vcpkg install boost-program-options
  3. podpiąć do naszego projektu, najwygodniej przez CMake, ale o tym później.

Instalacja na konkretnym przykładzie
Załóżmy, że chcemy odpalić przykład użycia boost-program-option, z oficjalnej strony tutoriala pozwolę sobie przytoczyć ten kod:

// Copyright Vladimir Prus 2002-2004.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt
// or copy at http://www.boost.org/LICENSE_1_0.txt)

/* The simplest usage of the library.
 */

#include <boost/program_options.hpp>
namespace po = boost::program_options;

#include <iostream>
#include <iterator>
using namespace std;

int main(int ac, char* av[])
{
    try {

        po::options_description desc("Allowed options");
        desc.add_options()
            ("help", "produce help message")
            ("compression", po::value<double>(), "set compression level")
        ;

        po::variables_map vm;
        po::store(po::parse_command_line(ac, av, desc), vm);
        po::notify(vm);

        if (vm.count("help")) {
            cout << desc << "\n";
            return 0;
        }

        if (vm.count("compression")) {
            cout << "Compression level was set to "
                 << vm["compression"].as<double>() << ".\n";
        } else {
            cout << "Compression level was not set.\n";
        }
    }
    catch(exception& e) {
        cerr << "error: " << e.what() << "\n";
        return 1;
    }
    catch(...) {
        cerr << "Exception of unknown type!\n";
    }

    return 0;
}

Powyższy kod będzie w pliku main.cpp. Wszystkie poniższe kroki wykonam w tym samym katalogu (chyba, że jawnie napiszę inaczej):

Następnym krokiem jest zbudowanie vcpkg, które wpierw ściągamy z oficjalnego repozytorium, ja to robię na Linuxie tak:
git clone https://github.com/Microsoft/vcpkg.git --depth=1
Następnie wołamy (niezależnie od systemu operacyjnego): ./vcpkg/bootstrap-vcpkg.sh, wtedy w katalogu gdzie ściągnęliśmy repozytorium powstanie plik wykonywalny vcpkg lub vcpkg.exe. To wszystko, mamy już VCPKG, które teraz możemy albo zostawić tam, gdzie jest (czyli w katalogu projektu), albo przenieść w jakieś bardziej ogólne miejsce w systemie.

Następnie wołamy ./vcpkg/vcpkg install boost-program-options (na Windowsie ./vcpkg/vcpkg.exe ...), po chwili mamy już bibliotekę zbudowaną w naszym systemie. Na końcu outputu widzimy od razu prawie gotowy kod, który powinniśmy dorzucić do pliku CMakeLists.txt naszego projektu. W powyższym przypadku u mnie wygląda to tak:

Stored binaries in 1 destinations in 698 ms.
Elapsed time to handle boost-program-options:x64-linux: 26 s
Total install time: 1.9 min
The package boost is compatible with built-in CMake targets:

    find_package(Boost REQUIRED [COMPONENTS <libs>...])
    target_link_libraries(main PRIVATE Boost::boost Boost::<lib1> Boost::<lib2> ...)

Ale dodać powyższe musimy tylko jeśli używamy CMake’a, bo pliki znajdują się w katalogu ./vcpkg/installed/.../{include,lib,share}, więc można je dodać do projektu. Przykładowo dla powyższej biblioteki plik jesteśmy w stanie skompilować komendą (na Linuxie, ale analogiczna będzie na Windowsie):
g++ -isystem./vcpkg/installed/x64-linux/include/ main.cpp -L./vcpkg/installed/x64-linux/lib/ -lboost_program_options -o program.
Wiadomo, że przy większych projektach nie bawimy się bezpośrednio komendami, tylko dopinamy to do projektu w ulubionym środowisku programistycznym. Ale właśnie zaletą VCPKG jest, że nie musimy tego robić ręcznie! VCPKG ma wsparcie pod Visual Studio (nie mylić z Visual Studio Code), oraz pod CMake’a.

Na Windowsie
vcpkg jest autorstwa Microsoftu, więc zadbali, aby to dobrze działało.

Visual Studio (nie Visual Studio Code)
Wtedy wystarczy zawołać:
.\vcpkg integrate install i będziemy mieli nasze biblioteki dostępne we WSZYSTKICH PROJEKTACH, które kodujemy w Visual Studio Community/Proffesional. To wszystko, tak bardzo wygodne.

Inny kompilator na Windowsie
Wg StackOverflow (https://stackoverflow.com/questions/63031513/vcpkg-with-mingw) jest to możliwe aby użyć innego kompilarora – MinGW. W tym celu instalując bibiliotekę musimy podmienić „triplet” np.: ./vcpkg install boost-program-options --triplet=x64-mingw-dynamic. Następnie możemy podpiąć ręcznie, w formie: g++ -isystem./vcpkg/installed/x64-linux/include/ main.cpp -L./vcpkg/installed/x64-linux/lib/ -lboost_program_options -o program, lub bazować na CMake’u.

Linux i inne systemy, które używają CMake’a
Zacznijmy od utworzenia pliku CMakeLists.txt o treści przykładowo:

cmake_minimum_required(VERSION 3.20)
project(Nauka_Vcpkg)

add_executable(${PROJECT_NAME} main.cpp)

Następnie możemy ten plik załadować przez środowisko programistyczne, ewentualnie użyć komend (Linux):

  1. cmake . # to nam wygeneruje konfiguracje do Makefile'a
  2. make # odpalenia budowania przez program Makefile
  3. Uruchomienie programu, w powyższym przypadku będzie to ./Nauka_Vcpkg.
    Niestety program się nam nie skompiluje, musimy dodać integracje wyplutą wcześniej przez vcpkg po zawołaniu vcpkg install ....

Zaktualizujmy więc CMakeLists.txt o, wypluty przez vcpkg, kod z modyfikacjami:

cmake_minimum_required(VERSION 3.20)
project(Learning_VCPKG LANGUAGES CXX)

find_package(Boost COMPONENTS program_options REQUIRED)

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} PRIVATE Boost::boost Boost::program_options)

To wszystko! Kod się kompiluje i linkuje!

Ważna uwaga – jeśli instalujemy komponenty biblioteki to stosujemy podkreślenie dolne _ a nie pauzę -.

Zasadniczo tyle by nam wystarczyło, ale w przypadku biblioteki boost jeśli nie podamy wersji to pojawi się warning, który niwelujemy przez dodanie set(Boost_NO_WARN_NEW_VERSIONS True) przed komendą find_package(Boost ....

___________________

Większe potrzeby – instalacja biblioteki z zależnościami

Kiedyś napisałem artykuł o wieloplatformowej bibliotece do baz danych SOCI. W artykule bazą danych jest sqlite3. Można też użyć biblioteki boost dla wygody programowania. Czyli mamy trzy biblioteki do zainstalowania i ogarnięcia zależności. Na szczęście z VCPKG nie jest to trudne, wpierw sprawdźmy, czy nasza biblioteka jest, oraz w jakich wariantach:
$ ./vcpkg/vcpkg search soci
soci                     4.0.3#3          SOCI – The C++ Database Access Library
soci[boost]                               Integration with Boost
soci[empty]                               Build the backend skeleton for new backends development
soci[mysql]                               Build mysql backend
soci[odbc]                                Build odbc backend
soci[postgresql]                          Build postgresql backend
soci[sqlite3]                             Build sqlite3 backend

Jak widać mamy to czego szukamy, a opcje można ze sobą łączyć, przykładowo:
./vcpkg/vcpkg install ‚soci[sqlite3,boost]’

W odpowiedzi pojawi się nam tekst:
find_package(SOCI CONFIG REQUIRED)
# Using core (loading backends at runtime)
target_link_libraries(main PRIVATE $,SOCI::soci_core,SOCI::soci_core_static>)

# Using the sqlite3 backend directly
target_link_libraries(main PRIVATE $,SOCI::soci_sqlite3,SOCI::soci_sqlite3_static>)

Który dodajemy do naszego pliku CMakeLists.txt i działamy można użyć przykładu z artykułu, np.:

#include <iostream>
#include <string>
#include <chrono>
#include <exception>
#include <soci/soci.h>
#include <soci/sqlite3/soci-sqlite3.h>

using namespace soci;
using namespace std;
using namespace std::chrono;


void runMultipleQueriesWithVariables( soci::session & sql, size_t queriesCount )
{
    string name;
    int age;
    double salary;
    for( size_t i = 0; i < queriesCount; ++i )
    {
        name = "Janusz " + to_string( i );
        age = rand() % 100;
        salary = static_cast < double >( rand() ) / RAND_MAX * 10000;
        sql << "INSERT INTO Employers(ID, Name, Age, Salary) VALUES (:id, :name, :age, :salary); ", use( i ), use( name ), use( age ), use( salary );
    }
}
void runMultipleQueriesWithStreams( soci::session & sql, size_t queriesCount )
{
    string name;
    int age;
    double salary;
    for( size_t i = 0; i < queriesCount; ++i )
    {
        name = "Janusz " + to_string( i );
        age = rand() % 100;
        salary = static_cast < double >( rand() ) / RAND_MAX * 10000;
        sql << "INSERT INTO Employers(ID, Name, Age, Salary) VALUES (" << i << ", '" << name << "'," << age << "," << salary << ");";
    }
}
void runMultiplePreparedQueries( soci::session & sql, size_t queriesCount )
{
    string name;
    int age, i;
    double salary;
    statement st =( sql.prepare << "INSERT INTO Employers(ID, Name, Age, Salary) VALUES (:id, :name, :age, :salary);",
                    use( i ), use( name ), use( age ), use( salary ) );
    for( i = 0; i < queriesCount; ++i )
    {
        constexpr bool exhangeData = true;
        st.execute( exhangeData );
    }
}

void testFunctionExecutionTime( const char * textPrefix, void( * function )( soci::session &, size_t ), soci::session & sql )
{
    auto startingTime = steady_clock::now();
    {
        constexpr size_t queriesCount = 1000;
        function( sql, queriesCount );
    }
    const auto elapsedTimeInSeconds = std::chrono::duration < double >( steady_clock::now() - startingTime ).count();
    cout << textPrefix << ", the function took seconds: " << elapsedTimeInSeconds << endl;

    sql << "DELETE FROM Employers;";
}

int main()
{
    try
    {
        soci::session sql( sqlite3, "Employers3.db" );

        sql << "CREATE TABLE IF NOT EXISTS Employers("
               "ID INT PRIMARY KEY     NOT NULL,"
               "Name           TEXT    NOT NULL,"
               "Age           INT     NOT NULL,"
               "Salary         REAL);";

        testFunctionExecutionTime( "not prepared with variables", runMultipleQueriesWithVariables, sql );
        testFunctionExecutionTime( "not prepared with streams", runMultipleQueriesWithStreams, sql );
        testFunctionExecutionTime( "prepared query", runMultiplePreparedQueries, sql );

        sql << "DELETE TABLE Employers;";
    }
    catch( const exception & e )
    {
        cerr << "Error: " << e.what() << '\n';
    }
}

A plik CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
project(LearningVcpkg LANGUAGES CXX)

add_executable(${PROJECT_NAME} main_boost.cpp)

find_package(SOCI CONFIG REQUIRED)
# Using core (loading backends at runtime)
target_link_libraries(${PROJECT_NAME} PRIVATE $<IF:$<TARGET_EXISTS:SOCI::soci_core>,SOCI::soci_core,SOCI::soci_core_static>)

# Using the sqlite3 backend directly
target_link_libraries(${PROJECT_NAME} PRIVATE $<IF:$<TARGET_EXISTS:SOCI::soci_sqlite3>,SOCI::soci_sqlite3,SOCI::soci_sqlite3_static>)

Linki/bibliografia:
Jak zacząć z VCPKG

Artykuły zewnętrzne o programowaniu

Czasami natrafiam, na artykuły, które chce Państwu podesłać, oto lista:

  1. 9 rad dla osób bez doświadczenia szukających pierwszej pracy lub stażu w programowaniu
  2. Dlaczego personalne projekty programistyczne są tak ważne? – to co powtarzam na zajęciach i wielu mi nie wierzy:(
  3. Jak zacząć karierę w IT (programowaniu) – artykuł mojego kolegi, który wiele osiągnął pracując jako programista, następnie zakładając własną firmę

Ciekawe && darmowe API do pobierania użytecznych informacji

Prawie wszystko jest dostępne w internecie, jednakże nawigacja po stronach internetowych jest mniej lub bardziej przyjemna i zajmuje czas. Czasami chcemy stworzyć narzędzie, które będzie te informacje pobierało za nas. Dane dostępne w internecie (nawet dostępne po zalogowaniu) można pobrać przy pomocy web scrapingu, niestety nie dość, że często jest on zakazany przez daną stronę, to jeszcze w każdej chwili kod HTML może się zmienić i nasz kod przestanie działać. Dlatego lepszym sposobem pobierania informacji jest stosowanie API, które jest legalne, oraz się nie zmieni z dnia na dzień.

Oto lista wybranych, darmowych API, które były stosowane w projektach zaliczeniowych:

  1. OpenWeatherApi (https://openweathermap.org/api) zwracająca informacje o pogodzie w danym mieście. Darmowa wersja jest ograniczona do 60 zapytań/minutę i 1000000 callów/miesiąc. Przy wersji płatnej jest możliwość pobierania pogody 40 lat wstecz i notyfikacje o nagłych zmianach pogody.
  2. Zestawienie kilkudziesięciu różnych api (https://api-ninjas.com/) m.in. żarty, cytaty, fakty, kraje, zwierzęta i znacznie więcej. Darmowo można odpytać 50 000/miesiąc.
  3. PokeApi (https://pokeapi.co/) pozwala pobierać różne informacje o pokemonach. Jest w pełni darmowe do celów edukacyjnych, nie wymaga autentykacji i nie ma limitów ilościowych.

Ciekawe zestawienie w ramach artykułu zewnętrznego.

ARTYKUŁ W TRAKCIE EDYCJI, JESZCZE SIĘ BĘDĄ POJAWIAĆ KOLEJNE PRZYKŁADY API (o ile ktoś z Państwa podrzuci ciekawy pomysł)

Otwartoźródłowe biblioteki niestandardowe do projektów w C++

Od lat prowadząc C++ zawsze zachęcam (lub jak mogę to wymagam:D), aby Państwo pod koniec semestru zmaterializowali swoje umiejętności w formie projekciku używającego biblioteki niestandardowego. Z mojego doświadczenia jest to najlepszy sposób nauki C++, aby po całym semestrze nauki, ćwiczeń, drobnych zadań coś w końcu zrobić. Mimo intensywnego rozwoju C++ wciąż jest ciężko podpiąć pierwszą bibliotekę niestandardową do projektu, stąd zdecydowałem się na ten wpis. Poza ogólnym wprowadzeniem dorzucę listę wybranych, ciekawych bibliotek, jakie znaleźli inni wraz z moim komentarzem.

Biblioteka niestandardowa jest pewnym dodatkiem do C++, którego nie ma w bibliotece standardowej (czyli coś, czego w standardzie lub na stronie cppreference nie znajdziemy). Standard z założenia jest dostępny wszędzie gdzie jest kompilator C++ (kod używający jedynie biblioteki standardowej jest przenośny między systemami, a nawet urządzeniami bez konieczności doinstalowywania czegokolwiem).

Bibliotekę może zrobić każdy, ale na uwagę zasługują biblioteki, których kod źródłowy jest publicznie dostępny, lista takich bibliotek znajduje się tutaj (lista ta jest utrzymywana przez społeczność, czegoś może brakować). Co prawda jak czegoś szukamy to najczęściej przez ulubioną wyszukiwarkę po tym co biblioteka ma robić, a nie przez tę listę. Na ogół wtedy pojawia się duża lista wyników, z których jest ciężko bez doświadczenia wybrać „tą najlepszą”.

Co powinna zawierać dobra biblioteka?

Biblioteka to w skrócie kod napisany przez kogoś innego. Może ją zrobić każdy, więc też jakość i stopień dojrzałości jest różny. Biblioteka składa się z tego, z czego składa się kod w C++, a dobra biblioteka powinna zawierać:

  1. Pliki nagłówkowe (*.h, *.hpp) – zawierają deklaracje funkcji, definicje klas, definicje szablonów itp.
  2. [opcjonalnie] Pliki źródłowe (*.cpp, *.c) – pliki zawierające definicje do deklaracji z plików nagłówkowych. Jeśli je biblioteka zawiera stanowi to pewną trudność w użyciu biblioteki w naszym projekcie (dlatego w prostych użyciach wygodne są biblioteki składające się tylko z nagłówków, tzw. header-only, niestety tylko niewielkie biblioteki mogą takie być ze względu na czas kompilacji).
  3. Dokumentacje – czyli opisana biblioteka co to jest, do czego służy, jak zainstalować itp. Jeśli tego nie ma to w zdecydowanej większości przypadków odrzucamy bibliotekę.
    • Tutorial/getting started/krok po kroku – jest to bardzo cenne w bibliotece aby w dokumentacji było opisane w krokach jak zacząć jej używać z dobrym opisem.
  4. Przykłady (często w podkatalogu samples, example itp) – na podstawie samej dokumentacji na ogół ciężko się połapać, dlatego kompletne przykłady bardzo ułatwiają.
  5. Skompilowane pliki – jeśli biblioteka nie jest header-only to na ogół budujemy ją sami, jednakże czasami twórcy udostępniają skompilowaną wersję, gotową do dołączenia do projektu (statyczną: *.lib, *.a; dynamiczną *.dll, *.so).
  6. Jeśli zdecydujemy się użyć już skompilowanej wersji musi się zgadzać jej wersja z naszym kompilatorem. Czyli jeśli np. na Windowsie używamy MinGW to nie zadziałają biblioteki zrobione pod VisualStudio, nawet jeśli używamy kompilatora VisualStudio, to może biblioteka nie działać gdy została skompilowana na innej wersji kompilatora – to irytujące, ale tak to wygląda.
    • Należy też pamiętać, że jeśli używamy bibliotek skompilowanych dynamicznie, to dystrybuując naszą binarkę powinniśmy dołączyć biblioteki dynamiczne (pliki *.dll na Windowsie lub *.so na Linuxie) – bez tego użytkownik może nie być w stanie użyć wszystkich funkcji naszego oprogramowania.
      • Ja jestem zwolennikiem aby używać bibliotek statycznie gdzie się da – aby wszystko było w jednej binarce. Niestety czasami prawa autorskie nie pozwalają na statyczne linkowanie bez płatnej licencji.
  7. Historię commitów – a dokładniej istotne są dwa aspekty – liczba commitów, oraz data ostatniej modyfikacji. Jak commitów jest poniżej stu jest to oznaka, że biblioteka może nie być dojrzała, oraz nie wiemy czy początkowy zapał twórców się szybko nie kończy, dlatego ja lubię kilka tysięcy commitów. Ważna jest też data ostatniej modyfikacji, jeśli jest to mniej niż rok temu to jest szansa, że twórcy się zniechęcili, albo może nawet nam nie zadziałać na nowszym kompilatorze.
  8. Społeczność, czyli czy jest biblioteka powszechnie używana (wtedy w razie problemów ktoś może pomoże). Można to sprawdzić patrząc na liczbę Issuesów, lub jak dużo jest pytań z odpowiedziami np. na StackOverflow, czy ogólnie w internecie na forach.
  9. [opcjonalnie, mniej ważne] Pliki CMake – jeśli bibliotekę trzeba zbudować wygodnie jest jeśli zawiera pliki CMake, które możemy odpowiednio włączyć do naszego projektu CMake.

Jeśli biblioteka spełnia wszystkie powyższe aspekty to wydaje się dobrym wyborem, ale niekoniecznie najlepszym.

Jak się kompiluje przy bibliotekę niestandardową?

  1. Jeśli biblioteka jest header-only to wystarczy ją przekopiować do projektu i ustawić odpowiednie ścieżki. Najprofesjonalniej jest w projekcie utworzyć katalog libs, oraz w ustawieniach projektu ustawić ścieżkę do includów na katalog tej biblioteki (aby ścieżki przy includowaniu były krótkie np. #include <biblioteka/naglowki.h> zamiast <libs/X.234.1/include/biblioteka/naglowki.h>
  2. Jeśli biblioteka ma jeszcze pliki skompilowane to trzeba dodać do projektu:
    • katalog, gdzie znajdują się biblioteki skompilowane
    • wymienić konkretne biblioteki, z którymi linkujemy
  3. [alternatywa 1] Powyższe kroki można uprościć jeśli biblioteka zawiera pliki CMake, niestety na ogół trzeba szukać instrukcji jak się robi, oraz używać we własnym projekcie CMake’a.
  4. [alternatywa 2] Można się pokusić o użycie managera pakietów, który wiele aspektów nam zautomatyzuje, wydaje mi się, że najwygodniejszy jest VCPKG (ale uwaga: na Windowskie opbługuje jedynie kompilator VisualStudio, o innych kompilatorach możemy zapomnieć).

Ciekawe biblioteki open source

  1. Biblioteki tworzące interfejs użytkownika do aplikacji (raczej nie do gier):
    • Qt – jest to biblioteka, która zawiera nie tylko interfejs użytkownika, ale też bardzo wiele innych rzeczy takich jak komunikacja sieciowa, czy komunikacja z bazami danych. Jest to biblioteka hiperwieloplatformowa (czyli nie tylko PCty, ale też prostsze urządzenia, WebAssembly, czy Android). Problemem jest jednak duży próg wejścia (przydatne: jak ją zainstalować, warsztaty z QT). Mimo iż Qt posiada bardzo dobrą dokumentacje.
    • wxWidgets – z moich doświadczeń – często studenci, którzy wybierają tę bibliotekę żałują że nie wybrali Qt
  2. Biblioteki do gier 2D:
    • SFML – gry, okienka, multimedia, grafika, sieć
  3. Biblioteki do komunikacji przez sieć:
    • libcurl – biblioteka napisana w C (a także narzędzie curl) do różnorakich żądań sieciowych, nie tylko POST i GET ale też utrzymanie sesji.
    • libcpr – jest to biblioteka w C++ obudowująca powyższą libcurl, zdecydowanie wygodniejsza w użyciu
    • POCO::NET – jest komponentem obszernej biblioteki POCO do obsługi sieci
  4. Grafika 3D – OpenGL, chociaż sugeruję nie operować na samym OpenGLu, tylko skorzystać z biblioteki, która go pod spodem używa np. SFML – tak jest wygodniej pod względem używania widgetów.

Biblioteki header-only && wieloplatformowe

  1. nlohmann/json – biblioteka do obsługi plików w formacie JSON (m.in. ich parsowania), bardzo wygodna w obsłudze
  2. lamarrr/chalk – do kolorowania składni w konsoli
  3. cpp-inquirer – do tworzenia interaktywnego menu w konsoli
  4. tabulate – do tworzenia różnorakich tabel w konsoli (również z kolorowaniem składni)
  5. RapidXML – jest to niezwykle prosta i popularna biblioteka, niestety od lat nierozwijana. Co prawda społeczność nie pozwoliła jej wymrzeć i pojawiła się wersja m.in. obslugująca CMake’a, lub obsługująca przestrzenie nazw. Swego czasu napisałem artykuł na jej temat.

Biblioteki warte uwagi

  1. boost – jest to niesamowicie obszerna biblioteka, zawierająca niezliczone funkcjonalności do C++, z których część wchodzi do kolejnych standardów C++. Ludzie określają ją „poczekalnią do standardu” mimo iż wszystko z niej nie wejdzie do standardu. Zawiera ona komponenty header-only, a także inne aspekty, których jest tak wiele, że nie sposób je wymienić. Duża część biblioteki to rozwiązania generyczne (bazujące na szablonach). Osobom zaawansowanym i znającym standard polecam aby się zapoznać z tym co biblioteka boost zawiera. Kiedyś opisałem jak zbudować bibliotekę boost statycznie.
  2. POCO – nazwa dla nas nie brzmi poważnie, ale wywodzi się od Portable Components. Jest to bardzo duża biblioteka, która zawiera pewne użytkowe funkcjonalności m.in. obsługa plików ZIP, wysyłanie i odbieranie maili, wrappery do baz danych, oraz wiele różnych modułów do pracy przez sieć.
  3. GTest & GMock – GTest jest biblioteką do testów automatycznych, w której testy się pisze w bardzo wygodny sposób. GMock jest biblioteką, którą się używa do tworzenia mocków (czyli w skrócie obiektów naśladujących inny obiekt, ale z zaprogramowanym zachowaniem, czy zliczaniem wywołań). Biblioteki te są razem dystrybuowane. Raczej w każdej firmie piszącej testy w C++ są one używane.
  4. OpenCV – jest to biblioteka do operowania na multimediach przy użyciu znanych algorytmów do przetwarzania m.in. obrazów, ale także i wykrywania obiektów.
  5. Lista wybranych bibliotek od mojego kolegi, który też prowadził zajęcia z C++, a samego C++ rozkminia bardziej niż ja.

Pozostałe aspekty

Potrzebujemy małej funkcjonalności z bibliotek zewnętrznej – czy użyć pod modułu powszechnie szanowanej olbrzymiej biblioteki, czy małej biblioteki dostarczającej tylko to co potrzebujemy. Konkretnie – potrzebujemy parser XML i mamy dylemat czy zaciągać całą dużą bibliotekę np. boost lub poco, czy użyć małej, mniej znanej biblioteki, która robi tylko to. Mimo pozorów nie jest łatwo odpowiedzieć na to pytanie. Spotkałem się ze zdaniem, że wszystkie dobre praktyki programistyczne sprowadzają się do ograniczenia zależności. Wg tej zasady nie chcemy dodawać do projektu bibliotek, których nie potrzebujemy. A jak dodawać to tylko to co potrzebujemy (na ile się da). Należy też wiedzieć jakie biblioteki już są w projekcie, oraz co umożliwiają, aby docelowo nie było dwóch bibliotek robiących to samo.

Kolejna kwestia – mamy w projekcie dwie biblioteki – standardową i zewnętrzną, które dostarczają podobną funkcjonalność, którą chcemy użyć – bez naprawdę wyraźnego powodu używamy zawsze standardowe (przykład std:shared_ptr vs boost::shared_ptr).

Mamy jeszcze aspekt do uwzględnienia – użycie bibliotek systemowych (czyli tych co działają tylko na danym systemie, lub rodzinie systemów operacyjnych). Ja osobiście staram się ich unikać gdyż nie są przenośne, ale czasami musimy ich użyć. Na Windowsy jest WinAPI, które ma słabą dokumentacje, ale umożliwia robienie prawie wszystkiego (nawet zapewne wirusy można tam robić). Na Linuxy jest standard POSIX.

Na zakończenie – natrafiwszy na ciekawe biblioteki opisałem ich mały podzbiór w formie artykułów, może kogoś zainteresuje.

Prośba do czytelników

Jeśli masz fajne pomysły jak zmienić ten artykuł – proszę o komentarze:).

Fundacje warte uwagi

Temat niezbyt informatyczny, ale w marcu jeden ze studentów naszego wydziału zginął spadając z V piętra naszego wydziału. Semestr wcześniej miałem z nim zajęcia. Koledzy z roku zebrali dużą kwotę na fundacje, o której nigdy wcześniej nie słyszałem: Telefon zaufania dla Dzieci i Młodzieży 116 111. Stąd zdecydowałem, że muszę rozpropagować informacje, że taka fundacja istnieje.

Przy okazji natknąłem się na wiele fundacji, które faktycznie coś robią, wg mnie pożytecznego, będę więc tutaj wrzucał o nich informacje (żadna z nich mi nie płaci i nie chciałbym, aby to robiły), oto lista:

  1. Telefon zaufania dla Dzieci i Młodzieży – fundacji osobiście nie znam, nie znam też innych o takim profilu. Wywiad z osobą pracującą w podobnej fundacji.
  2. Fundacja Świętego Barnaby – fundacja jest odpowiedzią na potrzeby ludzi „o których zapomniał świat” – poznałem ludzi z tej fundacji osobiście – opowiadali jak wygląda dzień ich pracy kończąc „Kalkuta występuje w Polsce”, co wcześniej opowiadali pominę, bo aż się w głowie nie mieści, że mając niby MOPSy dochodzi do takich sytuacji, dlatego też cenię działalność tej fundacji.
  3. Szlachetna Paczka – jest to inicjatywa, która rzeczywiście coś robi i robi znacznie lepiej niż pomoc państwowa, bo nie daje pieniędzy na lewo i prawo tylko wolontariusze chodzą i sprawdzają rodziny – osoby, które nie szanują darów i myślą, że im się należy bo nie pracują (a mogą) – są wychwytywane (rozmawiałem z wolontariuszami tej inicjatywy). Jest to zdecydowanie lepsza, chociaż trudniejsza, niż po prostu dać forma pomocy, dlatego tę fundację uważam za wartościową. Ciekawostką jest, że założyciel, ksiądz Stryczek studiował na AGH.
  4. Bezcenni – na pierwszy rzut oka fundacja może wydać się kontrowersyjna, ale po przyjrzeniu się jej powinniśmy zobaczyć, że robi to co naprawdę potrzebne. Pomaga matkom oczekującym&wychowującym dzieci w trudnej sytuacji. To jest dopiero piekło kobiet – chcieć mieć dziecko ale być zostawionym sam na sam z problemami i nie wiedzieć innego wyjścia niż … – właśnie wtedy można zwrócić się do tej fundacji o pomoc. Poznałem małżeństwo prowadzące tą fundację – są naprawdę oddani po uszy w pomaganie.

Programy Linuxowe, które mogą się przydać

Na studiach informatycznych wielu z Państwa ma pierwszą lub prawie pierwszą styczność z Linuxem. Oto więc lista programów, które wg mnie mogą się przydać:

  1. OhMyBash – to nie jest program, tylko zestaw ustawień dla domyślnej powłoki (bash), dzięki temu więcej informacji będzie nam prezentowanych od razu, co bardzo ułatwia życie.
  2. ZSH i OhMyZSH – ZSH jest alternatywą dla Basha, wg wielu zdecydowanie lepszą, mimo iż wciąż mniej popularną. Do ZSH polecam zestaw ustawień ułatwiający życie OhMyZSH.
  3. WindTerm – jeśli musisz łączyć się przez SSH i cię męczy konieczność pisania wszystkiego, to jest to narzędzie dla Ciebie. Nie dość, że możesz sobie łatwo dodać zakładki do ścieżek zarówno zdalnych jak i lokalnych, to jeszcze na dodatek masz podgląd plików, które możesz łatwo edytować w ulubionym edytorze, a zmiany lądują na serwerze. Powiem więcej – to narzędzie nie jest tylko na Linuxa.
  4. Intoli/Exodus – jest to narzędzie, przy pomocy którego możemy ominąć brak możliwości zainstalowania wymaganego programu na serwerze (np. uczelnianym), narzędzie kopiuje wybrany program ze wszystkimi narzędziami, że na serwerze zdalnym wszystko działa jakby było zainstalowane.
  5. ZeroTier – jest to narzędzie, dzięki któremu możemy bezpłatnie (póki nie jesteśmy firmą) sobie utworzyć sieć VPN, którą nie musimy zarządzać sami (nie musimy stawiać serwera na publicznym IP). Możemy sobie na swoim komputerze/mikrokomputerze/zaawansowanym routerze wrzucić pewne pliki/usługi i mieć do nich dostęp z kilkudziesięciu urządzeń. Wszystko za darmo … dopóki nie jesteśmy firmą.
  6. Signal – jest to, wg Niebezpiecznik.pl, najbezpieczniejsze narzędzie do komunikacji w internecie, jest to aplikacja na telefony, mając ją można mieć to samo konto na komputerze. Umożliwia wysyłanie wiadomości, plików, prowadzenie rozmów z udostępnianiem ekranu. Wszystko za darmo.
  7. 7-zip [Windows]- jest to darmowa alternatywa do WinRara (wg wielu porównań nie gorsza a nawet lepsza niż WinRar np. porównanie1). Ogólnie jeśli mamy do wyboru piracić WinRara, albo używać nie ustępującego mu w niczym 7-zipa, to nie zaszkodzi być uczciwym:D.
  8. ffmpeg – jest to zestaw narzędzi do obróbki audiowizualnej. Przydatny gdy chcemy np. przekonwertować bezstratnie film na inny format, czy wyjąć muzykę z filmu. Przykładowo:
    ffmpeg -i plik.mp4 -acodec libmp3lame plik.mp3 # - jak można wyjąć dźwięk z filmu
    Narzędzie ma jeszcze takie opcje jak m.in. film na klatki, klatki na film, wycinanie fragmentu z filmu i niezliczone inne opcje. Nie znam lepszego bezpłatnego narzędzia do zabawy z multimediami niż to.
  9. youtube-dl – jest to narzędzie konsolowe na różne systemy, które umożliwia pobieranie filmików z Youtube, jak również całych list odtwarzania. Narzędzie używa biblioteki w pythonie, dzięki czemu sami możemy ściągać łatwo programy.
  10. pdftk – narzędzie konsolowe do modyfikowania plików PDF. Zawiera dużo funkcji, ale najpraktyczniejsza dla mnie to usuwanie hasła z PDFów w następujący sposób:
    pdftk plikZHaslem.pdf input_pw PROMPT output plikWYjsciowyBezHasla.pdf
    Można też wyjąć poszczególne strony:
    pdftk plikOryginalny.pdf cat 1-12 14-end output plikWynikowy.pdf
  11. OnlyOffice – jest to darmowa alternatywa do MS Office, która jest wysoce kompatybilna z formatami MS. Poza tym jest możliwe postawienie OnlyOffice Community Server na własnym serwerze aby mieć prywatną możliwość edycji dokumentów on-line. Dla mniej przekonanych polecam cały artykuł porównujący popularne narzędzia biurowe.
  12. trash-cli -na linuxach komenda rm niestety usuwa permanentnie, dlatego polecam sobie skonfigurować narzędzie obsługujęce kosz przy pomocy komend, a także ustawienie aliasu na komendę usuwającą aby domyślnie usuwało do kosza:
    alias rm='trash-put'
  13. Ventoy – multiplatformowy program do robienia bootowalnych USB, jego główną zaletą jest to, że raz przygotowujemy pendrive, a następnie tylko w razie potrzeby dorzucamy obraz na dowolnym komputerze (nie musi być na każdym zainstalowane to oprogramowanie)
  14. TODO: Kate, dia + dia-shapes, audacity, neovim, meld, gimp, pass, db-braver, thunderbird, LibreOffice Draw, exchodus

Wiosenne Targi pracy + Wampiriada + sposobność dla osób studiujących bez doświadczenia

Dwa razy w roku są okresy intensywnego występowania targów pracy. Właśnie teraz jest wiosna, a oto lista jaką znalazłem:
– Targi Pracy AGH: https://www.targi.agh.edu.pl/ 21-22 marca 2023
– Jobicon: https://jobicon.pracuj.pl/krakow/

Dlaczego warto iść na targi pracy:
Są to miejsca gdzie do nas przychodzą potencjalni pracodawcy (głównie IT), możemy się rozeznać na rynku – jakich technologii poszukują, gdzie mają siedzibę, czy są nowe projekty, czy mają staże dla osób bez doświadczenia, czy przyjmują po I roku studiów. Czy akceptują niepełny etat. Ile płacą. Poza tym oferują wiele gadżetów, konkursów itp. Można też skonsultować swoje CV itp. Poza tym jak ktoś chce iść na staż na najbliższe wakacje to może być ostatni dzwonek.

Wampiriada AGH: 20 – 25 marca 2023

Dlaczego warto oddać krew opisałem tutaj: https://demotywatory.pl/5109238/Jak-miec-dlugi-weekend-i-zrobic-cos-pozytecznego-rownoczesnie

Bonus:
Możliwość pracy na każdym poziomie doświadczenia w niepełnym & elastycznym czasie pracy. Akcja podobna jak: https://programowaniec.wordpress.com/2021/06/01/staz-zadaniowy-prototypowanie-aplikacji/,
o szczegóły możecie pytać starszych kolegów, którzy korzystali w poprzednich latach). Proponowane spotkanie zdalne celem dopytania o szczegóły: 24 marca o 21:00. Link do spotkania

PS: Moich studentów zachęcam do współtworzenia strony z pytaniami na rozmowy kwalifikacyjne:
https://programowaniec.wordpress.com/2022/06/13/rozmowy-kwalifikacyjne-pytania/ – hasło na zajęciach