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!

Ł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

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:).

Dodatkowe materiały do przestudiowania na różnym poziomie zaawansowania

Część z Państwa pyta mnie gdzie szukać informacji o…, poza tym jest wiele rzeczy, które Państwu polecam na różnym stopniu zaawansowania. Poniżej podlinkowanie:

  • Wiedza po semestrze języka C, początku C++
  1. Docker pod względem zastosowań programisty C++ – prawdę powiedziawszy w tym artykule nie ma wiele C++, opisane jest za to narzędzi Docker, które się jednak używa, warto o nim poczytać, oraz umieć je użyć w razie potrzeby.
  2. CMake w praktyce – jest to narzędzie do generowania systemów budowania na różne systemy i środowiska, bardzo popularny, na tyle że bez niego może być ciężko się obejść programiście. Dlatego zachęcam aby przeczytania od razu, bo ileż to może nam ułatwić potem późniejszą naukę.

2. Środek semestru z C++ – już podstawy klas, konstruktory, destruktory

  1. Wyrażenia regularne w C++ (od wersji C++11) – jest to wiedza przydatna niezależnie od tego czy chcemy w przyszłości programować w C++, czy nie. Jak sprawnie przeszukiwać tekst. Polecam każdemu!
  2. Praca z tekstem przy pomocy biblioteki boost, a także jak sobie bez niej obejść przy podstawowych operacjach (algorytmy STL) – artykuł mojego autorstwa, którego się trochę wstydzę, bo napisany zanim zdobyłem doświadczenie. Niemniej jednak zawiera cenne informacje.
  3. Testy jednostkowe w bibliotece GTest – w programowaniu coraz popularniejsze jest podejście TDD – czyli jak mamy coś robić to robimy wpierw testy. Dlatego odsyłam do opisu jak używać do testów najpopularniejszej biblioteki testującej w C++.
  4. Inteligentne wskaźniki w C++ – coś co należy używać zamiast `new`, dlatego polecam artykuł!

3. Koniec semestru

  1. Bezpłatne narzędzia do wykrywania błędów w programach – firmy wiedzą, że im później błąd zostanie wykryty tym drożej dla firmy, dlatego nie zważając na to jak bardzo zgnoi się prace informatyków włączają dodatkowe narzędzia diagnostyczne, warto je poznać. Odsyłam też do artykułu o flagach na gcc.

4. Po zaliczeniu semestru z C++

  1. Manager pakietów Conan – jak niezależnie od systemu doinstalowywać biblioteki do projektu w C++. Warto przeczytać przynajmniej pobieżnie.
  2. Ciekawe obalenie mitu, że C jest zawsze szybszy niż C++

Inne

  1. Książki do C++ na różnych etapach zaawansowania (większości nie czytałem)

Strona w trakcie edycji….

Pomysły na projekty, oraz najciekawsze projekty jakie studenci oddawali na moich zajęciach

Najciekawsze/najlepsze projekty w roku akademickim 2023/2024

Najciekawsze projekty 2023/2024 – przedmiot: „Podstawy programowania 2”, I rok II semestr

  1. Narzędzie, które pomaga forkować projekty udostępnione do sprawdzenia przez Bobota. Program pobiera przy użyciu GItlab API listę projektów z grupy na Gitlabie, forkuje we wskazane miejsce, klonuje lokalnie, są możliwe też inne operacje przy pomocy API Gitlaba. Biblioteki cpp-inquirer, cpp-httplib, spinners, {fmt}, json (link za zgodą autora).
  2. Narzędzie informujące na Discordzie, że dana jest w trakcie zajęć na uczelni, z wskazaniem dokładnych zajęć w oparciu o dane systemu USOS (lub inny zdalny kalendarz). Biblioteki: curl, fmt::format, date, discord-rpc, toml++, embed do CMake’a, lzdata. Poza tym użyty CMake pobiera wszystkie zależności (link za zgodą autora).
  3. Program korzystający z API Last.fm celem pobierania informacji o utworach, artystach i użytkownikach, korzystający z bibliotek nlohmann/json i httplib (link za zgodą autora).

Najciekawsze/najlepsze projekty w roku akademickim 2022/2023

Najciekawsze projekty 2022/2023 – przedmiot: „Język C++”, II rok IV semestr

  1. Narzędzie odpytujące Spotify przez SpotifyApi zwracające informacje o wykonawcach i piosenkach [biblioteki: curl, wxWidgets,, nlohmann/json] (link za zgodą autora)
  2. Narzędzie do zaznaczania obecności na UPELu w terminie zajęć [biblioteki: spdlog, CPR, simdjson] (link za zgodą autora).
  3. Kalkulator linii produkcyjnej w fabryce [biblioteka nlohmann/json] (link za zgodą autora).
  4. Wizualizator różnych algorytmów sortowania [biblioteki: sfml] (link za zgodą autora)
  5. Bardzo profesjonalnie zrobiony program do gry w szachy [sfml] umożliwiający grę dla dwóch osób (jest zgoda na link, ale gdy będzie ostateczna wersja)
  6. Programik, który porównuje wymagania względem gry ze Streama i oznajmia, czy u nas na komputerze pójdzie [biblioteki: infoware, winapi] (link za zgodą autora)
  7. Kółko i krzyżyk w blockchainie Solana [biblioteka: SolanaSDK](link za zgodą autora)
  8. Program do wyświetlania informacji o krajach [biblioteki: cpr, curl, nlohmann/json, FLTK](link za zgodą autora), a wszystki w około 200 liniach.
  9. Program do wizualizacji geometrii 3D w C++ i porównanie z pythonem (link za zgodą autora)
  10. Biblioteka rozszerzająca SFMLa o przyciski i sceny (jest zgoda na link)
  11. Programik do regularnego pobierania danych z gry Plemiona [](jest zgoda na link)
  12. Saper 3D w OpenGD, gdzie plansza się kręci [biblioteki: OpenGL i alsa](link za zgodą autorek)
  13. Projekt przeliczający koszta wyrzucenia określonego ładunku w kosmos [QT]
  14. Program, który w oparciu o link do filmu tłumaczy na polski (chatGPT), konwertuje na napisy, generuje obrazy i tworzy gotowy film [biblioteki: libcurl, nlohmann/json] (jest zgoda na link)
  15. Program, który dla podanego nazwiska wyświetli informacje pobrane z internetu (częscość występowania, liczba osób itp)[libxml, curl] (link za zgodą autora)
  16. Narzędzie wyswietlające pogodę dla podanego miasta [libcurl, JsonCpp] (link za zgodą autora)
  17. Narzędzie, które dla „dzisiaj” wyświetla alergeny dla danej strefy [cpr] (link za zgodą autora)
  18. Gra Milionerzy, zrobiona porządnie w najdrobniejszych szczegółach (w tym ciekawie rozwiązany telefon do przyjaciela) [sfml](jest zgoda na link)
  19. Puzzle generowane w kształtach tetriso-podobnych, które można podnosić i opuszczać ponownie (gra wg własnej koncepcji)[sfml](link za zgodą autora)
  20. Symulator fizycznych interakcji między cząsteczkami, które można konfigurować [cuda, OpenGL](link za zgodą autora)
  21. Gra milionerzy graficznie, ale pytania są generowane przez ChatGPT [curl, Qt]
  22. Pokedex – narzędzie wyświetlające graficzne zdjęcie wraz ze statystykami podanego pokemona [Qt]
  23. Steganografia – ukrywanie jednego obrazku w drugim i wyjmowaniu [imagemagic++] (link za zgodą autora)
  24. Konwerter obrazów na kodi UTF-8 przy pomocy różnych algorytmów [sstdimage](link za zgodą autora)
  25. Pobieranie wizualnej pogody dla danego miasta [Qt] (link za zgodą autora)
  26. Pobieranie informacji o ofertach z gry WOW [wxwidgets, curl, n/json](link za zgodą autora)
  27. Program do wykrywania chwytów wspinaczkowych na zdjęciach [openCV] (link za zgodą autora)
  28. Program sprawdzający dla danego miasta czy powinno się już zmienić opony [curl, rapidJSON] (link za zgodą autora)
  29. Program do nauki słówek – podaje się zdania w dwóch językach, z których potem jest chowany jeden wyraz [Qt] (link za zgodą autora)
  30. Program pobierający losowy cytat z internetu znanej osoby i możliwość powiedzenia go przez robotyczną postać [Qt] (link za zgodą autora)
  31. Symulatog gry w brydża z komputerem [Qt] (link za zgodą autora)
  32. Programik, który pobiera informacje o występowaniu polskich nazwisk (z polskimi znakami) (link za zgodą autora)

Najciekawsze projekty 2022/2023 – przedmiot: „Podstawy programowania 2”, I rok II semestr

  1. Program odpowiadający na maila delegujący zapytania do sztucznej inteligencji i wysyłający odpowiedź mailową [biblioteki Poco, OpenAi, libcurl, nlohmann/json] (link za zgodą autora)
  2. Własna chmura przy pomocy gniazd do zarządzania plikami i katalogami [biblioteka Winsocket2] (link za zgodą autora)
  3. Program do symulacji sprężystych ciał fizycznych [biblioteki: glad, imgui, grfw](link za zgodą autora)
  4. Okienkowy kalkulator operacji macierzowych [biblioteki: Eigen – do operacjii algebraicznych, qt] (link za zgodą autora)
  5. Aplikacja pobierająca pytania z otwartej bazy Trivia dla różnego poziomu trudności z wskazanej kategorii w sposób interaktywny [biblioteki: lamarrr/chalk, curl, nlohmann/json, aelliixx/cpp-inquirer](link za zgodą autora)
  6. Keylogger – program pobierający naciśnięcia wszystkich klawiszy na Windowsie i zapisujący to do pliku, program nie jest widoczny w pasku zadań [WinAPI]
  7. Narzędzie przy pomocy biblioteki JUICE do konfigurowalnego tłumienia wysokich i niskich częstotliwości w czasie rzeczywistym (link za zgodą autora)
  8. Kółko i krzyżyk dla dwóch graczy w konsoli, ale komunikacja odbywa się przez serwer sieciowy [biblioteka boost](jest zgoda na link, ale po wstawieniu poprawek)

Najciekawsze/najlepsze projekty w roku akademickim 2021/2022

Najciekawsze projekty 2021/2022 (II rok) – przedmiot: „Język C++”, II rok IV semestr

  1. Symulator fizyki do spadającego piasku, wody i toksyczności (link za zgodą autora)
  2. Gra w piłkę na kartce (tak jak się grywało w szkole), (link za zgodą autora jak go będę miał…)
  3. Downloader do memów ze strony Kwejk.pl przy użyciu libcurl + OpenCV (link za zgodą autora)
  4. Lite-node do blockchaina własnego autorstwa (link za zgodą autora)
  5. Pobieranie tekstów piosenek z Tekstowo.pl wraz z tłumaczeniami, zapamiętywanie w bazie i wyszukiwanie na youtube (link za zgodą autora)
  6. Analiza szeregów czasowych: współpraca C++ i Pythona: W zeszycie Jupytera jest robiony moduł ściągający zadane strony, a w kolejnych „komórkach” odbywa się operowanie na tych danych (link za zgodą autorów)
  7. Narzędzie command-line do pakowanie/rozpakowywania przy pomocy kodowania Huffmana (link za zgodą autora)
  8. Aplikacja pobierająca z chess.com informacje o szachistach, meczach i innych (link za zgodą autora)
  9. Własny blockchain i implementacja Lite Node’ów. Użyto m.in. bibliotek libbitcoin i innej do szyfrowania (link za zgodą autora)
  10. Narzędzie do wyświetlania zadanego tekstu w sposób wyrafinowany przy pomocy kodów ASCII (źródło liter) – jest to (na moment prezentacji) jedyne narzędzie offline do tego celu!
  11. Narzędzie prezentujące statystyki czasu poświęconego na seriale przez te wszystkie lata od kiedy się ma konto na netflixie (link za zgodą autora). Warto, aby każdy kto ogląda seriale sobie sprawdził, aby potem odpowiedzieć na pytanie – ile by można zrobić przez ten czas 😉 .
  12. Program, który dla podanych zdjęć stosuje modele sztucznej inteligencji w celu wykrywania różnych przedmiotów z pewnym prawdopodobieństwem. Użyto frameworków: Yolo, OpenCV, WxWidgets (link za zgodą autora, prezentacja dla niewtajemniczonych w sztuczną inteligencję również za zgodą autora).

Najciekawsze projekty 2021/2022 (I rok) – przedmiot: „Podstawy programowania 2” (projekt nieobowiązkowy)

  1. Brainfuck IDE – edytor tekstowy z kolorowaniem składni tego języka, wraz z interpreterem, obsługą błędów, predefiniowanymi przykładami kodu, w QT. Możliwe, że najbardziej rozwinięty w internecie IDE offline! (link za zgodą autora, komentarz autora: „Przyjemnie się to robiło” – o to chodzi!)
  2. Narzędzie, które pobiera aktualne kursy walut ze strony: Currencyapi.com przy pomocy biblioteki CPR, parsuje przy pomocy: nlohmann/json i przelicza (link za zgodą autora). A wszystko w mniej niż 60 linii kodu. Nie ilość, a pomysł!
  3. Programik do generowania melodii dla zadanych parametrów (stereo/mono, częstotliwość próbkowania, głębokość bitów) do pliku .wav (link za zgodą autora)
  4. Kalkulator graficzny dla różnych funkcji (trygonometryczne, cyklometryczne, wielomianowe, wykładnicze, logarytmiczne) z możliwością ich zagnieżdżania i wyliczeń dla różnych argumentów (link za zgodą autora)
  5. Symulator czarnej dziury w SFMLu i sposobu oddziaływania z fotonami światła (link za zgodą autora)
  6. Narzędzie do ewidencjonowania co ściągamy z magazynu synchronizujące się z serwerem napisanym w Pythonie (link za zgodą autora)
  7. Narzędzie do wyszukiwania studentów po numerach albumów, imionach/nazwiskach/mailach (dla bazy załadowanej z pliku) w GTK+ (link za zgodą autora)
  8. Generator postaci dla gier wyobraźni w systemie DeadLands (link za zgodą autorów)
  9. Gra 3d w silniku Unreal Engine – poruszanie się sześcianem po planszy, z której można spaść (link za zgodą autora – jak go będę miał).
  10. Manager haseł, szyfrujący i wstawiający do bazy danych (link za zgodą autora)
  11. Aplikacja, która wykrywa włożenie pendrive’a i wyświetla z niego pliki tekstowe (link za zgodą autora)
  12. Generator do memów OpenCV + GTK (link za zgodą autora)
  13. Program, w którym podajemy zdjęcia i z nich robi jeżdżące puzzle różnej wielkości (link za zgodą autorki)

Najciekawsze projekty 2020/2021 (I rok, I semestr) – przedmiot: „Podstawy programowania 1

  1. Gra milionerzy w konsoli z odtwarzaniem dźwięku
  2. Rysowanie fraktali -animacja zagęszczająca
  3. Program, który z wczytanego obrazka rozpoznaje tekst (rzekomo GTK to ma)
  4. Program, który ze strony NBP pobiera informacje o walutach i wyświetla zmiane z poprzedniego dnia – kolorami w konsoli
  5. Program pobierający informacje o położeniu stacji badawczej i pokazującej na mapie aktualizowane na bieżąco
  6. Wędkarz w konsoli z obrazkami, ciekawą fabułą łowienia i różnymi poziomami trudności, gra na refleks

Najciekawsze projekty 2019/2020 (II rok):

  1. Wizualizacja sceny 2D w 3D w konsoli
  2. Pobieranie obrazków z internetu na podstawie słów kluczowych i ustawianie takiej tapety na Windowsie
  3. Symulator samochodu – kod pisany na prawdziwy samochodzik w ramach konkursów międzyuczelnianych
  4. W pewnej grze wykrywanie punktu w czasie, w którym należy nacisnąć klawisz -jest na to bardzo mało czasu i wymagany jest duży refleks.
  5. Komunikator sieciowy okienkowy
  6. Manager haseł
  7. Szyfrowanie (szyfr Vigenere)
  8. Kompresja plików przy pomocy rzekomo najszybszej biblioteki do kompresji
  9. Obracanie kaczuszki w 3D
  10. Generowanie fraktali
  11. Generowanie szumów na GPU/CPU
  12. Organizer zadań
  13. Trenowanie sieci neuronowej
  14. Serwer danych dla siłowni
  15. Gra do treningu obstawiania które akcje rosną, a które nie (rzeczywiste dane) – można przeglądać i się dostaje punkty zależnie od tego czy się zgadło, czy nie
  16. game of life
  17. Baza filmów, z pobieraniem z intenretu
  18. Saper okienkowo i w konsoli
  19. Gra polegająca na przesuwaniu piłeczek
  20. poker
  21. gra na dwoch graczy żeby wspólnie przechodzili przez poziomy przez gniazda
  22. Program do rozwiązywania kostki rubika 2na2
  23. Symulator odbijających się piłek

Najciekawsze projekty 2019/2020 (I rok – programowanie imperatywne)

  1. Keyloger na Windowsa jako proces
  2. Dane na temat koronawirusa: apify.com
  3. Program do edycji utworów (poprzez ustawianie nut, metronum itp) (pliki *.wav)
  4. Informacje o sieci: lokup, ping, skaner portów: winapi
  5. Plik do edycji plików muzycznych, oraz do wyświetlania informacji o nich: libsndfile
  6. Program do sprawdzania pogody: openweather, libcurl, json,
  7. Towel defence, że się strzela do psów
  8. Szachy dla 2 osób
  9. Portfel do zakupu akcji wirtualny portfel z aktualizacją cen akcji ze strony bankier.pl
  10. Program w C++, który otwiera moduł w Lua, który z kolei woła funkcje z C++

Pomysły ode mnie (jakby ktoś szukał inspiracji)

  1. Program, który po podaniu nazwiska wyświetli informacje jaki herb jest dla tego nazwiska, ewentualnie czy osoby o danym nazwisku to hrabiowie lub nawet książęta. Takie dane można pobrać np. z Wikipedii, przykładowy herb: Topór (inne nazwy herbu to m.in. Wścieklica).
  2. Pobieranie memów z wybranej strony.
  3. Pobieranie danych z gry-online, przy użyciu odpowiedniego API i wyciągnięcie z nich odpowiednich informacji.
  4. Kółko i krzyżyk graficznie.
  5. Okręty (mogą być albo graficznie, albo konsolowo z dźwiękiem, albo przez sieć)
  6. Pobieranie rozkładu konkretnej linii z konkretnego przystanku (najbliższe odjazdy)
  7. Wyszukiwarka plików .doc po zawartości wewnętrznej
  8. Gierka w jakiejś bibliotece graficznej np. wąż
  9. Symulatory np. przejazdów przez skrzyżowanie
  10. Narzędzie do automatycznego odpowiadania na określone maile
  11. Narzędzie do sprawdzania obecności na podstawie obrazu z kamery (w sumie tutaj wystarczy użyć OpenCV, oto gotowy kod, który tylko zadaptować):
    https://www.docs.opencv.org/2.4/modules/contrib/doc/facerec/facerec_tutorial.html
  12. Strona internetowa w C++ umożliwiająca zalogowanie, wysłanie pliku graficznego i przejrzenie wcześniej załączonych plików
  13. Program, który wrzuci do bazy danych obejrzany film, oraz informacje o nim w rodzaju: komentarz, kiedy obejrzany, opis itp. oraz będzie umożliwiał potem wyszukiwanie w tej bazie
  14. Program do wykrywania czegoś w kodzie C lub C++ np. ilości funkcji, linii, klas itp
  15. Komunikator przy użyciu gniazd
  16. Generowanie określonych PDFów np. generujący certyfikat uruchomienia programu, lub świadectwo z paskiem
  17. Program operujący na bazie danych np. gra milionerzy, która pytania odczytuje z bazy danych
  18. Operacje na obrazkach, np. łączenie, kadrowanie itp.
  19. Łączenie plików muzycznych
  20. Programik, który zahibernuje/wyłączy komputer po określonym czasie
  21. Programik, który odczyta z pendrive’a konkretny plik i wyświetli
  22. Program, który łączy z wifi na podstawie bazy danych
  23. Programik, który wysyła coś przez ftp/sftp
  24. Program pobierający z internetu np. kursy walut, wyniki meczów
  25. Wiki-tłumacz – wyszukiwanie hasła na Wikipedii i zwracanie go w innym języku
  26. Generowanie fraktali (w GUI, do pliku, w konsoli przy pomocy jakiejś biblioteki) np. implementacja Dywanu Sierpińskiego (https://pl.wikipedia.org/wiki/Dywan_Sierpi%C5%84skiego)
  27. Sprawdzacz nazwiska: https://polskienazwiska.pl/n/Kowalski
  28. Narzędzie, które w oparciu o link do Wikipedii (osoby) wyświetli jej dzieci z datami kiedy żyły (tak długo dopóki dzieci będą i będą możliwe do „kliknięcia”.
  29. Ostatnio jest modne tworzenie gier gdzie gdy widzowie przelewają pieniądze coś się dzieje np. to. Czemu by nie zrobić czegoś takiego w C++.
  30. Aplikacja do określonej modlitwy/nowenny na telefon w C++ (zaznaczanie postępu, modlitwa na każdy dzień, przypomnienia)
  31. WikiRacer – pomysł z uniwersytetu Stanforda, inny przykłed z tejże uczelni – HashMap.

Zestawienie materiałów na zajęcia organizacyjne

Najwięcej przydatnych materiałów do nauki programowania C i C++ (m.in. dokumentacja, polecane książki, kursy wideo, narzędzia do treningu online judge, ciekawe wystąpienia konferencji CppCon) znajdują się w przydatnych linkach. Oczywiście pisząc kod w C/C++ warto się zapoznać ze środowiskami programistycznymi do tych języków. Należy też pamiętać, że kod należy pisać nie tylko aby działał, ale abyśmy za tydzień wiedzieli o co w nim chodzi, w tym celu odsyłam do wytycznych na temat programowania, jeśli ktoś woli w drugą stronę istnieje konkurs na najnieczytelniejszy kod.

Nie zapomnijmy też zapoznać się z częstymi błędami w C++, nie zapomniałem też o osobach zaawansowanych w programowaniu w C++, oraz tutaj. Programiści C++ mogą jeszcze zapoznać się z instrukcją jak dołączyć niemalże dowolną bibliotekę do projektu przy pomocy managera pakietów VCPKG, a dla zaawansowanych zbudować bibliotekę boost i bibliotekę gtest. W temacie bibliotek niestandardowych polecam to zestawienie.

Z kolei osoby uczące się programować w C mogą znaleźć pewne informacje w kursie języka C, który kiedyś napisałem, ale mogą się pojawić tam błędy.

Nic tak nie uczy programowania jak realizacja projektu, zachęcam do przejrzenia listy tematów projektów zaliczeniowych, wraz z najciekawszymi z poprzednich lat.

Z interesujących rzeczy polecam ranking popularności języków programowania aktualizowany na podstawie wyników z wielu wyszukiwarek co miesiąc. W temacie wielu języków programowania polecam środowisko programistyczne on-line, oraz wybierać się na targi pracy na AGH (chociaż nie tylko), aby obserwować zapotrzebowanie na specjalizacje informatyków.

Osoby, które nie wykluczają przyszłej styczności z linuxami odsyłam do strony z podstawowymi komendali linuxa. Oczywiście też warto wybrać linuxa dla siebie, swoją prywatną opinię o najlepszych linuxach dla informatyka zawarłem tutaj.

Wreszcie polecam nauczyć się używania gita, gdyż programiści pracujący w zespole synchronizują swoją pracę przy pomocy repozytorium, najczęściej jest nim git. Na koniec dodam informacje, nad którą ubolewam -w informatyce bez angielskiego ani rusz. Oczywiście nie należy wierzyć bezmyślnie we wszystko co mówi prowadzący, dlatego też podrzucam, dlatego polecam też artykuł mojego kolegi z roku, który odniósł duży sukces w IT, oraz artykuł 3 kluczowe umiejętności programisty.

Często mówi się, że informatyk musi się douczać aby nie zostać dinozaurem, który wyginie na rynku pracy. Nie ma na to reguł jak nim nie zostać. Ja interesuje się C++, dlatego śledzę konferencje o C++ np. CppCon. A temat, który chcę zgłębić materializuje w formie artykułu, kilka już ich napisałem. Tę ścieżkę polegam, gdyż jak tylko czytamy to nam szybciej wylatuje niż gdy jeszcze musimy tę informacje przetworzyć aby coś utworzyć do czego się łatwo wraca. W temacie innych technologii – chodzić na obiady z kolegami z pracy i wykazywać zainteresowanie temu co mówią, a co nas zainteresuje to doczytać.

Osoby z AGH na stronie znajdą informacje o konfiguracji maila, VPNa, WIFI,  antywirusa.

Teraz trochę na luzach – studencka znajomość życia w Krakowie. A jeszcze bardziej na luzach, oraz w związku z tym, że informatyk-prowadzący również jest człowiekiem odsyłam do strony z tym co polecam prywatnie.

Informatyk/programista/komputerowiec, to też ludzie – życie jest pracą, ale praca nie jest życiem. Dla niektórych: „Życie zaczyna się po pracy” – postanowiłem więc opisywać pewne rzeczy nieinformatyczne, które mnie szczególnie tknęły, polecam: programista też człowiek.

Jak zbudować bibliotekę Boost C++

Jest to biblioteka będąca potocznie nazywaną „standard 2.0 dla C++”, albo „poczekalnia do standardu C++”. Umożliwia bardzo wiele rzeczy, które robi się przy jej pomocy bardzo wygodnie i w dużym stopniu niezależnie od systemu operacyjnego (Windows czy Linux czy inne).  Na czas pisania artykułu mamy wersję 1.70 niniejszej biblioteki.


Przed przejściem dalej należy odpowiedzieć sobie na pytanie czy na pewno potrzebuję ją budować od nowa całą, a może da się zrobić to prościej? Większość komponentów/podbibliotek to tylko nagłówki (ang. header-only), czyli aby jej użyć nie trzeba budować. Gdy Twoja biblioteka musi być zbudowana to jeśli jesteś użytkownikiem linuxów to wiesz jak zainstalować z repozytorium (co prawda bardzo rzadko jest najnowsza wersja). Jeśli z kolei użytkownikiem Windowsa masz dostępne na stronie pobierania „Prebuilt windows binaries” (oczywiście tylko dla wersji Visual Studio, dla innych kompilatorów musisz sobie zbudować).
Jeśli z jakiegoś powodu ww. warianty Ci nie wystarczają zapraszam dalej.


Przed instalacją należy bibliotekę pobrać (najlepiej ze strony projektu) i rozpakować. Potem należy przejrzeć instrukcję „zaczynamy” (ang. „Getting started”) na swoim systemie. Załóżmy, że główny katalog rozpakowanej biblioteki to $(BOOST).

Instalacja na Windowsie przy pomocy MinGw

Jest to nieszablonowy przypadek, dlatego go opiszę.

  1. Musimy mieć nasz kompilator na zmiennej środowiskowej PATH.
  2. Budujemy dla mingw (mingw to gcc dla Windows, dlatego toolset=gcc):
    1. $(BOOST)\tools\build\b2.exe toolset=gcc –prefix=”gdzieChcemyZbudowac\”  link=static install
      powyższa opcja skompiluje i zainstaluje nam całego boosta, jeśli nie chcemy całego:
    2. Możemy wyświetlić jakie są biblioteki:
      $(BOOST)\tools\build\b2.exe –show-libraries
      mając tę listę możemy zbudować wybrane komponenty np. tak:
      $(BOOST)\tools\build\b2.exe –with-program_options –with-system –with-filesystem toolset=gcc –prefix=”gdzieChcemyZbudowac\” link=static install
    3. Jak zbudujemy pojawi się nam gdzie jak użyć includów i gdzie są biblioteki skompilowane np.:
      The following directory should be added to compiler include paths:
      C:\Users\user\Desktop\boost_1_70_0
      The following directory should be added to linker library paths:
      C:\Users\user\Desktop\boost_1_70_0\stage\lib
    4. Gotowe!

Budowanie i instalacja na linuxie

Budowanie pod linuxem jest proste i w pełni opisane w instrukcji.

Aby zbudować boosta w pełni w domyślnej lokalizacji (do której należy mieć uprawnienia administratora) wystarczy najzwyczajniej w świecie zawołać komendy:

./bootstrap.sh
./b2 install

Jeśli chcemy jednak zainstalować bibliotę w innej lokalizacji musimy użyć

--prefix=lokalizacja/gdzie/chcemy/zainstalować

Jeśli też nie potrzebujemy budować wszystkich bibliotek (bo nie będziemy wszystkich używać) polecam użyć opcji:

--with-libraries=biblioteka1,biblioteka2

aby się dowiedzieć jakie mamy biblioteki można zawołać:

./bootstrap.sh --show-libraries

w moim przypadku dało to listę bibliotek (skróciłem wydruk wielolinijkowy):

atomic, chrono, container, context, contract, coroutine, date_time, exception, fiber, filesystem, graph, graph_parallel, headers, iostreams, locale, log, math, mpi, program_options, python, random, regex, serialization, stacktrace, system, test, thread, timer, type_erasure, wave

Wiedząc to wszystko możemy zbudować kilka bibliotek w interesującej nas lokalizacji:

./bootstrap.sh --with-libraries=stacktrace,program_options,container,system --prefix=/home/agh/Desktop/boost_zbudowany/

mając to możemy komendę budującą jw., ale ja wolę sobie zbudować biblioteki statycznie:

./b2 link=static install

w rezultacie pojawią się biblioteki we wskazanym katalogu. Teraz należy jeszcze kompilując nasz program podać ścieżki do nagłówków i skompilowanych bibliotek.


Program przy użyciu boost

Możemy sobie pobrać przykład z program_options albo otworzyć z

$(katalogZPobranymBoostem)/libs/program_options/example/first.cpp

Mając gotowy kod możemy zbudować, przykładowo:

g++ first.cpp -I/home/agh/Desktop/boost_zbudowany/include -L/home/agh/Desktop/boost_zbudowany -lboost_program_options -o program.exe

i wszystko działa!


Dorzucenie części boosta do projektu

Może się zdarzyć, że chcemy tylko jedną bibliotekę dorzucić do projektu, nie chcemy dorzucać zbt dużej ilości zależności (cały boost to ponad 100 Mb), dlatego można użyć:

./b2 tools/bcp # to nam zbuduje to narzędzie

Następnie możemy sobie go użyć:

${sciezkaDoBcb}/bcp boost/naglowek.hpp sciezka/gdzie/wrzucic/zaleznosci

Instalacja gtest na Linuxie lub Windowsie

Jak wiemy przy każdym, rozwijającym się produkcie jego skomplikowanie rośnie, a im bardziej skomplikowany tym łatwiej wprowadzić błąd. Dlatego też stosuje się testy m.in. jednostkowe -aby przetestować poprawność jakiejś jednostki kodu, oraz aby w razie modyfikowania jednostek używanych przez inne jednostki zwiększyć prawdopodobieństwo tego, że nic nie popsuliśmy.

W języku C++ najpopularniejszą biblioteką jest gtest, możemy też testować przy jego pomocy programy napisane w języku C.
Gtesta możemy zainstalować z linuxoweo repozytorium pakietów, np. w dystrybucjach debianowych piszemy:

sudo apt-get install libgtest-dev

aczkolwiek polecam pobranie z oficjalnej strony źródeł i samodzielne zbudowanie. Pobierając z oficjalnej strony mamy pewność, że dysponujemy najnowszą wersją.

Budowanie gtesta ze źródeł
Jeśli zdecydujemy się na ten krok możemy zamiast ręcznego pobierania z oficjalnej strony pobrać całe repozytorium, w tym celu wystarczy w terminalu wpisać:

git clone https://github.com/abseil/googletest.git

Po pobraniu należy wejść do katalogu z rozpakowanym gtestem, i możemy to zainstalować.

Instalacja gtesta dla całego systemu (gdy dysponujemy odpowiednimi uprawnieniami)
Jeśli mamy uprawnienia i chęci instalacji gtesta dla całego systemu wystarczy będąc w katalogu z rozpakowaną biblioteką zawołać w terminalu:

cmake .
make
sudo make install

Instalacja gtesta nie dla całego systemu
Oczywiście jeśli nie będziemy mieli uprawnień do instalacji w systemie musimy zainstalować to w innej lokalizacji, wtedy nasza komenda instalacji będzie się troszeczkę różnić:

cmake -DCMAKE_INSTALL_PREFIX=/katalog/gdzie/mamy/uprawnienia .
make
make install

Osoby lubiące widzieć co się dzieje mogą dodać do make opcję

VERBOSE=1

aby widzieć jak jest budowany gtest.

Budowanie gtesta bez cmake’a
Jeśli ktoś nie ma cmake’a może sobie zwyczajnie skompilować bibliotekę samodzielnie, w tym celu budujemy wszystkie znalezione tam pliki .cc (poza plikiem gtest_main.cc, chyba, że ktoś chce mieć od razu funkcję main w formie biblioteki).
Aby to zrobić należy będąc w katalogu, gdzie jest rozpakowany gtest zastosować komendy:

g++ -Igoogletest/include -Igoogletest  -Wall -Wshadow -Werror -Wno-error=dangling-else -DGTEST_HAS_PTHREAD=1 -fexceptions -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -o gtest-all.cc.o -c googletest/src/gtest-all.cc
ar qc libgtest.a gtest-all.cc.o
g++ -isystem googletest/include -Igoogletest  -Wall -Wshadow -Werror -Wno-error=dangling-else -DGTEST_HAS_PTHREAD=1 -fexceptions -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -o gtest_main.cc.o -c googletest/src/gtest_main.cc
ar qc libgtest_main.a gtest_main.cc.o

Teraz ponownie powraca kwestia uprawnień do instalacji w systemie, jeśli samodzielnie budowaliśmy cmake’a i mamy uprawnienia możemy zainstalować go do całego systemu:
– wszystkie includy przenieść do: /usr/local/include/gtest
– skompilowane biblioteki (pliki *.a) do: /usr/local/lib/
– Pliki *.pc do: /usr/local/lib/pkgconfig/

Kompilacja programu używającego gtesta
Po zbudowaniu/zainstalowaniu biblioteki gtest możemy go używać. W tym celu potrzebujemy załączyć:

#include 

a podczas linkowania potrzebujemy flag:

-lgtest i -pthread

np. program o nazwie test.cc kompilujemy:

g++ test.cc -lgtest -pthread -o program

Jeśli nie instalowaliśmy biblioteki dla całego systemu również przy każdej kompilacji musimy wskazywać ścieżki do nagłówków gtesta, oraz podczas linkowania podawać ścieżki do skompilowanych bibliotek:

g++ -isystem/sciezka/do/gtest/include test.cc -L/sciezka/do/gtest/lib -lgtest -pthread -o program

To wszystko, można działać.


Budowanie na systemie Windows

  1. Musimy mieć jak wcześniej CMAKEa oraz polecam Cmake-Gui.
  2. Pobieramy naszego gTesta (np. stąd), rozpakowywujemy.
  3. Wchodzimy do głównego katalogu naszego gTesta z poziomu Cmake-Gui, potem poniżej podajemy ścieżkę do zbudowania.
  4. Mając to klikami Configure, pojawi się nam zestaw narzędzi, ja wybrałem MinGw, ale to zależy dla jakiego środowiska chcemy skompilować biblioteki (musi być ten sam kompilator).
  5. Po kliknięciu configure mamy wybór, czy chcemy zainstalować bibliotekę w systemie, czy tylko zbudować:
    1. Jeśli zainstalować warto ustawić CMAKE_INSTALL_PREFIX
    2. Jeśli tylko zbudować należy odznaczyć: INSTALL_GTEST
  6. Klikamy Generate.
  7. Wchodzimy do katalogu, który ustawiliśmy na ścieżkę do zbudowania i w nim musimy dokończyć budowę. Przykładowo jeśli budujemy dla MinGW to wołamy:
    mingw32-make -j4
    ten drugi argument jest opcjonalny, ale umożliwia zbudowanie przy pomocy wielu wątków.
  8. Gotowe! Teraz tylko wskazać ścieżki do includów, oraz do zbudowanej biblioteki (zależnie czy chcieliśmy instalować nasza bibliotekę, czy nie trzeba będzie wskazać liby ze ścieżki, gdzie zainstalowaliśmy, lub ze ścieżki budowania/libs).

 

 

PK UML: Wykłady

Terminy wykładów, zakres z książki Opus Magnum:

  1. 7 V, rozdziały 1*, 3, 4, 6, 8, 11, 12, 13
  2. 14 V, rozdziały 5, 14, 15, 16 (~pierwszy tom) + 18, 20, 21, 22
  3. 21 V, rozdziały 2, 5, 23, 25, 26, 27, 10*
  4. 28 V, rozdziały 9, 31, 32
  5. 4 VI, rozdziały 17, 30, kontenery STL i algorytmy uogólnione
  6. 11 VI – mgr Suchenia będzie nadrabiać swój jeden wykład z UMLa
    ja z kolei będę nadrabiał 20 VI
  7. 18 VI tutaj kolokwium z mojej części (ze wszystkich wykładów) na do 10 punktów
  8. 20 VI od 7:30 w sali A2, rozdziały 7, 19, 24, 37

Spis treści książki

*N – warto przy okazji tego wykładu przeczytać